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; @Override protected 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<?>>{ @Override public 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(); @Override public boolean onTouch(View v, MotionEvent event) { //通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 switch (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); // 两个手指并拢在一起的时候像素大于10 if (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); // 两个手指并拢在一起的时候像素大于10 if (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,因此在按下时,我们必须标记单点与多点触控的区别。
附件中有采用枚举标识实现方式
相关推荐
flash as3 多点触控-缩放-旋转-滑动,多点触控常用功能,可以用作触摸屏,直接复制用。
最简单android 多点触控 图片放大,没有任何过多的代码,使用了自定义控件,MotionEvent.ACTION_POINTER_DOWN来标识第二点按下,setFrame来改变片的大小
android多点触控放大缩小图片demo
本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理。需要实现OnTouchListener接口,重写其中的onTouch方法。
android多点触控demo,处理多点触控,两只手同时拖拽
Android手势识别-多点触控。 包含在画布中的多点触控和利用多点触控实现图片的放大和缩小
Android的多点触控放大缩小图片,如果你感觉好,可以给我评论,不好也可留言。我好改进。
Android 多点触控实例。 多点触控图像,根据手势随意放大/缩小图像。
在Android上查看图片或者浏览网页时,我们往往有把图片或者网页放大或者缩小的的需求,这样就能够获得更多的细节信息 或者获得更多的全貌信息,多点触摸与绽放功能正是满足这种应用场景的技术。
android多点触控和抽屉效果;android多点触控和抽屉效果;android多点触控和抽屉效果
此为示例代码,详细讲解请参考博文: http://blog.csdn.net/guolin_blog/article/details/11100327 如果对资源内容有疑问,可以到博客中留言。
android多点触控缩放图片的小例子。
QT5.X版本的多点触控使用双手指缩放图片源码,使用QTCreater编译即可,已在imx6的Linux4.1.15上调试通过,该功能需要触摸屏支持多点触控,如果不支持就不用浪费时间了,第二,需要你自己把触摸屏的驱动移植好,且...
android小程序-电子钢琴-多点触控-附件资源
运行正常,里面有截图!
Android 多点触控实现
Android 多点触控与简单手势 实现图片拖动,缩放;
安卓源码包android多点触控&手势操作灯DEMO源码: 一个最最基础的图形程序,圆可以拖动,两点触控是删除圆,3点触控是添加一个圆 做了四个界面的滑动功能,设置了每个界面的移动动画操作 多点触控控制字体大小,源码...
flash,多点触控开发 经过自己优化,基于BorderContainer,只要往里面的image里面放入图片即可实现多点触控的旋转放大缩小灯操作。