我和你们一样,只是菜鸟,有问题的话帮我指正一下,谢谢
先来个图吧
真机测试,这只是一个demo,有点糙
解决图库的显示,中间碰到的问题
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(); } } }