首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

图片的拖动与开释

2013-10-08 
图片的拖动与释放原理图:1)2)代码如下:1、在drawable目录下导入要演示的图片2、main.xmlpackage com.njupt.d

图片的拖动与释放

原理图:

1)

图片的拖动与开释

2)

图片的拖动与开释


代码如下:

1、在drawable目录下导入要演示的图片


2、main.xml

package com.njupt.drag_scale1;import android.app.Activity;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;import android.util.FloatMath;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;public class MainActivity extends Activity {    /** Called when the activity is first created. */private ImageView iv;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                iv = (ImageView) findViewById(R.id.iv);                iv.setOnTouchListener(new MyOnTouchListener());    }        private final class MyOnTouchListener implements OnTouchListener{        private PointF startPoint = new PointF();//初始点    private Matrix mCurrentMatrix = new Matrix();//图片初始的matrix值    private Matrix mMatrix = new Matrix();//来一个临时的matrix        private PointF midPointF;//中心点    private float midDistance;//两点间的距离        private int type = 0;    private final static int DRAG = 1;    private final static int SCALE = 2;        public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubint action = event.getAction()&MotionEvent.ACTION_MASK;switch (action) {case MotionEvent.ACTION_DOWN://手指按下float x = event.getX();float y = event.getY();startPoint.set(x, y);mCurrentMatrix.set(iv.getImageMatrix());//图片没有移动的位置type = DRAG;break;case MotionEvent.ACTION_POINTER_1_DOWN://屏幕上有一根手指,再按下一根手指mCurrentMatrix.set(iv.getImageMatrix());//图片没有缩放的大小midPointF = getMidPointF(event);midDistance = getMidDistance(event);type = SCALE;break;case MotionEvent.ACTION_MOVE://手指移动if(type == DRAG){mMatrix.set(mCurrentMatrix);float dx = event.getX() - startPoint.x;float dy = event.getY() - startPoint.y;mMatrix.postTranslate(dx, dy);}else if(type == SCALE){mMatrix.set(mCurrentMatrix);float distance = getMidDistance(event);//得到当前两个手指间的距离float sx = distance/midDistance;//得到缩放的倍数mMatrix.postScale(sx, sx, midPointF.x, midPointF.y);}break;case MotionEvent.ACTION_UP://手指弹起case MotionEvent.ACTION_POINTER_1_UP://弹起一根手指,屏幕上还有一根手指type = 0;break;default:break;}iv.setImageMatrix(mMatrix);return true;}        }        //得到中心点private PointF getMidPointF(MotionEvent event){float x = (event.getX(1) + event.getX(0))/2;float y = (event.getY(1) + event.getY(0))/2;return new PointF(x, y);}//计算两点间的距离private float getMidDistance(MotionEvent event){float dx = event.getX(1) - event.getX(0);float dy = event.getY(1) - event.getY(0);return FloatMath.sqrt(dx*dx + dy*dy);}}


热点排行