首先是布局文件,引入图片

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <ImageView         android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:id="@+id/imageView"    android:src="@drawable/vege"    android:contentDescription="@string/app_name"    android:scaleType="matrix"        /></LinearLayout>

activity

package cn.wonders.drag;import android.support.v7.app.ActionBarActivity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;public class MainActivity extends ActionBarActivity {private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.imageView);imageView.setOnTouchListener(new TonchListener());}private final class TonchListener implements OnTouchListener {private PointF startPoint = new PointF();private Matrix matrix = new Matrix();//照片当前的移动位子private Matrix currentMatrix = new Matrix();//模式private int mode = 0;//拖拉private final static int GRAG = 1;//多点触摸private final static int ZOOM = 2;//开始时2根手指的距离private float startDis;//中间点private PointF midPoint;@Overridepublic boolean onTouch(View v, MotionEvent event) {//取后8位switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN://第一次按下时记录坐标mode = GRAG;currentMatrix.set(imageView.getImageMatrix());startPoint.set(event.getX(), event.getY());break;case MotionEvent.ACTION_MOVE:if(mode == GRAG) {float dx = event.getX() - startPoint.x;float dy = event.getY() - startPoint.y;//实现位子的移动,在上一次的基础上移动matrix.set(currentMatrix);matrix.postTranslate(dx, dy);}else if (mode == ZOOM) {//缩放float endDis = distance(event);//得到缩放倍数if(endDis > 10f) {float scale = endDis/startDis;//参数:x和y轴的放大倍数,以及中心点matrix.postScale(scale, scale, midPoint.x, midPoint.y);}}break;case MotionEvent.ACTION_UP:break;//在此前已经有手指按下,屏幕上至少有2根手指case MotionEvent.ACTION_POINTER_DOWN:mode = ZOOM;startDis = distance(event);//距离大于10个像素才处理,防止有手指分叉或有茧;if(startDis > 10f) {midPoint = mid(event);//记录当前的放大倍数currentMatrix.set(imageView.getImageMatrix());}break;case MotionEvent.ACTION_POINTER_UP:mode = 0;break;default:break;} imageView.setImageMatrix(matrix);//消费掉事件return true;}}//返回2个手指间的距离private static float distance(MotionEvent event) {float dx = event.getX(1) - event.getX(0);float dy = event.getY(1) - event.getY(0);return (float) Math.sqrt(dx*dx+dy*dy);}//计算中心点,为2根手指的中心点private static PointF mid(MotionEvent event) {float dx = event.getX(1) + event.getX(0);float dy = event.getY(1) + event.getY(0);return new PointF(dx/2, dy/2);}}


更多相关文章

  1. Android(安卓)3D图片切换
  2. android中MotionEvent.ACTION_CANCEL事件如何被触发?
  3. android中MotionEvent.ACTION_CANCEL事件如何被触发?
  4. 高德地图Android,绘制自定义定位蓝点、marker、面
  5. android中图片的拖拉和缩放
  6. android 多点触摸绘画demo
  7. Android(安卓)利用adb命令 使App自动点击屏幕指定位置
  8. android 自定义组件随着手指自动画圆
  9. Android中view的简单应用---随手指移动的小球

随机推荐

  1. Android(安卓)Training - 代码性能优化小
  2. App跨平台开发方案与抉择
  3. 使用android studio 版本合并遇到的问题
  4. Google送Nexus One手机啦,大家快去收邮件
  5. Android与WebView的插件管理机制
  6. Android:EditText属性大全
  7. Android(安卓)Studio项目构建时遇到的常
  8. [Ionic 2从入门到精通] 9.3 在Mac或者PC
  9. Android(安卓)XML解析学习——创建XML
  10. Android(安卓)4.0.1 模拟器内核 最新下载