手势识别

很多时候,一个好的用户界面能够吸引用户的眼球。现在我们经常看到一些好的界面都带有滑动、滚动等效果。但是触摸屏是不可能产生滚动、滑动的消息的,需要根据其运动的轨迹用算法去判断实现。在Android系统中,android.view.GestureDetector来实现手势的识别,我们只需要实现其GestureDetector.OnGestureListener接口来侦听GestureDetector识别后的事件。我们需要在onTouchEvent,GestureDetector的onTouchEvent方法是进行轨迹识别。

代码如下:

import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
public class TestEvent extends Activity {
    /** Called when the activity is first created. */
    
    TextView     m_eventType;
    int oldevent = -1;
    private GestureDetector gestureDetector= new GestureDetector(new OnGestureListener()
    {
            
        // 鼠标按下的时候,会产生onDown。由一个ACTION_DOWN产生。
        public boolean onDown(MotionEvent event) {
            
            DisplayEventType("mouse down" + " " + event.getX() + "," + event.getY());
            return false;
        }
        // 用户按下触摸屏、快速移动后松开,这个时候,你的手指运动是有加速度的。
        // 由1个MotionEvent ACTION_DOWN,  
        // 多个ACTION_MOVE, 1个ACTION_UP触发  
        // e1:第1个ACTION_DOWN MotionEvent  
        // e2:最后一个ACTION_MOVE MotionEvent  
        // velocityX:X轴上的移动速度,像素/秒  
        // velocityY:Y轴上的移动速度,像素/秒 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
                float velocityY) {
            DisplayEventType("onFling");
            return false;
        }
        // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发  
        public void onLongPress(MotionEvent event) {
            DisplayEventType("on long pressed");
        }
        // 滚动事件,当在触摸屏上迅速的移动,会产生onScroll。由ACTION_MOVE产生
        // e1:第1个ACTION_DOWN MotionEvent
        // e2:最后一个ACTION_MOVE MotionEvent  
        // distanceX:距离上次产生onScroll事件后,X抽移动的距离
        // distanceY:距离上次产生onScroll事件后,Y抽移动的距离
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
                float distanceY) {
            DisplayEventType("onScroll" + " " + distanceX + "," + distanceY);
            return false;
        }
        //点击了触摸屏,但是没有移动和弹起的动作。onShowPress和onDown的区别在于
        //onDown是,一旦触摸屏按下,就马上产生onDown事件,但是onShowPress是onDown事件产生后,
        //一段时间内,如果没有移动鼠标和弹起事件,就认为是onShowPress事件。
        public void onShowPress(MotionEvent event) {
            DisplayEventType("pressed");
            
        }
        // 轻击触摸屏后,弹起。如果这个过程中产生了onLongPress、onScroll和onFling事件,就不会
        // 产生onSingleTapUp事件。
        public boolean onSingleTapUp(MotionEvent event) {
            DisplayEventType("Tap up");
            return false;
        }
        
    });
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        m_eventType = (TextView)this.findViewById(R.id.eventtype);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        if(gestureDetector.onTouchEvent(event))
            return true;
        else
            return false;
    }
    
}

 

posted @ 2014-10-16 01:05  MMLoveMeMM  阅读(178)  评论(0)    收藏  举报