1. 判斷手勢滑動
public boolean onTouchEvent(MotionEvent event) {
float X = event.getX(); // 觸控的 X 軸位置
float Y = event.getY(); // 觸控的 Y 軸位置
switch (event.getAction()) { // 判斷觸控的動作
case MotionEvent.ACTION_DOWN: // 按下
downX = event.getX();
downY = event.getY();
return true;
case MotionEvent.ACTION_MOVE: // 拖曳
return true;
case MotionEvent.ACTION_UP: // 放開
Log.d("onTouchEvent-ACTION_UP","UP");
upX = event.getX();
upY = event.getY();
float x=Math.abs(upX-downX);
float y=Math.abs(upY-downY);
double z=Math.sqrt(x*x+y*y);
int jiaodu=Math.round((float)(Math.asin(y/z)/Math.PI*180));//角度
if (upY < downY && jiaodu>45) {//上
Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:上");
}else if(upY > downY && jiaodu>45) {//下
Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:下");
}else if(upX < downX && jiaodu< =45) {//左
Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:左");
// 原方向不是向右時,方向轉右
if (mDirection != EAST) {
mNextDirection = WEST;
}
}else if(upX > downX && jiaodu< =45) {//右
Log.d("onTouchEvent-ACTION_UP","角度:"+jiaodu+", 動作:右");
// 原方向不是向左時,方向轉右
if (mDirection ! = WEST) {
mNextDirection = EAST;
}
}
return true;
case MotionEvent.ACTION_POINTER_DOWN: // 两只手指按下
return true;
case MotionEvent.ACTION_POINTER_UP: //一只手指离开屏幕,但还有一只手指在上面会触此事件
return true;
}
return super.onTouchEvent(event);
}
Android - 判斷手勢滑動方向(用onTouchEvent實現):http://cookiesp.pixnet.net/blog/post/93872584-android---%E5%88%A4%E6%96%B7%E6%89%8B%E5%8B%A2%E6%BB%91%E5%8B%95%E6%96%B9%E5%90%91%28%E7%94%A8ontouchevent%E5%AF%A6%E7%8F%BE%29
2. 多点触控和缩放:配合 Bitmap、Matrix、TouchEvent 判斷,來完成圖片的縮放、旋轉、移動。
/**计算两点之间的距离像素**/
private float distance(MotionEvent e) {
float eX = e.getX(1) - e.getX(0); //后面的点坐标 - 前面点的坐标
float eY = e.getY(1) - e.getY(0);
return FloatMath.sqrt(eX * eX + eY * eY);
}
/**计算两点之间的中心点**/
private PointF getMidPoint(MotionEvent event) {
float x = (event.getX(1) - event.getX(0)) / 2;
float y = (event.getY(1) - event.getY(0)) / 2;
return new PointF(x,y);
}
//获得旋转角
public float getAngle(MotionEvent Event)
{
double DeltalX=Event.getX(0)-Event.getX(1);
double DeltalY=Event.getY(0)-Event.getY(1);
return (float)Math.atan2(DeltalX, DeltalY);
}
Android中图片的多点触控和缩放 (imageView):http://smallwoniu.blog.51cto.com/3911954/1252191
Android开发学习之ImageView手势拖拽、缩放、旋转 (imageView):http://blog.csdn.net/qinyuanpei/article/details/17751481
模擬拖曳小圖示的 Android 程式 (surfaceView):http://dazi2012.blogspot.tw/2012/05/android.html?m=1
3. 應用於 activity 中的架構:
範例為新增自定義的 view,並在裡面繪製圓。透過觸碰改變圓的大小。
import ...
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TouchView(this));
}
//自建的類別,繼承View,當成活動之畫面呈現
private class TouchView extends View{
public TouchView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
//螢幕觸控事件處理,這邊是簡易方法只能偵測layout,無法針對特定元件進行監聽
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (Event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN :
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_MOVE :
invalidate();//自動呼叫onDraw方法
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_UP:
break;
default :
break;
}
return true;
}
}
}
參考資料:
- Android:多點觸控之應用以及取得螢幕解析度 :http://chihweiwu.blogspot.tw/2012/08/android_30.html