zoukankan      html  css  js  c++  java
  • PhotoPickerDemo【PhotoPicker0.9.8的个性化修改以及使用(内部glide版本号是3.7.0)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处!

    前言

    本Demo使用的是PhotoPicker 0.9.8版本,属于比较旧的版本,里面集成的glide版本号是3.7.0。本篇文章主要是留作记录。

    在项目中使用建议使用《PhotoPickerNewDemo【PhotoPicker0.9.12的个性化修改以及使用(内部glide版本号是4.1.1)】

    效果图

        

    代码分析

    在原有的代码基础上根据实际项目需求进行了部分修改:

    1、对MediaStoreHelper进行了优化【解决dialogFragment中显示问题】

    2、添加NewImagePagerDialogFragment.java【和ImagePagerFragment.java代码类似,不同的是多了顶部导航栏】【用于独立出来进行图片预览对话框】

    3、添加NewPhotoPickerFragment.java【基本上等同于PhotoPickerFragment,但是区别在于预览图片打开的是NewImagePagerDialogFragment,而且多了一个状态值:是否全屏显示预览界面】【用于独立出来作为Fragment集成到自定义Activity中】

    4、修改颜色、高度和替换部分图片

    使用步骤

    一、项目组织结构图

    注意事项:

    1、  导入类文件后需要change包名以及重新import R文件路径

    2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

    二、导入步骤

    (1)将PhotoPicker导入到项目中

    (2)解决Plugin with id 'com.novoda.bintray-release' not found.问题

    在项目的build.gradle文件中添加以下代码

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    
    buildscript {
        
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.1'
            //解决PhotoPicker的Plugin with id 'com.novoda.bintray-release' not found.
            classpath 'com.novoda:bintray-release:0.5.0'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }

    三、使用方法

    (1)在app的build.gradle文件中引用photopicker

    因为Demo中使用到了RecyclerVIew,所以还需要在app的build.gradle文件中引用recyclerview【版本号和appcompat保持一致

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 27
        defaultConfig {
            applicationId "com.why.project.photopickerdemo"
            minSdkVersion 16
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'com.android.support.constraint:constraint-layout:1.1.2'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
        //photopicker
        implementation project(':PhotoPicker')
        
        //RecyclerView
        compile 'com.android.support:recyclerview-v7:27.1.1'
        
    }

    (2)演示调用写法

    1、在项目中实现Recyclerview基本数据展现【比较简单,省略】【或者参考《Android快速开发常用知识点系列目录》下的RecyclerView篇章相关文章】

    注意:因为PhotoPicker中已经引用了Glide3.7.0,所以PictureAdapter.java中可以直接使用Glide

    package com.why.project.photopickerdemo.adapter;
    
    import android.content.Context;
    import android.net.Uri;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.Priority;
    import com.bumptech.glide.load.engine.DiskCacheStrategy;
    import com.why.project.photopickerdemo.R;
    import com.why.project.photopickerdemo.bean.PictureBean;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by HaiyuKing
     * Used 照片网格适配器
     */
    
    public class PictureAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    
        private static final String TAG = PictureAdapter.class.getSimpleName();
    
        /**上下文*/
        private Context myContext;
        /**自定义列表项标题集合*/
        private ArrayList<PictureBean> listitemList;
    
        final static int TYPE_ADD = 1;
        final static int TYPE_PHOTO = 2;
    
        public final static int MAX = 15;//总数目,这里根据实际情况设置,设置100基本上表明无限制了
    
        /*
        * 构造函数
        */
        public PictureAdapter(Context context, ArrayList<PictureBean> itemlist) {
            myContext = context;
            listitemList = itemlist;
        }
    
        /**
         * 获取总的条目数
         */
        @Override
        public int getItemCount() {
            Log.w(TAG,"{getItemCount}listitemList.size()="+listitemList.size());
            int count = listitemList.size();
            if (count > MAX) {
                count = MAX;
            }
            count = count + 1;
            return count;
        }
    
        @Override
        public int getItemViewType(int position) {
            Log.w(TAG,"{getItemViewType}position="+position);
            Log.w(TAG,"{getItemViewType}listitemList.size()="+listitemList.size());
            return (position == listitemList.size()) ? TYPE_ADD : TYPE_PHOTO;
        }
    
        /**
         * 创建ViewHolder
         */
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(viewType == TYPE_ADD) {
                View viewfoot = LayoutInflater.from(myContext).inflate(R.layout.pic_grid_foot_item, parent, false);
                ItemFootViewHolder itemfootViewHolder = new ItemFootViewHolder(viewfoot);
                return itemfootViewHolder;
            } else if(viewType == TYPE_PHOTO) {
                View view = LayoutInflater.from(myContext).inflate(R.layout.pic_grid_item, parent, false);
                ItemViewHolder itemViewHolder = new ItemViewHolder(view);
                return itemViewHolder;
            }
            return null;
        }
    
        /**
         * 声明列表项ViewHolder*/
        static class ItemViewHolder extends RecyclerView.ViewHolder
        {
            public ItemViewHolder(View view)
            {
                super(view);
                griditemLayout = (LinearLayout) view.findViewById(R.id.griditemLayout);
                griditemimgLayout = (RelativeLayout) view.findViewById(R.id.griditemimgLayout);
                grid_img = (ImageView) view.findViewById(R.id.grid_img);
                grid_img_state = (TextView) view.findViewById(R.id.grid_img_state);
            }
    
            LinearLayout griditemLayout;
            RelativeLayout griditemimgLayout;
            ImageView grid_img;
    
            TextView grid_img_state;
        }
    
        /**
         * 声明最后一个ViewHolder*/
        static class ItemFootViewHolder extends RecyclerView.ViewHolder
        {
            public ItemFootViewHolder(View view)
            {
                super(view);
                gridfootitemLayout = (RelativeLayout) view.findViewById(R.id.gridfootitemLayout);
            }
            RelativeLayout gridfootitemLayout;
        }
    
        /**
         * 将数据绑定至ViewHolder
         */
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int index) {
    
            if(viewHolder instanceof ItemViewHolder){
                PictureBean listItemModel = listitemList.get(index);
                final ItemViewHolder itemViewHold = ((ItemViewHolder)viewHolder);
    
                Uri uri = Uri.fromFile(new File(listItemModel.getPicPath()));
    
                Glide.with(myContext)
                        .load(uri)
                        //设置等待时的图片
                        .placeholder(R.drawable.img_loading)
                        //设置加载失败后的图片显示
                        .error(R.drawable.img_error)
                        //默认淡入淡出动画
                        .crossFade()
                        //缓存策略,跳过内存缓存【此处应该设置为false,否则列表刷新时会闪一下】
                        .skipMemoryCache(false)
                        //缓存策略,硬盘缓存-仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        //设置图片加载的优先级
                        .priority(Priority.HIGH)
                        .into(itemViewHold.grid_img);
    
                itemViewHold.grid_img_state.setText("(" + (index+1) + "/" + listitemList.size() + ")");
    
                //如果设置了回调,则设置点击事件
                if (mOnItemClickLitener != null)
                {
                    itemViewHold.grid_img.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            int position = itemViewHold.getLayoutPosition();//在增加数据或者减少数据时候,position和index就不一样了
                            mOnItemClickLitener.onItemClick(view,position);
                        }
                    });
                }
            }else if(viewHolder instanceof ItemFootViewHolder){
                final ItemFootViewHolder itemFootViewHold = ((ItemFootViewHolder)viewHolder);
                //如果设置了回调,则设置点击事件
                if (mOnItemClickLitener != null)
                {
                    itemFootViewHold.gridfootitemLayout.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            mOnItemClickLitener.onItemAddClick();
                        }
                    });
                }
            }
    
        }
    
        /**
         * 添加Item--用于动画的展现*/
        public void addItem(int position,PictureBean itemModel) {
            listitemList.add(position,itemModel);
            notifyItemInserted(position);
        }
        /**
         * 删除Item--用于动画的展现*/
        public void removeItem(int position) {
            listitemList.remove(position);
            notifyItemRemoved(position);
        }
    
        /*=====================添加OnItemClickListener回调================================*/
        public interface OnItemClickLitener
        {
            /**图片的点击事件*/
            void onItemClick(View view,int position);
            /**添加的点击事件*/
            void onItemAddClick();
        }
    
        private OnItemClickLitener mOnItemClickLitener;
    
        public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
        {
            this.mOnItemClickLitener = mOnItemClickLitener;
        }
    
        //返回当前图片集合的所有路径集合【用于预览】
        public List<String> getAllPhotoPaths() {
            List<String> allPhotoPaths = new ArrayList<String>(listitemList.size());
            for (PictureBean  pictureBean: listitemList) {
                allPhotoPaths.add(pictureBean.getPicPath());
            }
            return allPhotoPaths;
        }
    
    }

    2、在代码中调用【橙色标记的是recyclerView常规写法黄色标记的是PhotoPicker的调用绿色标记是打开自定义图片预览对话框NewImagePagerDialogFragment紫色标记的是自定义选图对话框界面

    package com.why.project.photopickerdemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import com.why.project.photopickerdemo.adapter.PictureAdapter;
    import com.why.project.photopickerdemo.bean.PictureBean;
    import com.why.project.photopickerdemo.utils.Globals;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import me.iwf.photopicker.PhotoPicker;
    import me.iwf.photopicker.fragment.NewImagePagerDialogFragment;
    import me.iwf.photopicker.utils.PermissionsUtils;
    
    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = MainActivity.class.getSimpleName();
    
        private RecyclerView mRecyclerView;
        private ArrayList<PictureBean> mPictureBeansList;
        private PictureAdapter mPictureAdapter;
    
        private ArrayList<String> selPhotosPath = null;//选中的图片路径集合
    
        private Button mOpenPicDialog;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initViews();
            initDatas();
            initEvents();
        }
    
        private void initViews() {
            mRecyclerView = findViewById(R.id.picture_grid);
            mOpenPicDialog = findViewById(R.id.btn_openPicDialog);
        }
    
        private void initDatas() {
            selPhotosPath = new ArrayList<String>();
            //=============图片九宫格=========================
            mPictureAdapter = null;
            mPictureBeansList = new ArrayList<PictureBean>();
            //设置布局管理器
            GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
            mRecyclerView.setLayoutManager(gridLayoutManager);
    
            if(mPictureAdapter == null){
                //设置适配器
                mPictureAdapter = new PictureAdapter(this, mPictureBeansList);
                mRecyclerView.setAdapter(mPictureAdapter);
                //添加分割线
                //设置添加删除动画
                //调用ListView的setSelected(!ListView.isSelected())方法,这样就能及时刷新布局
                mRecyclerView.setSelected(true);
            }else{
                mPictureAdapter.notifyDataSetChanged();
            }
        }
    
        private void initEvents() {
            //图片九宫格点击事件
            mPictureAdapter.setOnItemClickLitener(new PictureAdapter.OnItemClickLitener() {
                @Override
                public void onItemClick(View v,int position) {
                    //打开自定义的图片预览对话框
                    List<String> photos = mPictureAdapter.getAllPhotoPaths();
    
                    int[] screenLocation = new int[2];
                    v.getLocationOnScreen(screenLocation);
    
                    NewImagePagerDialogFragment newImagePagerDialogFragment = NewImagePagerDialogFragment.getInstance(MainActivity.this,photos,position,screenLocation, v.getWidth(),
                            v.getHeight(),false);
                    newImagePagerDialogFragment.show(getSupportFragmentManager(),"preview img");
                }
    
                @Override
                public void onItemAddClick() {
                    PhotoPicker.builder()
                            .setPhotoCount(mPictureAdapter.MAX)
                            .setGridColumnCount(3)
                            //.setSelected(selPhotosPath)
                            .start(MainActivity.this, Globals.CHOOSE_PIC_REQUEST_CODE);
                }
            });
    
            //按钮的点击事件
            mOpenPicDialog.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (PermissionsUtils.checkReadStoragePermission(MainActivity.this)) {//调用PhotoPicker中的运行时权限申请工具类,在这里也可以使用其他运行时权限申请库
                        Bundle bundle = new Bundle();
                        bundle.putInt(SelectPictureDialog.EXTRA_MAX_COUNT, 1);
                        SelectPictureDialog selectPictureDialog = SelectPictureDialog.getInstance(MainActivity.this, bundle);
                        selectPictureDialog.setOnSelPicDialogConfirmClickListener(new SelectPictureDialog.OnSelPicDialogConfirmClickListener() {
                            @Override
                            public void onConfirmClick(ArrayList<PictureBean> selectedPhotoList) {
                                String path = "";
                                if (selectedPhotoList.size() > 0) {
                                    path = selectedPhotoList.get(0).getPicPath();
                                }
                                Toast.makeText(MainActivity.this, "path=" + path, Toast.LENGTH_SHORT).show();
                            }
                        });
                        selectPictureDialog.show(getSupportFragmentManager(), "previewWithScreen");
                    }
                }
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            Log.w(TAG, "{onActivityResult}resultCode="+resultCode);
            Log.w(TAG, "{onActivityResult}requestCode="+requestCode);
            if (resultCode == Activity.RESULT_OK) {
                //选择照片
                if(requestCode == Globals.CHOOSE_PIC_REQUEST_CODE){
    
                    if (data != null) {
                        selPhotosPath = data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS);
                    }
                    if (selPhotosPath != null) {
    
                        //下面的代码主要用于这样一个场景,就是注释了.setSelected(selPhotosPath)之后,还想要保证选择的图片不重复
                        /*for(String path : selPhotosPath){
                            Log.w(TAG,"path="+path);///storage/emulated/0/tempHxzk/IMG_1498034535796.jpg
                            boolean existThisPic = false;
                            for(int i=0;i<mPictureBeansList.size();i++){
                                if(path.equals(mPictureBeansList.get(i).getPicPath())){
                                    //如果新选择的图片集合中存在之前选中的图片,那么跳过去
                                    existThisPic = true;
                                    break;
                                }
                            }
                            if(! existThisPic){
                                PictureBean pictureBean = new PictureBean();
                                pictureBean.setPicPath(path);
                                pictureBean.setPicName(getFileName(path));
                                //去掉总数目的限制,这里通过增大MAX的数字来实现
                                if (mPictureBeansList.size() < mPictureAdapter.MAX) {
                                    mPictureBeansList.add(pictureBean);
                                } else {
                                    Toast.makeText(MainActivity.this, "最多可以选择" + mPictureAdapter.MAX + "张图片", Toast.LENGTH_SHORT).show();
                                    break;
                                }
                            }
                        }*/
    
                        //是常规操作,和上面的代码不可共存
                        for (String path : selPhotosPath) {
                            PictureBean pictureBean = new PictureBean();
                            pictureBean.setPicPath(path);
                            pictureBean.setPicName(Globals.getFileName(path));
                            //去掉总数目的限制,这里通过增大MAX的数字来实现
                            if (mPictureBeansList.size() < mPictureAdapter.MAX) {
                                mPictureBeansList.add(pictureBean);
                            } else {
                                Toast.makeText(MainActivity.this, "最多可以选择" + mPictureAdapter.MAX + "张图片", Toast.LENGTH_SHORT).show();
                                break;
                            }
                        }
                        mPictureAdapter.notifyDataSetChanged();
                    }
                }
            }
        }
    
    }

    3、SelectPictureDialog中主要集成了NewPhotoPickerFragment,这里只是一个简单的写法,本来是有一个选项卡功能的,这里做了简化

    package com.why.project.photopickerdemo;
    
    import android.content.Context;
    import android.graphics.drawable.ColorDrawable;
    import android.os.Bundle;
    import android.support.v4.app.DialogFragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.why.project.photopickerdemo.bean.PictureBean;
    import com.why.project.photopickerdemo.utils.Globals;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import me.iwf.photopicker.fragment.NewPhotoPickerFragment;
    
    /**
     * Created by HaiyuKing
     * Used 选择图片对话框
     */
    
    public class SelectPictureDialog extends DialogFragment {
        private static final String TAG = SelectPictureDialog.class.getSimpleName();
    
        /**View实例*/
        private View myView;
        /**context实例*/
        private Context mContext;
        /**标记:用来代表是从哪个界面打开的这个对话框*/
        private String mTag;
    
        /**完成文本*/
        private TextView mConfirmTv;
    
        public static final String EXTRA_MAX_COUNT = "maxCount";
        public static final int DEFAULT_MAX_COUNT = 1;//默认只能选择一个图片
    
        private boolean previewEnabled = true;//是否可预览
        private boolean showGif = false;//是否显示gif
        private int columnNumber = 3;//一行显示多少列
        private int maxCount = 1;//最大可选择的数目
        private Boolean fullscreen = false;//是否全屏展现预览界面的标志
    
        private FragmentManager fragmentManager;//碎片管理器
        private NewPhotoPickerFragment mLocalPicFragment;
    
        public static SelectPictureDialog getInstance(Context mContext, Bundle bundle)
        {
            SelectPictureDialog selectPictureDialog = new SelectPictureDialog();
            selectPictureDialog.mContext = mContext;
            selectPictureDialog.maxCount = bundle.getInt(EXTRA_MAX_COUNT,DEFAULT_MAX_COUNT);
    
            return selectPictureDialog;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.w(TAG,"{onCreate}");
    
            setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_NoTitleBar_Fullscreen);//全屏(在状态栏底下)
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            Log.w(TAG,"{onCreateView}");
    
            getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0));//设置背景为透明,并且没有标题
            getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
            //设置窗体全屏
            getDialog().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
            myView = inflater.inflate(R.layout.dialog_select_picture, container, false);
            return myView;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onActivityCreated(savedInstanceState);
            Log.w(TAG,"{onActivityCreated}");
    
            //初始化控件以及设置
            initView();
            //初始化数据
            initDatas();
            //初始化事件
            initEvent();
    
            //初始化碎片管理器
            fragmentManager = getChildFragmentManager();//必须使用getChildFragmentManager,否则子Fragment中无法使用getParentFragment获取父fragment
    
        }
    
        /**
         * 设置宽度和高度值,以及打开的动画效果
         */
        @Override
        public void onStart() {
            super.onStart();
            if(mTag.equals("previewWithScreen")){//对话框全屏显示,预览图片也是全屏显示
                fullscreen = true;
                //设置对话框的宽高,必须在onStart中
                Window window = this.getDialog().getWindow();
                window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//全屏(盖住状态栏)
                window.setGravity(Gravity.BOTTOM);//设置在底部
                //打开的动画效果--缩放+渐隐
            }else{
                fullscreen = false;
                //设置对话框的宽高,必须在onStart中
                DisplayMetrics metrics = new DisplayMetrics();
                this.getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
                Window window = this.getDialog().getWindow();
                window.setLayout(metrics.widthPixels, metrics.heightPixels - getStatusBarHeight(mContext));
                window.setGravity(Gravity.BOTTOM);//设置在底部
                //打开的动画效果--缩放+渐隐
            }
        }
    
        /**获取状态栏的高度*/
        private int getStatusBarHeight(Context context) {
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            return context.getResources().getDimensionPixelSize(resourceId);
        }
    
        @Override
        public void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            ShowFragment();
        }
    
        private void initView() {
            mConfirmTv = (TextView) myView.findViewById(R.id.nav_selpic_edit_save);
        }
    
        private void initDatas() {
            mTag = this.getTag();
        }
    
        private void initEvent() {
            //完成图标
            mConfirmTv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //返回界面,并传递值回去
                    ArrayList<PictureBean> selectedPhotoList = new ArrayList<PictureBean>();
    
                    if(maxCount <= 1){
                        ArrayList<String> selectedPhotos = new ArrayList<String>();
                        if(mLocalPicFragment != null) {
                            selectedPhotos = mLocalPicFragment.getPhotoGridAdapter().getSelectedPhotoPaths();
                        }
                        String imgPath = selectedPhotos.get(0);
                        PictureBean pictureBean = new PictureBean();
                        pictureBean.setPicPath(imgPath);
                        pictureBean.setPicName(Globals.getFileName(imgPath));
                        selectedPhotoList.add(pictureBean);
                    }else{
                        ArrayList<String> selectedPhotos = new ArrayList<String>();
                        if(mLocalPicFragment != null) {
                            selectedPhotos = mLocalPicFragment.getPhotoGridAdapter().getSelectedPhotoPaths();
                        }
                        for(String path : selectedPhotos){
                            PictureBean pictureBean = new PictureBean();
                            pictureBean.setPicPath(path);
                            pictureBean.setPicName(Globals.getFileName(path));
                            selectedPhotoList.add(pictureBean);
                        }
                    }
    
                    backWithResult(selectedPhotoList);
                }
            });
            //刚开始设置不可点击【必须在setOnclick事件之后,否则不起作用】
            changeConfirmState(false);
        }
    
        private void ShowFragment() {
            //开启一个事务
            FragmentTransaction transcation = fragmentManager.beginTransaction();
            if(mLocalPicFragment == null){
                mLocalPicFragment = NewPhotoPickerFragment.getInstance(true, showGif, previewEnabled, columnNumber, maxCount, null,fullscreen);
                initLocalFragmentAdapterItemCheckListener();//初始化本地图片碎片界面的列表项的复选框图标点击事件
                transcation.add(R.id.center_layout, mLocalPicFragment);
            }else{
                transcation.show(mLocalPicFragment);
            }
            transcation.commitAllowingStateLoss();
        }
    
        //本地图片的选择监听
        private void initLocalFragmentAdapterItemCheckListener() {
            //本地图片的选择的监听事件
            mLocalPicFragment.setOnOnLocalPhotoCheckListener(new NewPhotoPickerFragment.OnLocalPhotoCheckListener() {
                @Override
                public boolean onItemCheck(int position, String imgId, String imgName, String imgPath, int selectedItemCount) {
                    //如果选中的数目小于0,则顶部导航栏右侧的完成文本,不可点击
                    if(selectedItemCount > 0){
                        changeConfirmState(true);
                    }else{
                        changeConfirmState(false);
                    }
    
                    //如果单选,那么选中的图片路径集合肯定只有一个
                    if (maxCount <= 1) {
                        List<String> photos = mLocalPicFragment.getPhotoGridAdapter().getSelectedPhotos();
                        if (!photos.contains(imgPath)) {//如果点击的当前选中的图片,则取消选中状态
                            photos.clear();//清空选中的图片集合
                            mLocalPicFragment.getPhotoGridAdapter().notifyDataSetChanged();
                        }
                        return true;
                    }
    
                    if (selectedItemCount > maxCount) {
                        Toast.makeText(mContext,getString(R.string.over_max_count_tips, maxCount),Toast.LENGTH_SHORT).show();
                        return false;
                    }
                    mConfirmTv.setText(getString(R.string.done_with_count, selectedItemCount, maxCount));//更改导航栏右侧的 完成(1/9)
                    return true;
                }
            });
        }
    
        //更换完成文本的点击状态
        private void changeConfirmState(boolean canClick){
            if(canClick){
                mConfirmTv.setClickable(true);
                mConfirmTv.setTextColor(getResources().getColor(R.color.nav_done_text_color));
            }else{
                mConfirmTv.setClickable(false);
                mConfirmTv.setTextColor(getResources().getColor(R.color.nav_done_ennable_text_color));
            }
        }
    
    
        private void backWithResult(ArrayList<PictureBean> photosList) {
            dismiss();
            if(mOnSelPicDialogConfirmClickListener != null){
                mOnSelPicDialogConfirmClickListener.onConfirmClick(photosList);
            }
        }
    
        /*=====================添加OnConfirmClickListener回调================================*/
        private OnSelPicDialogConfirmClickListener mOnSelPicDialogConfirmClickListener;
    
        public void setOnSelPicDialogConfirmClickListener(OnSelPicDialogConfirmClickListener mOnSelPicDialogConfirmClickListener)
        {
            this.mOnSelPicDialogConfirmClickListener = mOnSelPicDialogConfirmClickListener;
        }
    
        public interface OnSelPicDialogConfirmClickListener {
            void onConfirmClick(ArrayList<PictureBean> selectedPhotoList);
        }
    }

    混淆配置

    # PhotoPicker混淆
    # Glide
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
        **[] $VALUES;
        public *;
    }
    # support-v7-appcompat
    -keep public class android.support.v7.widget.** { *; }
    -keep public class android.support.v7.internal.widget.** { *; }
    -keep public class android.support.v7.internal.view.menu.** { *; }
    -keep public class * extends android.support.v4.view.ActionProvider {
        public <init>(android.content.Context);
    }
    # support-design
    -dontwarn android.support.design.**
    -keep class android.support.design.** { *; }
    -keep interface android.support.design.** { *; }
    -keep public class android.support.design.R$* { *; }

    参考资料

    donglua/PhotoPicker

    项目demo下载地址

    https://github.com/haiyuKing/PhotoPickerDemo

  • 相关阅读:
    ResellerClub的域名接口
    爱上英语题库系统,郭雄飞
    多操作系统的服务器虚拟化详解 蓝色梦想网
    mylove温纯,给我的最爱
    LinkedIn 646万用户密码网上泄露及下载地址
    JavaScript对象系统的使用
    asp.net 中提交按钮的click事件
    js中this的使用
    js keycode 事件响应
    js form中的onsubmit和action
  • 原文地址:https://www.cnblogs.com/whycxb/p/9378098.html
Copyright © 2011-2022 走看看