现在一般的android手机都会使用电容触摸屏,所以基本上都会支持多点触控,同样在android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求,下面简单讲一下如何使用多点触控:
MotionEvent.getAction()
对于单点触控,我们由MotionEvent.getAction()就可以得到以下几种事件:ACTION_DOWN、ACTION_UP等
MotionEvent.ACTION_MASK
而对于多点触控,我们需要由MotionEvent.getAction() &MotionEvent.ACTION_MASK一起得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP等
单点和多点两者共用的:ACTION_MOVE等,所以需要区分当前是单点还是多点才能正确的处理。
这些得到的值都是MotionEvent中的常量,可以直接调用。
另外还有很多辅助接口:
event.getPointerCount() 获取当前触控点的数量 event.getPointerId(i) 获取指定触控点的Id,用于区分不同的触控点 event.getX(i) 获取指定触控点的X坐标 event.getY(i) 获取指定触控点的Y坐标 event.getPressure(i) 获取指定触控点的压力值,此值的获取需要LCD硬件和驱动的支持
双指伸缩手势常用于图片、文本、网页等的放大和缩小,在实际中的使用非常频繁,下面就简单讲一下具体的原理:
如果当前没有别的手势干扰,我们只需检测两指按下时各自的位置、两点的距离以及两指移动之后的各自位置、亮点的距离关系即可,如果移动后距离变大,则是放大动作;反之则是缩小动作。
首先要计算两指按下时的距离:
得到移动之前两指按下的点之间的距离,具体原理相信学过勾股定理的同学同应该知道,由点1的x减去点2的x可以得到一条直角边的长度,正负不重要,因为在下面的计算时会计算平方而得到正值长度,然后由点1的y减去点2的y可以得到另外一条直角边的长度,这样由两条直角边可以用勾股定理得出斜边的长度,即两点之间的直线距离。
private float spacing(MotionEvent event) { float x = event.getX(0)-event.getY(1); float y = event.getY(0)-event.getY(1); return (float)Math.sqrt(x*x+y*y); }
private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); }
使用Martix的postscale(横向缩放比例,纵向缩放比例,中点的x,中点的y),一般需要先获取图片或者控件等的martix,然后调用postscale将参数传递进去,得到新的缩放后的martix,最后再设置回去,刷新之后即可生效,看到缩放后的效果。
SecureFX上传中文文件名乱码问题解决方案,布布扣,bubuko.com
原文:http://blog.csdn.net/ygc/article/details/21004441