Android View 长按、滑动、和点击同时进行,在View的onTouch

float xDown, yDown, xUp;
boolean isLongClickModule = false;
boolean isLongClicking = false;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    //当按下时处理
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        xDown = motionEvent.getX();
        yDown = motionEvent.getY();
        Log.v("OnTouchListener", "Down");

    } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {// 松开处理
        //获取松开时的x坐标
        if (isLongClickModule) {
            isLongClickModule = false;
            isLongClicking = false;
        }
        xUp = motionEvent.getX();

        Log.v("OnTouchListener", "Up");
        //按下和松开绝对值差当大于20时滑动,否则不显示
        if ((xUp - xDown) > 20) {
            //添加要处理的内容
            Toast.makeText(ShowPictureActivity.this, "scroll right", Toast.LENGTH_SHORT).show();
        } else if ((xUp - xDown) < -20) {
            Toast.makeText(ShowPictureActivity.this, "scroll left", Toast.LENGTH_SHORT).show();
            //添加要处理的内容
        } else if (0 == (xDown - xUp)) {
            int viewWidth = view.getWidth();
            if (xDown < viewWidth / 3) {
                //靠左点击
            } else if (xDown > viewWidth / 3 && xDown < viewWidth * 2 / 3) {
                //中间点击

            } else {
                //靠右点击
            }
            /**
             * not scroll
             */
            //showNavigation();
            Toast.makeText(ShowPictureActivity.this, "not scroll", Toast.LENGTH_SHORT).show();
        }
    } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
        //当滑动时背景为选中状态 //检测是否长按,在非长按时检测
        if (!isLongClickModule) {
            isLongClickModule = isLongPressed(xDown, yDown, motionEvent.getX(),
                    motionEvent.getY(), motionEvent.getDownTime(), motionEvent.getEventTime(), 300);
        }
        if (isLongClickModule && !isLongClicking) {
            //处理长按事件
            isLongClicking = true;
        }
    } else {
        //其他模式
    }
    return false;
}

        /* 判断是否有长按动作发生
    * @param lastX 按下时X坐标
    * @param lastY 按下时Y坐标
    * @param thisX 移动时X坐标
    * @param thisY 移动时Y坐标
    * @param lastDownTime 按下时间
    * @param thisEventTime 移动时间
    * @param longPressTime 判断长按时间的阀值
    */
private boolean isLongPressed(float lastX, float lastY,
                              float thisX, float thisY,
                              long lastDownTime, long thisEventTime,
                              long longPressTime) {
    float offsetX = Math.abs(thisX - lastX);
    float offsetY = Math.abs(thisY - lastY);
    long intervalTime = thisEventTime - lastDownTime;
    if (offsetX <= 10 && offsetY <= 10 && intervalTime >= longPressTime) {
        return true;
    }
    return false;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的View滑动灵敏度可以通过设置View滑动阈值来实现。可以通过设置View的setOnTouchListener方法,在OnTouchListener的回调函数中获取手指的滑动距离,并根据需要进行相应的处理。 例如,可以通过设置一个滑动距离阈值,当手指滑动距离超过该阈值进行滑动操作,可以实现View滑动灵敏度控制。具体实现方式可以参考以下代码示例: ``` view.setOnTouchListener(new View.OnTouchListener() { private float startX; private float startY; private float moveX; private float moveY; private float distanceX; private float distanceY; private int touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: moveX = event.getX(); moveY = event.getY(); distanceX = moveX - startX; distanceY = moveY - startY; if (Math.abs(distanceX) > touchSlop || Math.abs(distanceY) > touchSlop) { // 滑动距离超过阈值,进行相应的操作 // TODO: 进行滑动操作 } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: startX = 0; startY = 0; moveX = 0; moveY = 0; distanceX = 0; distanceY = 0; break; } return true; } }); ``` 在该代码中,我们通过获取手指在屏幕上的滑动距离,计算出滑动的横向和纵向距离,当滑动距离超过阈值,执行相应的滑动操作。可以通过调整touchSlop的值来控制滑动灵敏度的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值