如何判断android是否支持多点触摸:
可以通过两种方式判断:
1. 通过JAVA的反射原理,关数类MotionEvent是否包含方法多点触摸的方法
支持多点触摸的方法getPointerCount,getPointerId是后来加上去的,如果类没有这两个方法,说明手机不支持多点触摸
boolean multiTouchAvailable1 = false; boolean multiTouchAvailable2 = false; // Not checking for getX(int), getY(int) etc 'cause I'm lazy Method methods [] = MotionEvent.class.getDeclaredMethods(); for(Method m: methods) { if( m.getName().equals("getPointerCount") ) multiTouchAvailable1 = true; if( m.getName().equals("getPointerId") ) multiTouchAvailable2 = true; } if (multiTouchAvailable1 && multiTouchAvailable2) return true; //支持多点触摸 else return false;
2. 通过判断android手机build的版本号
Build.VERSION.SDK
2011.10.17——— android 多点触控
参考:http://blog.csdn.net/ldj299/article/details/6422547
测试代码如下:
自定义view
01.package com.lp.multi;
02.
03.import android.content.Context;
04.import android.graphics.Canvas;
05.import android.graphics.Color;
06.import android.graphics.Paint;
07.import android.util.AttributeSet;
08.import android.util.Log;
09.import android.view.MotionEvent;
10.import android.view.View;
11.
12.public class MyView extends View{
13.
14. public MyView(Context context, AttributeSet attrs, int defStyle) {
15. super(context, attrs, defStyle);
16. // TODO Auto-generated constructor stub
17. }
18.
19. public MyView(Context context, AttributeSet attrs) {
20. super(context, attrs);
21. // TODO Auto-generated constructor stub
22. }
23.
24. public MyView(Context context) {
25. super(context);
26. // TODO Auto-generated constructor stub
27. }
28.
29. @Override
30. protected void onDraw(Canvas canvas) {
31. Paint mPaint = new Paint();
32. mPaint.setColor(Color.GRAY);
33. mPaint.setTextSize(30);
34. canvas.drawText("呵呵", 100, 200, mPaint);
35. }
36.
37. @Override
38. public boolean onTouchEvent(MotionEvent event) {
39.
40. int pointCount = event.getPointerCount();
41. System.out.println(pointCount);
42. if (pointCount == 2) {
43. final float x0 = event.getX(event.getPointerId(0));
44. final float y0 = event.getY(event.getPointerId(0));
45.
46. final float x1 = event.getX(event.getPointerId(1));
47. final float y1 = event.getY(event.getPointerId(1));
48.
49. switch (event.getAction()) {
50. case MotionEvent.ACTION_POINTER_2_DOWN:
51. System.out.println("ACTION_POINTER_2_DOWN");
52. break;
53. case MotionEvent.ACTION_POINTER_1_DOWN:
54. System.out.println("ACTION_POINTER_1_DOWN");
55. break;
56. case MotionEvent.ACTION_POINTER_1_UP:
57. System.out.println("ACTION_POINTER_1_UP");
58. break;
59. case MotionEvent.ACTION_POINTER_2_UP:
60. System.out.println("ACTION_POINTER_2_UP");
61. break;
62. case MotionEvent.ACTION_MOVE: {
63. System.out.println("ACTION_MOVE");
64. break;
65. }
66. }
67.
68. System.out.println(x0+" "+x1+" "+y0+" "+y1);
69. }
70.
71. return true;
72. }
73.
74.
75.
76.
77.}
注意:
onTouchEvent返回true 要不是没有效果的
- package com.lp.multi;
- import android.app.Activity;
- import android.os.Bundle;
- public class MainActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(new MyView(this));
- }
- }
运行结果:
- 10-17 17:53:32.269: INFO/System.out(11675): 1
- 10-17 17:53:32.279: INFO/System.out(11675): 2
- 10-17 17:53:32.279: INFO/System.out(11675): ACTION_POINTER_2_DOWN
- 10-17 17:53:32.279: INFO/System.out(11675): 324.3229 201.57916 88.79375 226.62125
- 10-17 17:53:32.289: INFO/System.out(11675): 2
- 10-17 17:53:32.289: INFO/System.out(11675): ACTION_MOVE
- 10-17 17:53:32.299: INFO/System.out(11675): 324.3229 201.57916 88.79375 226.62125
- 10-17 17:53:32.299: INFO/System.out(11675): 2
- 10-17 17:53:32.299: INFO/System.out(11675): ACTION_POINTER_1_UP
- 10-17 17:53:32.309: INFO/System.out(11675): 324.3229 201.57916 88.79375 226.62125
- 10-17 17:53:32.309: INFO/System.out(11675): 1
结论:
1、ACTION_POINTER_2_DOWN和ACTION_POINTER_1_DOWN 可能只会触发一个
2、事件只触发了一个,但是坐标都是能得到的