您的位置:首页 > 移动开发 > Android开发

android应用之多点触摸实现图片缩放

2012-06-25 15:14 429 查看
MulitPointTouchListener.java
package com.mp;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();        static final int NONE = 0;        static final int DRAG = 1;        static final int ZOOM = 2;        int mode = NONE;        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());                switch (event.getAction() & MotionEvent.ACTION_MASK) {                case MotionEvent.ACTION_DOWN:                        matrix.set(view.getImageMatrix());                        Log.e("----->","running1");                        savedMatrix.set(matrix);                        start.set(event.getX(), event.getY());                        Log.e("----->","running2");                        Log.d(TAG, "mode=DRAG");                        mode = DRAG;                        Log.e(TAG, "mode=NONE");                        break;                case MotionEvent.ACTION_POINTER_DOWN:                        oldDist = spacing(event);                        Log.e(TAG, "oldDist=" + oldDist);                        if (oldDist > 10f) {                                savedMatrix.set(matrix);                                midPoint(mid, event);                                mode = ZOOM;                                Log.e(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.e(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);        }}
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    >	<ImageView android:id="@+id/ImageView01"	     android:scaleType="matrix" 	     android:layout_height="fill_parent" 	     android:layout_width="fill_parent">	</ImageView></LinearLayout>
package com.mp;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.os.Bundle;import android.util.Log;import android.widget.ImageView;public class m extends Activity {    ImageView iv;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.ok6410);        int bmpwidth = bmp.getWidth();        int bmpheight = bmp.getHeight();        Matrix matrix = new Matrix();        Bitmap bm = Bitmap.createBitmap(bmp,0,0,bmpwidth,bmpheight ,matrix,true);        Log.e("-->","right");        iv=(ImageView)super.findViewById(R.id.ImageView01);        iv.setOnTouchListener(new MulitPointTouchListener ());        iv.setImageBitmap(bm);    }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: