我和你们一样,只是菜鸟,有问题的话帮我指正一下,谢谢


先来个图吧

真机测试,这只是一个demo,有点糙

android 实现图库显示,ImageView宽高相等   android 实现图库显示,ImageView宽高相等


解决图库的显示,中间碰到的问题

1.保持图片的高度与宽度相等,而图片宽度度这里为(getMeasureSpec-margin-padding)/numColumns

2.如何流畅的显示大量图片

第一个问题:

整体图库布局使用的是GridView

在设置imageView参数时,调用这段代码

public void setViewHeightByWidth(ImageView view) {
    final ImageView mv = view;
    final ViewTreeObserver observer = mv.getViewTreeObserver();


    final ViewTreeObserver.OnPreDrawListener preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {

            int width = mv.getMeasuredWidth();
            int height = mv.getMeasuredHeight();

            Log.i("小半", "width" + width);
            Log.i("小半", "height" + height);

            android.view.ViewGroup.LayoutParams lp = mv.getLayoutParams();
            lp.height = mv.getMeasuredWidth();
            mv.setLayoutParams(lp);

            final ViewTreeObserver vto1 = mv.getViewTreeObserver();

            //调用一次之后移除,不影响性能
            vto1.removeOnPreDrawListener(this);


            return true;
        }
    };

    observer.addOnPreDrawListener(preDrawListener);
}


具体这段代码的理解看下面这个链接

https://link.jianshu.com/?t=https%3A%2F%2Fjuejin.im%2Fpost%2F58e4397a44d904006d275eeb


第二个问题

 这个破问题当初很是让我这个新手头疼

网上找到的看的图片方法大部分都不适用,比如图片滑动卡顿,就这一项就直接宣判死刑,只能把目光放到优秀的工具类上面

优秀的开源工具类众多,我只试用了其中两项

   Glide和 Picasso

相比之下,更喜欢Glide, 傻瓜式开发谁不喜欢

Picasso 在滑动加载图片最后,图片显示出现卡顿,甚至出不来的情况,不知道是使用有问题还是其他原因。

Glide.with(PhotoShowActivity.this)
        .load(mImageList.get(position))
        .apply(new RequestOptions().centerCrop())
        .into(iv_picture);

显示图片的话就这么一小段代码,解决了研究几天的问题,(保持微笑)

           PhotoShowActivity.this   Context环境

          mImageList.get(position)  本地图片uri

          iv_picture    ImageView对象啦





下面贴代码

    

public class PhotoShowActivity extends AppCompatActivity {

    //查询出来的所有图片uri
    private ArrayList<String> mImageList;
    //选中的返回数据
    private ArrayList<String> mReturnData;
    //当有数据的话点击两次返回
    private boolean firstReturn = true;
    private int maxSelectCount;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photoshow);

        //我这里设置了最大选择图片数,是上一个activity传过来的
        //再将选择后的图片传回去
        maxSelectCount = getBundleData();


        mReturnData = new ArrayList<>();

        //获取本地图片uri
        mImageList = QueryPhoto();
        //图片处理,压缩
        setGridView();


        findViewById(R.id.ib_photoShow_back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mReturnData.size() > 0) {
                    onBackPressed();
                } else {
                    finish();
                }
            }
        });

        findViewById(R.id.btn_photoShow_finish).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putStringArrayList("SelectImage", mReturnData);
                intent.putExtra("Bundle", bundle);
                PhotoShowActivity.this.setResult(RESULT_OK, intent);
                Toast.makeText(PhotoShowActivity.this, "数据返回", Toast.LENGTH_SHORT).show();
                finish();

            }
        });
    }

    private void setGridView() {
        GridView mGridVeiw = findViewById(R.id.gv_photoShow_imageList);
        PhotoShowAdapter adapter = new PhotoShowAdapter();
        mGridVeiw.setAdapter(adapter);


    }

    private ArrayList<String> QueryPhoto() {
        ArrayList<String> list = new ArrayList<>();

        Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentResolver mContentResolver = PhotoShowActivity.this
                .getContentResolver();

        Cursor mCursor = mContentResolver.query(mImageUri, null,
                MediaStore.Images.Media.MIME_TYPE + "=? or "
                        + MediaStore.Images.Media.MIME_TYPE + "=?",
                new String[]{"image/jpeg", "image/png"},
                MediaStore.Images.Media.DATE_MODIFIED);
        if (mCursor != null) {
            while (mCursor.moveToNext()) {
                // 获取图片的路径
                String path = mCursor.getString(mCursor
                        .getColumnIndex(MediaStore.Images.Media.DATA));
                list.add(path);
            }
            mCursor.close();
        }

        return list;

    }

    public int getBundleData() {
        //传过来还能选择的最大数量
        Intent intent = getIntent();
        Bundle bundle = intent.getBundleExtra("Bundle");
        return bundle.getInt("maxCount");
    }

    public void setViewWidthByHeight(ImageView view) {
        final ImageView mv = view;
        final ViewTreeObserver observer = mv.getViewTreeObserver();


        final ViewTreeObserver.OnPreDrawListener preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
            public boolean onPreDraw() {

                int width = mv.getMeasuredWidth();
                int height = mv.getMeasuredHeight();

                Log.i("小半", "width" + width);
                Log.i("小半", "height" + height);

                android.view.ViewGroup.LayoutParams lp = mv.getLayoutParams();
                lp.height = mv.getMeasuredWidth();
                mv.setLayoutParams(lp);

                final ViewTreeObserver vto1 = mv.getViewTreeObserver();

                //调用一次之后移除,不影响性能
                vto1.removeOnPreDrawListener(this);


                return true;
            }
        };

        observer.addOnPreDrawListener(preDrawListener);
    }

    class PhotoShowAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return mImageList.size();
        }

        @Override
        public Object getItem(int position) {
            return mImageList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view;
            final ViewHolder viewHolder;
            if (convertView == null) {
                LayoutInflater from = LayoutInflater.from(PhotoShowActivity.this);
                view = from.inflate(R.layout.item_publishinfo_image, parent, false);
                viewHolder = new ViewHolder();
            } else {
                view = convertView;
                viewHolder = (ViewHolder) view.getTag();
            }

            viewHolder.imageView = view.findViewById(R.id.iv_publishImage_picture);
            viewHolder.checkBox = view.findViewById(R.id.cb_publishImage_select);


            setViewWidthByHeight(viewHolder.imageView);//通过宽设置高,保持长宽一致

            //图片点击放大,PhotoZoomAztivity未贴出,只是一个放大显示功能
            viewHolder.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(PhotoShowActivity.this, PhotoZoomActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("ImageZoom", mImageList.get(position));
                    intent.putExtra("Bundle", bundle);
                    startActivity(intent);
                }
            });

            Glide.with(PhotoShowActivity.this)
                    .load(mImageList.get(position))
                    .apply(new RequestOptions().centerCrop())
                    .into(viewHolder.imageView);

            viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        if (mReturnData.size() == maxSelectCount) {
                            viewHolder.checkBox.setChecked(false);
                            Toast.makeText(PhotoShowActivity.this, "超过最大选择数", Toast.LENGTH_SHORT).show();
                        } else {
                            mReturnData.add(mImageList.get(position));
                        }
                    } else {
                        if (mReturnData.contains(mImageList.get(position))) {
                            mReturnData.remove(mImageList.get(position));
                        }
                    }
                }
            });

            view.setTag(viewHolder);
            return view;
        }
    }

    private class ViewHolder {
        private ImageView imageView;
        private CheckBox checkBox;
    }
    
    

    @Override
    public void onBackPressed() {
        if (!firstReturn) {
            super.onBackPressed();
        } else {
            firstReturn = false;
            Toast.makeText(PhotoShowActivity.this, "数据未保存,再点击一次返回", Toast.LENGTH_SHORT).show();
        }

    }
}

 




相关文章: