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

    

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 多点触摸绘画demo
  2. Android(安卓)利用adb命令 使App自动点击屏幕指定位置
  3. android 自定义组件随着手指自动画圆
  4. Android中view的简单应用---随手指移动的小球
  5. android 自定义动画1
  6. Android(安卓)BackgroundViewPager:类似桌面背景壁纸随手指滑动
  7. Android手机手势示例
  8. Android(安卓)自定义Gallery
  9. Android放大镜的实现

随机推荐

  1. 最牛逼android上的图表库MpChart(一) 介绍
  2. Unity使用easyAR发布Android和ios的问题
  3. Android日记之开篇词
  4. android电子书App、自定义图表、仿腾讯漫
  5. Android SDK版本问题: conversion to dalv
  6. Android(安卓)绘图基础:Bitmap(位图)与Matri
  7. Android 如何自己定义控件的样式 Shape
  8. android之sqliteDatabase,sqliteOpenHelp
  9. Android底层启动解析
  10. flappy bird游戏源代码揭秘和下载后续---