Android仿微信图片浏览

Posted 嘴巴吃糖了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android仿微信图片浏览相关的知识,希望对你有一定的参考价值。

实现原理

自定义PopupWindow+RecyclerView+TouchImageView

PopupWindow与AlertDialog的区别

最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,十分灵活。
要生成一个PopupWindow最基本的三个条件是一定要设置的:

View contentView,int width, int height ;

少任意一个就不可能弹出来

PictureBrowsing

PictureBrowsing的布局文件 view_image.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <View
        android:id="@+id/bg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000"
        android:alpha="0"
        />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    <TextView
        android:id="@+id/tv_savePicture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_alignParentStart="true"
        android:textColor="@color/white"
        android:layout_marginTop="26dp"
        android:layout_marginRight="16dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:paddingTop="4dp"
        android:paddingBottom="4dp"
        android:text="保存图片"
        android:textSize="19dp"
        android:background="@drawable/bg_operator"
        />

    <ImageView
        android:id="@+id/cover"
        android:layout_width="0dp"
        android:layout_height="0dp"
        />
</FrameLayout>

重写PopupWindow里面放入一个横向的RecyclerView

完整代码比较简单,主要就是RecyclerView的使用

public class PictureBrowsing extends PopupWindow 

    private Context mContext;//上下文
    private View mParent;
    private View mBg;//背景图片
    private RecyclerView mRecyclerView;
    private ImageView mCover;//当前的图面

    private List<PictureBean> mList;
    private int mPosition;//当前的图面的位置
    private ActionListener mActionListener; //自定义点击接口

    private int recyclerViewCurrentPosition = -1; // RecyclerView当前前位置
    private TextView savePicture;//保存图片

  //构造函数
    public PictureBrowsing(Context context, View parent, List<PictureBean> bean) 
        mContext = context;
        mParent = parent;
        mList = new ArrayList<>();
        mList .addAll( bean);
        mPosition = 1;

        //设置布局
        setContentView(initView());
        //设置布局宽高
        setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
        //背景
        setBackgroundDrawable(new ColorDrawable());
        //点击外面销毁弹窗
        setOutsideTouchable(true);
        setClippingEnabled(false);
        setFocusable(true);
        //销毁事件监听
        setOnDismissListener(new OnDismissListener() 
            @Override
            public void onDismiss() 
                if (mActionListener != null) 
                    mActionListener.onImageDialogDismiss();
                
                mActionListener = null;
                mRecyclerView = null;
            
        );
    

//初始化RecyclerView
    private View initView() 
        View v = LayoutInflater.from(mContext).inflate(R.layout.view_image, null);
        mBg = v.findViewById(R.id.bg);
        mRecyclerView = v.findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
        mCover = v.findViewById(R.id.cover);
        //适配器
        PictureBrowsingAdapter adapter = new PictureBrowsingAdapter(mContext, mList);
        adapter.setActionListener(new PictureBrowsingAdapter.ActionListener() 
            @Override
            public void onImageClick() 
                dismiss();
            
        );
        mRecyclerView.setAdapter(adapter);
        if (mPosition >= 0 && mPosition < mList.size()) 
            mRecyclerView.scrollToPosition(mPosition);
        
        return v;
    

    public int getRecyclerViewCurrentPosition() 
        return recyclerViewCurrentPosition;
    

    public void show() 
       //PopupWindow弹出位置
        showAtLocation(mParent, Gravity.BOTTOM, 0, 0);
    

    public void setActionListener(ActionListener actionListener) 
        mActionListener = actionListener;
    
    //自定义点击接口
    public interface ActionListener 
        void onImageDialogDismiss();
    

PictureBrowsingAdapter

public class PictureBrowsingAdapter extends RecyclerView.Adapter<PictureBrowsingAdapter.Vh> 

    private Context mContext;
    private List<PictureBean> mList;//简单封装的实体类
    private LayoutInflater mInflater;//布局填充器
    private View.OnClickListener mOnClickListener;//点击监听
    private ActionListener mActionListener;  //自定义点击接口

    //传参_list
    public PictureBrowsingAdapter(Context context, List<PictureBean> list) 
        mContext=context;
        mList = new ArrayList<>();
        mList.addAll( list);
        mInflater = LayoutInflater.from(context);
        //销毁弹窗的点击事件,模仿微信,点击图片返回聊天界面
        mOnClickListener = new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                if(!ClickUtil.canClick())
                    return;
                
                if (mActionListener != null) 
                    mActionListener.onImageClick();
                
            
        ;
    

    @NonNull
    @Override
    public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
        return new Vh(mInflater.inflate(R.layout.item_im_chat_img, parent, false));
    

    @Override
    public void onBindViewHolder(@NonNull Vh vh, int position) 
        vh.setData(mList.get(position).getPicture());
    

    @Override
    public int getItemCount() 
        return mList.size();
    

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) 
        PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
        pagerSnapHelper.attachToRecyclerView(recyclerView);
    

    class Vh extends RecyclerView.ViewHolder 

       //初始化ImageView
        ImageView mImg;
        public Vh(View itemView) 
            super(itemView);

            mImg =itemView.findViewById(R.id.MyZoomImageView);
            mImg.setOnClickListener(mOnClickListener);

        
        //设置图片
        void setData(Bitmap bean) 
            mImg.setImageBitmap(bean);
        
    

    public void setActionListener(ActionListener actionListener) 
        mActionListener = actionListener;
    

    public interface ActionListener 
        void onImageClick();
    

条目的布局就一个ImageView item_im_chat_img

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
     >
    <ImageView
        android:id="@+id/MyZoomImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_3"
        />
</FrameLayout>

使用方法

PictureBrowsing mChatImageDialog = new PictureBrowsing(this, v,list);
mChatImageDialog.show();

作者:九狼
链接:https://juejin.cn/post/7034536824613634084

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

一、架构师筑基必备技能

1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……

二、Android百大框架源码解析

1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程

三、Android性能优化实战解析

  • 腾讯Bugly:对字符串匹配算法的一点理解
  • 爱奇艺:安卓APP崩溃捕获方案——xCrash
  • 字节跳动:深入理解Gradle框架之一:Plugin, Extension, buildSrc
  • 百度APP技术:Android H5首屏优化实践
  • 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
  • 携程:从智行 Android 项目看组件化架构实践
  • 网易新闻构建优化:如何让你的构建速度“势如闪电”?

四、高级kotlin强化实战

1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》

  • 从一个膜拜大神的 Demo 开始

  • Kotlin 写 Gradle 脚本是一种什么体验?

  • Kotlin 编程的三重境界

  • Kotlin 高阶函数

  • Kotlin 泛型

  • Kotlin 扩展

  • Kotlin 委托

  • 协程“不为人知”的调试技巧

  • 图解协程:suspend

五、Android高级UI开源框架进阶解密

1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新库基本用法
4.LoadSir-高效易用的加载反馈页管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图)
7.hellocharts-android使用指南
8.SmartTable使用指南
9.开源项目android-uitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南

六、NDK模块开发

1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习

七、Flutter技术进阶

1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)

八、微信小程序开发

1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……

全套视频资料:

一、面试合集

二、源码解析合集


三、开源框架合集


欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓

以上是关于Android仿微信图片浏览的主要内容,如果未能解决你的问题,请参考以下文章

Android高仿微信图片选择上传工具

Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

Android 仿微信聊天图片

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

Android高仿微信图片选择上传工具