[关闭]
@TryLoveCatch 2022-05-05T16:40:56.000000Z 字数 1323 阅读 1875

Android知识体系之超大图片处理

Android知识体系


需求

需要显示一个横向长图,可以左右滑动显示图片其他部分

BitmapRegionDecoder

BitmapRegionDecoder这个可以用来解决超大图片显示OOM的问题,decodeRegion(Rect rect, BitmapFactory.Options options)这个方法可以选择加载图片的某一区域,根据rect范围来裁剪图片,并加载进来,利用这个方法可以将一张图片切割成很多小图。

主要代码

  1. public void moveBy(int pMoveX, int pMoveY){
  2. mRect.offset(pMoveX, pMoveY);
  3. checkHeight();
  4. checkWidth();
  5. invalidate();
  6. }
  7. @Override
  8. protected void onDraw(Canvas canvas) {
  9. super.onDraw(canvas);
  10. Bitmap tBmp = mDecoder.decodeRegion(mRect, mOptions);
  11. Log.e("largeimagedemo", "===========" + mRect.left + ", " + mRect.right);
  12. canvas.drawBitmap(tBmp, 0, 0, null);
  13. }

传入需要移动的距离,动态调整rect的值,然后刷新当前View,在onDraw()里面调用BitmapRegionDecoder.decodeRegion截取需要显示的图片区域。

  1. mLargeImageView.setOnTouchListener(new View.OnTouchListener() {
  2. int mLastX;
  3. int mLastY;
  4. @Override
  5. public boolean onTouch(View v, MotionEvent event) {
  6. switch (event.getAction()){
  7. case MotionEvent.ACTION_DOWN:
  8. mLastX = (int)event.getX();
  9. mLastY = (int)event.getY();
  10. break;
  11. case MotionEvent.ACTION_MOVE:
  12. int tMoveX = mLastX - (int)event.getX();
  13. int tMoveY = mLastY - (int)event.getY();
  14. mLargeImageView.moveBy(tMoveX - mLastMoveX, tMoveY - mLastMoveY);
  15. mLastMoveX = tMoveX;
  16. mLastMoveY = tMoveY;
  17. break;
  18. case MotionEvent.ACTION_UP:
  19. mLastMoveX = 0;
  20. mLastMoveY = 0;
  21. break;
  22. }
  23. return true;
  24. }
  25. });

重写View的setOnTouchListener()方法,计算手指移动的距离,调用上面的moveBy(),来实现Image的移动。

效果如下

代码地址

largeImageDemo

Demo下载

Demo下载

参考

Android 高清加载巨图方案 拒绝压缩图片
LargeImage
Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注