Android多点触控 Matrix图片随意的放大缩小,拖动

一、新建一个项目AnroidImageDragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示:



二、设置应用的UI界面,在main.xml中设置:



三、MainActivity.java中实现具体的需求

package com.example.anroidimagedragandzoom;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;/** * 枚举方式实现事件 * @author miaowei * */public class MainActivityEnum extends Activity{private enum Type{/** * 记录是拖放照片模式还是放大缩小照片模式 */MODE,/** * 拖放照片模式 */MODE_DRAG,/** * 放大缩小照片模式 */MODE_ZOOM}private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView)findViewById(R.id.imageView);imageView.setOnTouchListener(touchListener);}private class MainEventEnmu extends EventInfoBase<Enum<?>>{@Overridepublic void setEvent(Enum<?> event) {super.setEvent(event);}}private OnTouchListener touchListener  = new OnTouchListener() {/** * 用于记录开始时候的坐标位置 */private PointF startPoint = new PointF();/** * 用于记录拖拉图片移动的坐标位置 */private Matrix matrix = new Matrix();/** * 用于记录图片要进行拖拉时候的坐标位置 */private Matrix currentMatrix = new Matrix();/** * 两个手指的开始距离 */    private float startDis;    /**     * 两个手指的中间点     */    private PointF midPointF;    MainEventEnmu mainEventEnmu = new MainEventEnmu();@Overridepublic boolean onTouch(View v, MotionEvent event) {//通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255switch (event.getAction() & MotionEvent.ACTION_MASK) {//手指压下屏幕case MotionEvent.ACTION_DOWN:mainEventEnmu.setEvent(Type.MODE_DRAG);//记录ImageView当前的移动位置currentMatrix.set(imageView.getImageMatrix());startPoint.set(event.getX(), event.getY());break;//手指在屏幕上移动,改事件会被不断触发case MotionEvent.ACTION_MOVE://拖拉图片if (mainEventEnmu.getEvent() == Type.MODE_DRAG) {//得到X轴的移动距离float dx = event.getX() - startPoint.x;//得到Y轴的移动距离float dy = event.getY() - startPoint.y;//在没有移动之前的位置上进行移动matrix.set(currentMatrix);matrix.postTranslate(dx, dy);} //放大缩小图片else if (mainEventEnmu.getEvent() == Type.MODE_ZOOM) {//结束距离float endDis = distance(event);// 两个手指并拢在一起的时候像素大于10if (endDis > 10f) {// 得到缩放倍数float scale = endDis / startDis;matrix.set(currentMatrix);matrix.postScale(scale, scale,midPointF.x,midPointF.y);}}break;// 手指离开屏幕case MotionEvent.ACTION_UP://当触点离开屏幕,但是屏幕上还有触点(手指),多点case MotionEvent.ACTION_POINTER_UP:mainEventEnmu.setEvent(Type.MODE);break;// 当屏幕上已经有触点(手指),再有一个触点压下屏幕,多点case MotionEvent.ACTION_POINTER_DOWN:mainEventEnmu.setEvent(Type.MODE_ZOOM);/** 计算两个手指间的距离 */startDis = distance(event);// 两个手指并拢在一起的时候像素大于10if (startDis > 10f) {midPointF = mid(event); //记录当前ImageView的缩放倍数currentMatrix.set(imageView.getImageMatrix());}break;}imageView.setImageMatrix(matrix);return true;}};/** * 计算两个手指间的距离 * @param event * @return */private float distance(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);}/** * 计算两个手指间的中间点 * @return */private PointF mid(MotionEvent evntEvent){float midX = (evntEvent.getX(1) + evntEvent.getX(0));float midY = (evntEvent.getY(1) + evntEvent.getY(0));return new PointF(midX, midY);}}

Activity需要实现一个OnTouchListener的方法,来设置ImageView的侦听属性,该接口位于android.view.View.OnTouchListener。

实现onTouch(View view, MotionEvent event)的方法,就可以获取触屏的感应事件了。

在该事件中,有两个参数可以用来获取对触摸的控制,这两个参数分别为:MotionEvent.getAction()和MotionEvent.ACTION_MASK,前者用于对单点触控进行操作,后者用于对多点触控进行操作,相应地,我们可以通过Android Developers’ Reference看到,对于单点触控,我们由MotionEvent.getAction()可以得到以下几种事件:ACTION_DOWN、ACTION_UP,而对于多点触控,由MotionEvent.ACTION_MASK,我们可以得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP,都是MotionEvent中的常量,可以直接调用。而有些常量则是单点和多点共用的,如:ACTION_MOVE,因此在按下时,我们必须标记单点与多点触控的区别。

附件中有采用枚举标识实现方式

更多相关文章

  1. Android传感器开发(下)
  2. Android计算地图上两点距离
  3. Android(安卓)你的OnTouchEvent() 触屏事件的优化了吗
  4. android酷炫翻页效果+图形分析
  5. android酷炫翻页效果+图形分析
  6. Android传感器API:近距离感应Proximity
  7. Android直播系统平台搭建之图片实现阴影效果的方法小结
  8. Android中OnScrollListener回调具体剖析
  9. Android(安卓)多点触控技术

随机推荐

  1. Android 存储目录
  2. Android AudioPolicyService和AudioPolic
  3. Android模拟器——QEMU
  4. Android四种启动模式及其注意事项
  5. 安卓布局被软键盘顶上去的解决方案
  6. ProGuard代码混淆详细攻略
  7. android切换到后台,返回后图片纹理丢失
  8. Android Studio 开发常用快捷键
  9. Android 应用程序签名
  10. Android 禁止带有home属性的APP安装