Android学习之多点触摸并不神秘

最近研究了一下多点触摸,写了个利用多点触摸来控制图片大小和单点触摸控制图片移动的程序,和大家分享分享。

Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法:

getPointerCount() 获得触屏的点数。

getX() 获得触屏的X坐标值

getY() 获得触屏的Y坐标值

getAction() 获得触屏的动作

ACTION_DOWN:按下的动作开始,比如用手指按屏幕。

ACTION_UP:按下的动作完成,比如手指停止按屏幕,离开屏幕。

ACTION_MOVE:在动作开始和完成之间的移动,比如手指在屏幕上滑动。

还介绍下程序中用到的ImageView,ImageView.setFrame()的四个参数指的是left,top,right,bottom如图:

left和top指的就是ImageView左上角的坐标x和y,right,bottom指的就是ImageView的右下角的坐标x和y了。

接下来看程序,程序中有详细的介绍:

[java] view plaincopy

  1. package com.practice.imageviewpic;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.*;
  5. import android.graphics.drawable.BitmapDrawable;
  6. import android.os.Bundle;
  7. import android.view.MotionEvent;
  8. import android.widget.ImageView;
  9. import android.widget.ImageView.ScaleType;
  10. public class ImageViewPic extends Activity {
  11. /*
  12. * 利用多点触控来控制ImageView中图像的放大与缩小
  13. * 手指控制图片移动
  14. */
  15. private MyImageView imageView;
  16. private Bitmap bitmap;
  17. //两点触屏后之间的长度
  18. private float beforeLenght;
  19. private float afterLenght;
  20. //单点移动的前后坐标值
  21. private float afterX,afterY;
  22. private float beforeX,beforeY;
  23. /** Called when the activity is first created. */
  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. findView();
  28. setContentView(imageView);
  29. config();
  30. }
  31. private void findView() {
  32. imageView = new MyImageView(this);
  33. //获得图片
  34. bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.xing)).getBitmap();
  35. }
  36. private void config() {
  37. //设置imageView的显示图片
  38. imageView.setImageBitmap(bitmap);
  39. //设置图片填充ImageView
  40. imageView.setScaleType(ScaleType.FIT_XY);
  41. }
  42. //创建一个自己的ImageView类
  43. class MyImageView extends ImageView {
  44. private float scale = 0.1f;
  45. public MyImageView(Context context) {
  46. super(context);
  47. }
  48. //用来设置ImageView的位置
  49. private void setLocation(int x,int y) {
  50. this.setFrame(this.getLeft()+x, this.getTop()+y, this.getRight()+x, this.getBottom()+y);
  51. }
  52. /*
  53. * 用来放大缩小ImageView
  54. * 因为图片是填充ImageView的,所以也就有放大缩小图片的效果
  55. * flag为0是放大图片,为1是小于图片
  56. */
  57. private void setScale(float temp,int flag) {
  58. if(flag==0) {
  59. this.setFrame(this.getLeft()-(int)(temp*this.getWidth()),
  60. this.getTop()-(int)(temp*this.getHeight()),
  61. this.getRight()+(int)(temp*this.getWidth()),
  62. this.getBottom()+(int)(temp*this.getHeight()));
  63. }else {
  64. this.setFrame(this.getLeft()+(int)(temp*this.getWidth()),
  65. this.getTop()+(int)(temp*this.getHeight()),
  66. this.getRight()-(int)(temp*this.getWidth()),
  67. this.getBottom()-(int)(temp*this.getHeight()));
  68. }
  69. }
  70. //绘制边框
  71. @Override
  72. protected void onDraw(Canvas canvas) {
  73. super.onDraw(canvas);
  74. Rect rec=canvas.getClipBounds();
  75. rec.bottom--;
  76. rec.right--;
  77. Paint paint=new Paint();
  78. paint.setColor(Color.RED);
  79. paint.setStyle(Paint.Style.STROKE);
  80. canvas.drawRect(rec, paint);
  81. }
  82. /* 让图片跟随手指触屏的位置移动
  83. * beforeX、Y是用来保存前一位置的坐标
  84. * afterX、Y是用来保存当前位置的坐标
  85. * 它们的差值就是ImageView各坐标的增加或减少值
  86. */
  87. public void moveWithFinger(MotionEvent event) {
  88. switch(event.getAction()) {
  89. case MotionEvent.ACTION_DOWN:
  90. beforeX = event.getX();
  91. beforeY = event.getY();
  92. break;
  93. case MotionEvent.ACTION_MOVE:
  94. afterX = event.getX();
  95. afterY = event.getY();
  96. this.setLocation((int)(afterX-beforeX),(int)(afterY-beforeY));
  97. beforeX = afterX;
  98. beforeY = afterY;
  99. break;
  100. case MotionEvent.ACTION_UP:
  101. break;
  102. }
  103. }
  104. /*
  105. * 通过多点触屏放大或缩小图像
  106. * beforeLenght用来保存前一时间两点之间的距离
  107. * afterLenght用来保存当前时间两点之间的距离
  108. */
  109. public void scaleWithFinger(MotionEvent event) {
  110. float moveX = event.getX(1) - event.getX(0);
  111. float moveY = event.getY(1) - event.getY(0);
  112. switch(event.getAction()) {
  113. case MotionEvent.ACTION_DOWN:
  114. beforeLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );
  115. break;
  116. case MotionEvent.ACTION_MOVE:
  117. //得到两个点之间的长度
  118. afterLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );
  119. float gapLenght = afterLenght - beforeLenght;
  120. if(gapLenght == 0) {
  121. break;
  122. }
  123. //如果当前时间两点距离大于前一时间两点距离,则传0,否则传1
  124. if(gapLenght>0) {
  125. this.setScale(scale,0);
  126. }else {
  127. this.setScale(scale,1);
  128. }
  129. beforeLenght = afterLenght;
  130. break;
  131. }
  132. }
  133. }
  134. //这里来监听屏幕触控时间
  135. @Override
  136. public boolean onTouchEvent(MotionEvent event) {
  137. /*
  138. * 判定用户是否触摸到了图片
  139. * 如果是单点触摸则调用控制图片移动的方法
  140. * 如果是2点触控则调用控制图片大小的方法
  141. */
  142. if(event.getY() > imageView.getTop() && event.getY() < imageView.getBottom()
  143. && event.getX() > imageView.getLeft() && event.getX() < imageView.getRight()) {
  144. if(event.getPointerCount() == 2) {
  145. imageView.scaleWithFinger(event);
  146. }else if(event.getPointerCount() == 1) {
  147. imageView.moveWithFinger(event);
  148. }
  149. }
  150. return true;
  151. }
  152. }

源程序的下载地址为:http://download.csdn.net/source/3281618

时间: 2024-07-29 03:54:38

Android学习之多点触摸并不神秘的相关文章

Android中的多点触摸

代码下载地址 代码一:自定义支持多点触摸的TextView http://download.csdn.net/detail/zhiyuan0932/9513852 什么是多点触摸 允许计算机用户同时通过多个手指来控制图形界面的一种技术 多点触摸的应用场景 对图片.文字.网页进行放大或者缩小 多手指手势操作自定义控件和布局 触摸事件的重要方法 event.getActionMasked(): 获取事件类型 在只使用单手指操作的时候,这个方法我们一般使用的是event.getAction(),来获取

Android事件处理之多点触摸与手势识别

一.Muilti-touch 双指缩放的实现探索: 首先要实现OnTouchListener接口,然后重写方法: public boolean onTouch(View v, MotionEvent event); 从这个方法中我们就可以获取实现两指缩放功能的全部信息. View v是触发事件的源,MotionEvent event即一个触摸事件.对屏幕的几乎所有操作都会触发事件,如点击.放开.滑动等. 不同的事件在MotionEvent中有不同的id,我们可以根据event.getAction

Linux Android 多点触摸协议 原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/71/12306571.shtml

为了使用功能强大的多点触控设备.就须要一种方案去上报用户层所需的具体的手指触摸数据. 这个文档所描写叙述的多点触控协议能够让内核驱动程序向用户层上报随意多指的数据信息. 使用说明 单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH.ABS_X.ABS_Y.SYNC.而多点触摸信息则是以ABS_MT承载并按一定顺序发送.如ABS_MT_POSITION_X.ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来

Android 中多点触摸协议

http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt 1, 两种多点触摸协议: 1)A类: 处理无关联的接触: 用于直接发送原始数据: B类: 处理跟踪识别类的接触: 通过事件slot发送相关联的独立接触更新. 2,  触摸协议的使用: A类协议: A类协

Android 手势滑动,多点触摸放大缩小图片

学习安卓两点触摸滑动缩放图片 1.布局文件如下main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="

Android多点触摸交互处理,放大缩小图片

多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术.与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见的就是银行里的ATM机和排队查询机等等. 多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能.比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小.再比如一些浏览器,也可以通过多点触摸放大或者缩小字体.其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定

【android学习】安卓设备实现触摸事件的监听,跨进程事件注入

最近想实现触摸屏的事件记录,并且分别做时间戳标记,类似于adb shell 下的getevent/setevent,查了很多资料,下面是一些总结. 实现方法: 1.利用onclick方法等.这种方法只能用于自己的Activity和View中,如果要检测其他Activity,比如键盘就不行了. 2.从linux内核入手.在事件分发前截获事件,可以对任意Activity实现事件捕获. android触摸事件的流程: http://blog.csdn.net/sunnyfans/article/det

【Android界面实现】PhotoView项目——支持单点/多点触摸的放缩图片的实现

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 今天给大家介绍的开源项目,是来自Github的PhotoView项目,这个项目的主要功能是实现普通的ImageView控件的图片的放缩,触摸方式包括单点触摸.多点触摸. PhotoVIew的github项目地址:https://github.com/chrisbanes/PhotoView 测试项目的目录结构 我们把photoVIew的资源文件直接复制到项目即可. 下面是关键代码 package com.

Android多点触摸放大缩小图片

1.Activity package com.fit.touchimage; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.F