2015年12月2日 星期三

觸碰與手勢判斷

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);
}


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

沒有留言:

張貼留言