android 上下左右手勢判斷

package com.gesture;

import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;

public class GestureUtils {

     

    //獲取屏幕的大小
    public static Screen getScreenPix(Context context) {
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        return new Screen(dm.widthPixels,dm.heightPixels);
    }
    
    public static class Screen{
        
        public int widthPixels;
        public int heightPixels;
        
        public Screen(){
            
        }
        
        public Screen(int widthPixels,int heightPixels){
            this.widthPixels=widthPixels;
            this.heightPixels=heightPixels;
        }

        @Override
        public String toString() {
            return "("+widthPixels+","+heightPixels+")";
        }
        
    }
    
}


手勢判別的核心方法:

package com.gesture;

import com.gesture.GestureUtils.Screen;

import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;

public class  BuileGestureExt  {
    public static final int GESTURE_UP=0;
    public static final int GESTURE_DOWN=1;
    public static final int GESTURE_LEFT=2;
    public static final int GESTURE_RIGHT=3;
    private OnGestureResult onGestureResult;
    private Context mContext;
    public BuileGestureExt(Context c,OnGestureResult onGestureResult) {
        this.mContext=c;
        this.onGestureResult=onGestureResult;
        screen = GestureUtils.getScreenPix(c);
    }
    public GestureDetector Buile()
    {
        return new GestureDetector(mContext, onGestureListener);
    }
    
    private Screen screen;
    private GestureDetector.OnGestureListener onGestureListener = new GestureDetector.SimpleOnGestureListener(){

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            float x = e2.getX() - e1.getX();
            float y = e2.getY() - e1.getY();
            //限制必須得劃過屏幕的1/4才能算劃過
            float x_limit = screen.widthPixels / 4;
            float y_limit = screen.heightPixels / 4;
            float x_abs = Math.abs(x);
            float y_abs = Math.abs(y);
            if(x_abs >= y_abs){
                //gesture left or right
                if(x > x_limit || x < -x_limit){
                    if(x>0){
                        //right
                        doResult(GESTURE_RIGHT); 
                    }else if(x<=0){
                        //left
                        doResult(GESTURE_LEFT); 
                    }
                }
            }else{
                //gesture down or up
                if(y > y_limit || y < -y_limit){
                    if(y>0){
                        //down
                        doResult(GESTURE_DOWN); 
                    }else if(y<=0){
                        //up
                        doResult(GESTURE_UP); 
                    }
                }
            }
            return true;
        }
        
    };
    public void doResult(int result)
    {
        if(onGestureResult!=null)
        {
            onGestureResult.onGestureResult(result);
        }
    }
    
    public interface OnGestureResult
    {
        public void onGestureResult(int direction);
    }
}

手勢使用的示例:

package com.gesture;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.Toast;
 
public class GesturetestActivity extends Activity {
    /** Called when the activity is first created. */
 
    private GestureDetector gestureDetector;  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        gestureDetector = new BuileGestureExt(this,new BuileGestureExt.OnGestureResult() {
            @Override
            public void onGestureResult(int direction) {
                show(Integer.toString(direction));
            }
        }
        ).Buile();
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
    private void show(String value){
        Toast.makeText(this, value, Toast.LENGTH_SHORT).show();
    }
 
     
}


另一個代碼:


android.view.GestureDetector

android.view.GestureDetector.SimpleOnGestureListener



public class AutoFile extends Activity implements OnTouchListener{
  private GestureDetector gd1;

  private MyGesture mg1;

  private ViewFlipper vf1 =null;

  mg1 = new MyGesture();

  gd1 = new GestureDetector(AutoFile.this,mg1);

  tv2.setOnTouchListener(this);

  tv2.setLongClickable(true);

  public class MyGesture implements GestureDetector.OnGestureListener

  {

  @Override

  public boolean onDown(MotionEvent arg0) {  //下滑時觸發

  // TODO Auto-generated method stub

  bt6.setText("onDown");

  return false;

  }

  @Override

  public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,  //上滑時觸發

  float arg3) {

  // TODO Auto-generated method stub

  bt6.setText("onFling");

  return true;

  }

  @Override

  public void onLongPress(MotionEvent arg0) {      //長時間按住時觸發

  // TODO Auto-generated method stub

  }

  @Override

  public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,   //滑動時觸發

  float arg3) {

  // TODO Auto-generated method stub

  bt6.setText("onScroll");

  return false;

  }

  @Override

  public void onShowPress(MotionEvent arg0) {

  // TODO Auto-generated method stub

  }

  @Override

  public boolean onSingleTapUp(MotionEvent arg0) {

  // TODO Auto-generated method stub

  return false;

  }

  }//myges class

  @Override

  public boolean onTouch(View arg0, MotionEvent arg1) {

  // TODO Auto-generated method stub

  return gd1.onTouchEvent(arg1);

  //return true;

  }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章