android多点触控
网上搜索后有很多的多点触控的东西,自己也写个吧,实现的就是在屏幕上画个圆角的矩形随着2点的大小而变换。
下面的东西是在网上找的一个例子然后自己更改的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.multitouch.view;
2
3 /**
4 * Copyright (c) 2011,
5 * GaoTime
6 * All rights reserved.
7 *
8 * @file TestView.java
9 *
10 * @brief 实现多点触控(spacing,midPoint2个方法不是很理解)
11 *
12 * @author Hardy
13 *
14 * @version 1.0.1
15 *
16 * @data 2011-09-24
17 *
18 */
19 import android.content.Context;
20 import android.graphics.Canvas;
21 import android.graphics.Color;
22 import android.graphics.Paint;
23 import android.graphics.PointF;
24 import android.graphics.RectF;
25 import android.util.AttributeSet;
26 import android.util.Log;
27 import android.view.MotionEvent;
28 import android.view.View;
29
30 public class MultiTouch extends View
31 {
32 /**
33 * 用来控制画图的边距
34 */
35 private float m_fMargins = 120;
36 /**
37 * 表示不处理
38 */
39 private static final int NONE = 0;
40 private static final int DRAG = 1;
41 /**
42 * 放大缩小
43 */
44 private static final int ZOOM = 2;
45 /**
46 * 设置模式0不处理2表示放大缩小
47 */
48 private int m_nMode = NONE;
49 /**
50 * 开始2点的x,y的值
51 */
52 PointF m_pStart = new PointF();
53 /**
54 * 新的2点的x,y的值
55 */
56 PointF m_pMid = new PointF();
57 /**
58 * 一开始的2个点的距离
59 */
60 float m_fOldDist = 1f;
61 /**
62 * 图离屏幕最大的距离
63 */
64 private int m_nMaximum = 150;
65 /**
66 * 图离屏幕最小的距离
67 */
68 private int m_nMinimun = 30;
69 /**
70 * 每次扩大的速度
71 */
72 private int m_nStep =1;
73 /**
74 * 误差范围是正负30
75 */
76 private int m_nErrorValue = 30;
77 public MultiTouch(Context context)
78 {
79 super(context);
80 }
81
82 public MultiTouch(Context context, AttributeSet attrs)
83 {
84 super(context, attrs);
85 // TODO Auto-generated constructor stub
86 }
87
88 @Override
89 protected void onDraw(Canvas canvas)
90 {
91 // TODO Auto-generated method stub
92 // 简单的画一个有圆角的矩形通过刷新画布实现重绘m_fMargins是控制圆角矩形和画布之间的距离的变量--->就是m_fMargins来控制矩形的大小
93 super.onDraw(canvas);
94 Paint mPaint = new Paint();
95 mPaint.setColor(Color.BLUE);
96 mPaint.setAntiAlias(true);
97 RectF rectF = new RectF(m_fMargins, m_fMargins, canvas.getWidth()
98 - m_fMargins, canvas.getHeight() - m_fMargins);
99 canvas.drawRoundRect(rectF, 5, 5, mPaint);
100 }
101
102 @Override
103 public boolean onTouchEvent(MotionEvent event)
104 {
105 switch (event.getAction() & MotionEvent.ACTION_MASK)
106 {
107 //
108 case MotionEvent.ACTION_DOWN:
109 // 設置初始點位置,后面用来判断双点是否不动
110 m_pStart.set(event.getX(), event.getY());
111 m_nMode = DRAG;
112 break;
113 case MotionEvent.ACTION_POINTER_1_DOWN:
114 // 得到一开始的两个点的区域
115 m_fOldDist = spacing(event);
116 // 判断2个点的距离在10之内就表示2个点的距离很近不处理
117 if (m_fOldDist > 10f)
118 {
119 // 大于就取到2个点的距离
120 midPoint(m_pMid, event);
121 // 将mode设置为zoom为2表示2个点都按下.在Move中判断是否移动
122 m_nMode = ZOOM;
123 }
124 break;
125 case MotionEvent.ACTION_UP:
126 case MotionEvent.ACTION_POINTER_1_UP:
127 // 如果抬起一个点就将mode设置为0表示不处理
128 m_nMode = NONE;
129 break;
130 case MotionEvent.ACTION_MOVE:
131 // 如果为zoom那么就进入表示2个点按下并且在动
132 if (m_nMode == ZOOM)
133 {
134 // 得到新的两点的距离
135 float a_fNewDist = spacing(event);
136 // 这里判断是否是2个点动的距离过小如果相等就表示2个点没有动(是否加入误差?)
137 Log.e("======m_pStart.x======"+m_pStart.x, "======event.getX()======"+event.getX());
138 if (m_pStart.x+m_nErrorValue<event.getX()||m_pStart.x-m_nErrorValue>event.getX()||m_pStart.y+m_nErrorValue<event.getY()||m_pStart.y-m_nErrorValue>event.getY())
139 {
140 // 新的2个点的距离在10以上表示间距大处理否则不处理
141 if (a_fNewDist > 10f)
142 {
143 // 如果新的距离大于老的距离表示放大,否则就缩小
144 if (m_fOldDist <a_fNewDist )//大
145 {
146 float scale = a_fNewDist / m_fOldDist;
147 if (m_fMargins < m_nMinimun)
148 {
149 m_fMargins = m_fMargins;
150 }
151 else
152 {
153 m_fMargins -= scale+m_nStep;
154 }
155 m_fOldDist = a_fNewDist;
156 }
157 if (m_fOldDist > a_fNewDist )//小
158 {
159 float scale = a_fNewDist / m_fOldDist;
160 if (m_fMargins > m_nMaximum)
161 {
162 m_fMargins = m_fMargins;
163 }
164 else
165 {
166 m_fMargins += scale+m_nStep;
167 }
168 m_fOldDist = a_fNewDist;
169 }
170 }
171 postInvalidate();
172 }
173 }
174 break;
175 }
176 return true;
177 }
178 /**
179 * 确定2个点的距离
180 *
181 * @param event
182 * 传入的是onTouchEvent(MotionEvent event)终端额event
183 * @return 返回的是2个手指之间的区域的float值
184 */
185 private float spacing(MotionEvent event)
186 {
187 float x = event.getX(0) - event.getX(1);
188 float y = event.getY(0) - event.getY(1);
189 return (float) Math.sqrt(x * x + y * y);
190 }
191 /**
192 * 计算第一次2个手指的中间点
193 *
194 * @param point 计算?
195 * @param event 传入的是onTouchEvent(MotionEvent event)中的event
196 */
197 private void midPoint(PointF point, MotionEvent event)
198 {
199 float x = event.getX(0) + event.getX(1);
200 float y = event.getY(0) + event.getY(1);
201 point.set(x / 2, y / 2);
202 }
203 }