Android · 2014年12月18日 0

Android 图片的浏览、缩放、拖动和自动居中

http://www.cnblogs.com/dwinter/archive/2012/01/12/2321082.html

Activity:

  1. /**
  2.  * 图片浏览、缩放、拖动、自动居中
  3.  */
  4. public class Touch extends Activity implements OnTouchListener {
  5.     Matrix matrix = new Matrix();
  6.     Matrix savedMatrix = new Matrix();
  7.     DisplayMetrics dm;
  8.     ImageView imgView;
  9.     Bitmap bitmap;
  10.     float minScaleR;// 最小缩放比例
  11.     static final float MAX_SCALE = 4f;// 最大缩放比例
  12.     static final int NONE = 0;// 初始状态
  13.     static final int DRAG = 1;// 拖动
  14.     static final int ZOOM = 2;// 缩放
  15.     int mode = NONE;
  16.     PointF prev = new PointF();
  17.     PointF mid = new PointF();
  18.     float dist = 1f;
  19.     @Override
  20.     public void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         setContentView(R.layout.scale);
  23.         imgView = (ImageView) findViewById(R.id.imag);// 获取控件
  24.         bitmap = BitmapFactory.decodeResource(getResources(), this.getIntent()
  25.                 .getExtras().getInt(“IMG”));// 获取图片资源
  26.         imgView.setImageBitmap(bitmap);// 填充控件
  27.         imgView.setOnTouchListener(this);// 设置触屏监听
  28.         dm = new DisplayMetrics();
  29.         getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率
  30.         minZoom();
  31.         center();
  32.         imgView.setImageMatrix(matrix);
  33.     }
  34.     /**
  35.      * 触屏监听
  36.      */
  37.     public boolean onTouch(View v, MotionEvent event) {
  38.         switch (event.getAction() & MotionEvent.ACTION_MASK) {
  39.         // 主点按下
  40.         case MotionEvent.ACTION_DOWN:
  41.             savedMatrix.set(matrix);
  42.             prev.set(event.getX(), event.getY());
  43.             mode = DRAG;
  44.             break;
  45.         // 副点按下
  46.         case MotionEvent.ACTION_POINTER_DOWN:
  47.             dist = spacing(event);
  48.             // 如果连续两点距离大于10,则判定为多点模式
  49.             if (spacing(event) > 10f) {
  50.                 savedMatrix.set(matrix);
  51.                 midPoint(mid, event);
  52.                 mode = ZOOM;
  53.             }
  54.             break;
  55.         case MotionEvent.ACTION_UP:
  56.         case MotionEvent.ACTION_POINTER_UP:
  57.             mode = NONE;
  58.             break;
  59.         case MotionEvent.ACTION_MOVE:
  60.             if (mode == DRAG) {
  61.                 matrix.set(savedMatrix);
  62.                 matrix.postTranslate(event.getX() – prev.x, event.getY()
  63.                         – prev.y);
  64.             } else if (mode == ZOOM) {
  65.                 float newDist = spacing(event);
  66.                 if (newDist > 10f) {
  67.                     matrix.set(savedMatrix);
  68.                     float tScale = newDist / dist;
  69.                     matrix.postScale(tScale, tScale, mid.x, mid.y);
  70.                 }
  71.             }
  72.             break;
  73.         }
  74.         imgView.setImageMatrix(matrix);
  75.         CheckView();
  76.         return true;
  77.     }
  78.     /**
  79.      * 限制最大最小缩放比例,自动居中
  80.      */
  81.     private void CheckView() {
  82.         float p[] = new float[9];
  83.         matrix.getValues(p);
  84.         if (mode == ZOOM) {
  85.             if (p[0] < minScaleR) {
  86.                 matrix.setScale(minScaleR, minScaleR);
  87.             }
  88.             if (p[0] > MAX_SCALE) {
  89.                 matrix.set(savedMatrix);
  90.             }
  91.         }
  92.         center();
  93.     }
  94.     /**
  95.      * 最小缩放比例,最大为100%
  96.      */
  97.     private void minZoom() {
  98.         minScaleR = Math.min(
  99.                 (float) dm.widthPixels / (float) bitmap.getWidth(),
  100.                 (float) dm.heightPixels / (float) bitmap.getHeight());
  101.         if (minScaleR < 1.0) {
  102.             matrix.postScale(minScaleR, minScaleR);
  103.         }
  104.     }
  105.     private void center() {
  106.         center(true, true);
  107.     }
  108.     /**
  109.      * 横向、纵向居中
  110.      */
  111.     protected void center(boolean horizontal, boolean vertical) {
  112.         Matrix m = new Matrix();
  113.         m.set(matrix);
  114.         RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
  115.         m.mapRect(rect);
  116.         float height = rect.height();
  117.         float width = rect.width();
  118.         float deltaX = 0deltaY = 0;
  119.         if (vertical) {
  120.             // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移
  121.             int screenHeight = dm.heightPixels;
  122.             if (height < screenHeight) {
  123.                 deltaY = (screenHeight – height) / 2 – rect.top;
  124.             } else if (rect.top > 0) {
  125.                 deltaY = -rect.top;
  126.             } else if (rect.bottom < screenHeight) {
  127.                 deltaY = imgView.getHeight() – rect.bottom;
  128.             }
  129.         }
  130.         if (horizontal) {
  131.             int screenWidth = dm.widthPixels;
  132.             if (width < screenWidth) {
  133.                 deltaX = (screenWidth – width) / 2 – rect.left;
  134.             } else if (rect.left > 0) {
  135.                 deltaX = -rect.left;
  136.             } else if (rect.right < screenWidth) {
  137.                 deltaX = screenWidth – rect.right;
  138.             }
  139.         }
  140.         matrix.postTranslate(deltaX, deltaY);
  141.     }
  142.     /**
  143.      * 两点的距离
  144.      */
  145.     private float spacing(MotionEvent event) {
  146.         float x = event.getX(0) – event.getX(1);
  147.         float y = event.getY(0) – event.getY(1);
  148.         return FloatMath.sqrt(x * x + y * y);
  149.     }
  150.     /**
  151.      * 两点的中点
  152.      */
  153.     private void midPoint(PointF point, MotionEvent event) {
  154.         float x = event.getX(0) + event.getX(1);
  155.         float y = event.getY(0) + event.getY(1);
  156.         point.set(x / 2, y / 2);
  157.     }
  158. }

 

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <FrameLayout xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:layout_width=“fill_parent”
  4.     android:layout_height=“fill_parent”
  5.     android:layout_gravity=“center” >
  6.     <ImageView
  7.         android:id=“@+id/imag”
  8.         android:layout_width=“fill_parent”
  9.         android:layout_height=“fill_parent”
  10.         android:layout_gravity=“center”
  11.         android:scaleType=“matrix” >
  12.     </ImageView>
  13. </FrameLayout>

 

Share this: