http://blog.sina.com.cn/s/blog_5fc933730100pw8k.html


import android.graphics.Matrix;import android.graphics.PointF;import android.util.FloatMath;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;public class MulitPointTouchListener implements OnTouchListener {        private static final String TAG = "Touch";        // These matrices will be used to move and zoom image        Matrix matrix = new Matrix();        Matrix savedMatrix = new Matrix();        // We can be in one of these 3 states        static final int NONE = 0;        static final int DRAG = 1;        static final int ZOOM = 2;        int mode = NONE;        // Remember some things for zooming        PointF start = new PointF();        PointF mid = new PointF();        float oldDist = 1f;        @Override        public boolean onTouch(View v, MotionEvent event) {                ImageView view = (ImageView) v;                // Log.e("view_width",                // view.getImageMatrix()..toString()+"*"+v.getWidth());                // Dump touch event to log                dumpEvent(event);                // Handle touch events here...                switch (event.getAction() & MotionEvent.ACTION_MASK) {                case MotionEvent.ACTION_DOWN:                        matrix.set(view.getImageMatrix());                        savedMatrix.set(matrix);                        start.set(event.getX(), event.getY());                        //Log.d(TAG, "mode=DRAG");                        mode = DRAG;                                               //Log.d(TAG, "mode=NONE");                        break;                case MotionEvent.ACTION_POINTER_DOWN:                        oldDist = spacing(event);                        //Log.d(TAG, "oldDist=" + oldDist);                        if (oldDist > 10f) {                                savedMatrix.set(matrix);                                midPoint(mid, event);                                mode = ZOOM;                                //Log.d(TAG, "mode=ZOOM");                        }                        break;                case MotionEvent.ACTION_UP:                case MotionEvent.ACTION_POINTER_UP:                        mode = NONE;                        //Log.e("view.getWidth", view.getWidth() + "");                        //Log.e("view.getHeight", view.getHeight() + "");                        break;                case MotionEvent.ACTION_MOVE:                        if (mode == DRAG) {                                // ...                                matrix.set(savedMatrix);                                matrix.postTranslate(event.getX() - start.x, event.getY()                                                - start.y);                        } else if (mode == ZOOM) {                                float newDist = spacing(event);                                //Log.d(TAG, "newDist=" + newDist);                                if (newDist > 10f) {                                        matrix.set(savedMatrix);                                        float scale = newDist / oldDist;                                        matrix.postScale(scale, scale, mid.x, mid.y);                                }                        }                        break;                }                view.setImageMatrix(matrix);                return true; // indicate event was handled        }        private void dumpEvent(MotionEvent event) {                String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",                                "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };                StringBuilder sb = new StringBuilder();                int action = event.getAction();                int actionCode = action & MotionEvent.ACTION_MASK;                sb.append("event ACTION_").append(names[actionCode]);                if (actionCode == MotionEvent.ACTION_POINTER_DOWN                                || actionCode == MotionEvent.ACTION_POINTER_UP) {                        sb.append("(pid ").append(                                        action >> MotionEvent.ACTION_POINTER_ID_SHIFT);                        sb.append(")");                }                sb.append("[");                for (int i = 0; i < event.getPointerCount(); i++) {                        sb.append("#").append(i);                        sb.append("(pid ").append(event.getPointerId(i));                        sb.append(")=").append((int) event.getX(i));                        sb.append(",").append((int) event.getY(i));                        if (i + 1 < event.getPointerCount())                                sb.append(";");                }                sb.append("]");                //Log.d(TAG, sb.toString());        }               private float spacing(MotionEvent event) {                float x = event.getX(0) - event.getX(1);                float y = event.getY(0) - event.getY(1);                return FloatMath.sqrt(x * x + y * y);        }               private void midPoint(PointF point, MotionEvent event) {                float x = event.getX(0) + event.getX(1);                float y = event.getY(0) + event.getY(1);                point.set(x / 2, y / 2);        }}将以上代码写到MulitPointTouchListener .java中,然后对你相应的图片进行OnTouchListener比如:imageView.setOnTouchListener(new MulitPointTouchListener ());在xml中要将图片的缩放格式改成Matrix 注:android:scaleType="matrix"


更多相关文章

  1. android 加载大图的原理和实现
  2. 有用代码片段
  3. android之setBackgroundDrawable()
  4. JAVA-ANDROID
  5. Android(安卓)GifImageView加载Gif图片及原理
  6. 在Android工程中,添加ICON资源
  7. Android(安卓)Webview 部分图片显示不出来问题
  8. Android使用SVG的一点小坑
  9. Eclipse下修改Android里的apk包名

随机推荐

  1. Android res/raw文件以及raw与res/assets
  2. Android下载完成更新后,没有打开安装成功
  3. Android 下枚举型使用、及与 int 转换的
  4. Weex 初体验(2)-navigator android跳转
  5. 修改linux/Android启动logo
  6. android6.0、7.0、8.0新特性总结之开发应
  7. Windows环境下编译Assimp库生成Android可
  8. Android无障碍浅析
  9. Android 常用图片框架对比
  10. android与js的交互之jsbridge使用