android的Gesture使用

非应用开发,所以对基本控件理解比较浅显。高手略过。

Gesture,即手势,基于touch事件。理论上说通过截获onTouch事件也是可以实现的,但封装了这个类后,相当于系统会帮你去计算这次touch是做了什么事情,只是touchdown了一下,还是fling了,或是scroll了。写了一个简单demo便于理解。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "AndroidDemo";
    private Button mClick;
    private LinearLayout mLayout = null;
    private TextView mTv = null;
    private GestureDetector mGesture = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.d(TAG, "Android Demo onCreate");
        createViewByCode();

        mGesture = new GestureDetector(this, new MyGestureDetector());
    }

    private void createViewByCode() {
        mLayout = new LinearLayout(this);
        mLayout.setLayoutParams(new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        mLayout.setOrientation(LinearLayout.VERTICAL);

        mTv = new TextView(this);
        mTv.setText("Hello code");
        mTv.setTextSize(19);
        LayoutParams  params = new LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        mLayout.addView(mTv, params);

        setContentView(mLayout);

    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG, "activity onTouchEvent");
        mGesture.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.d(TAG, "activity dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }

    class MyGestureDetector extends GestureDetector.SimpleOnGestureListener{

        @Override
        public boolean onDown(MotionEvent e) {
            Log.d(TAG, "MyGestureDetector onDown x=" + e.getRawX() + ", y=" + e.getRawY());
            return super.onDown(e);
        }

        @Override
        public void onShowPress(MotionEvent e) {
            Log.d(TAG, "MyGestureDetector onShowPress x=" + e.getRawX() + ", y=" + e.getRawY());
            super.onShowPress(e);
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.d(TAG, "MyGestureDetector onSingleTapUp x=" + e.getRawX() + ", y=" + e.getRawY());
            return super.onSingleTapUp(e);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.d(TAG, "MyGestureDetector onScroll distanceX=" + distanceX + ", distanceY=" + distanceY);
            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public void onLongPress(MotionEvent e) {
            Log.d(TAG, "MyGestureDetector onLongPress ");
            super.onLongPress(e);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.d(TAG, "MyGestureDetector onFling velocityX=" + velocityX + ", velocityY=" + velocityY);
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }
}

使用的是GestureDetector类,官方文档的解释是

/**
 * Detects various gestures and events using the supplied {@link MotionEvent}s.
 * The {@link OnGestureListener} callback will notify users when a particular
 * motion event has occurred. This class should only be used with {@link MotionEvent}s
 * reported via touch (don't use for trackball events).

 */

即特定的手势产生时,就会notify使用者,即回调。

它有两个listener接口,OnGestureListener和OnDoubleTapListener。如果你直接使用这两个接口,就要全部实现它。所以就有了一个简单地空实现,SimpleOnGestureListener,只需要你实现你需要的部分就可以了。

具体的回调有:
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那

你需要哪个动作,就Override哪个callback就可以了。


如何使用呢?

GestureDetector也是基于MotionEvent的,所以要在activity/viewgroup/view的onTouchEvent回调中调用GestureDetector.onTouchEvent()。如上面的代码中

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG, "activity onTouchEvent");
        mGesture.onTouchEvent(event);
        return super.onTouchEvent(event);
    }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值