检测附加手势 [英] Detecting additional gestures

查看:254
本文介绍了检测附加手势的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我用这个来检测左/右轻扫,然后点击的手势。

  @覆盖
公共布尔onTouchEvent(MotionEvent事件){
    INT行动= event.getAction();
    开关(动作){
        案例MotionEvent.ACTION_DOWN:
            touchBegan(事件);
            返回true;
        案例MotionEvent.ACTION_MOVE:
            touchMoved(事件);
            返回true;
        案例MotionEvent.ACTION_UP:
            touchEnded(事件);
            返回true;
    }    返回false;
}私人无效touchBegan(MotionEvent事件)
{
    浮X = event.getX();
    mTouchStartX = X;
    mTouchStartY = event.getY();
    mStartTime = AnimationUtils.currentAnimationTimeMillis();
    mStartOffset = mOffset;    mTouchMoved = FALSE;    mTouchStartPos =(X / mWidth)* MOVE_POS_MULTIPLE - 5;
    mTouchStartPos / = 2;    mVelocity = VelocityTracker.obtain();
    mVelocity.addMovement(事件);
}私人无效touchMoved(MotionEvent事件){
    浮动POS =(event.getX()/ mWidth)* MOVE_POS_MULTIPLE - 5;
    正/ = 2;    如果(!mTouchMoved){
        浮DX = Math.abs(event.getX() - mTouchStartX);
        浮DY = Math.abs(event.getY() - mTouchStartY);        如果(DX< TOUCH_MINIMUM_MOVE&放大器;&安培; DY< TOUCH_MINIMUM_MOVE)
            返回;        mTouchMoved = TRUE;
    }    mOffset = mStartOffset + mTouchStartPos - POS;    无效();
    mVelocity.addMovement(事件);
}私人无效touchEnded(MotionEvent事件){
    浮动POS =(event.getX()/ mWidth)* MOVE_POS_MULTIPLE - 5;
    正/ = 2;    如果(mTouchMoved){
        mStartOffset + = mTouchStartPos - POS;
        mOffset = mStartOffset;        mVelocity.addMovement(事件);        mVelocity.computeCurrentVelocity(1000);
        倍速= mVelocity.getXVelocity();        速度=(速度/ mWidth)* MOVE_SPEED_MULTIPLE;
        如果(速度> MAX_SPEED)
            速度= MAX_SPEED;
        否则,如果(速度< -MAX_SPEED)
            速度= -MAX_SPEED;
        startAnimation( - 速度);
    }其他{
        如果(mTouchRect!= NULL){
            //布尔测试= RectF.intersects(mTouchRect,新
            // RectF(event.getX(),event.getY(),10,10));
            如果(mCoverFlowListener = NULL&放大器;!&安培; topImageClickEnable){
                mCoverFlowListener.topImageClicked(这一点,
                        getActuallyPosition((int)的mOffset));
            }
        }
    }
    mVelocity.clear();
    mVelocity.recycle();
}

但现在我要整合向上/向下轻扫+ onlongclick事件。
你能给我任何时候怎么办呢?


解决方案

 公共类MainActivity延伸活动{    字符串LOGTAG =MainActivity;
    布尔isSwipe = FALSE;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        最后SwipeGestureDetector swipeGestureDetector =新SwipeGestureDetector();
        最后GestureDetector gestureDetector =新GestureDetector(这一点,
                swipeGestureDetector);
        ImageView的ImageView的=(ImageView的)findViewById(R.id.imageView);
        View.OnTouchListener gestureListener =新View.OnTouchListener(){
            @覆盖
            公共布尔onTouch(视图V,MotionEvent事件){
                返回gestureDetector.onTouchEvent(事件);
            }
        };        //连接监听器监听视图上的手势。例如。一个ImageView的
        imageView.setOnTouchListener(gestureListener);
        //里面长按监听器是否已经检测到刷卡,我们首先检查。
        //返回false,如果我们想消费刷卡事件
        // true,如果我们要消耗长按事件。
        //可以用类似的方式设置的点击监听器了。
        imageView.setOnLongClickListener(新View.OnLongClickListener(){            @覆盖
            公共布尔onLongClick(视图v){
                如果(isSwipe){
                    Log.d(LOGTAG,刷卡里面长按);
                    返回false;
                }其他{
                    Log.d(LOGTAG,长按);
                    返回true;
                }
            }
        });
    }    类SwipeGestureDetector扩展SimpleOnGestureListener {        @覆盖
        公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,
                浮动velocityY){            开关(getSlope(e1.getX(),e1.getY(),e2.getX(),e2.getY())){
            情况下0:
                isSwipe = FALSE;
                返回false;
            情况1:
                Log.d(LOGTAG,顶);
                isSwipe =真;
                返回true;
            案例2:
                Log.d(LOGTAG,左);
                isSwipe =真;
                返回true;
            案例3:
                Log.d(LOGTAG,下);
                isSwipe =真;
                返回true;
            情况4:
                Log.d(LOGTAG,右);
                isSwipe =真;
                返回true;
            }
            返回false;
        }        私人诠释getSlope(浮点X1,Y1浮球,浮球X2,Y2浮动){
            最后ViewConfiguration VC = ViewConfiguration
                    获得(getApplicationContext());
            最终诠释swipeMaxOffPath = vc.getScaledTouchSlop();
            双角= Math.toDegrees(Math.atan2(Y1 - Y2,X2 - X1));
            如果(角度> 45安培;&安培;角α= 135){
                // 最佳
                如果(Math.abs(Y2 - Y1)GT; swipeMaxOffPath)
                    返回1;
            }
            如果(角度> = 135安培;&安培;角α180 ||角α; -135&放大器;&安培;角GT; -180){
                // 剩下
                如果(Math.abs(X2 - X1)> swipeMaxOffPath)
                    返回2;
            }
            如果(角α; -45安培;&安培;角GT = -135){
                如果(Math.abs(Y2 - Y1)GT; swipeMaxOffPath)
                    返回3;
            }            如果(角度> = -45安培;&安培;角α= 45){//权                如果(Math.abs(X2 - X1)> swipeMaxOffPath)
                    返回4;
            }
            返回0;
        }
    }
}

Hello I am using this to detect left/right swipe and click gesture.

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();
    switch (action) {
        case MotionEvent.ACTION_DOWN:
            touchBegan(event);
            return true;
        case MotionEvent.ACTION_MOVE:
            touchMoved(event);
            return true;
        case MotionEvent.ACTION_UP:
            touchEnded(event);
            return true;
    }

    return false;
}

private void touchBegan(MotionEvent event)
{
    float x = event.getX();
    mTouchStartX = x;
    mTouchStartY = event.getY();
    mStartTime = AnimationUtils.currentAnimationTimeMillis();
    mStartOffset = mOffset;

    mTouchMoved = false;

    mTouchStartPos = (x / mWidth) * MOVE_POS_MULTIPLE - 5;
    mTouchStartPos /= 2;

    mVelocity = VelocityTracker.obtain();
    mVelocity.addMovement(event);
}

private void touchMoved(MotionEvent event) {
    float pos = (event.getX() / mWidth) * MOVE_POS_MULTIPLE - 5;
    pos /= 2;

    if (!mTouchMoved) {
        float dx = Math.abs(event.getX() - mTouchStartX);
        float dy = Math.abs(event.getY() - mTouchStartY);

        if (dx < TOUCH_MINIMUM_MOVE && dy < TOUCH_MINIMUM_MOVE)
            return;

        mTouchMoved = true;
    }

    mOffset = mStartOffset + mTouchStartPos - pos;

    invalidate();
    mVelocity.addMovement(event);
}

private void touchEnded(MotionEvent event) {
    float pos = (event.getX() / mWidth) * MOVE_POS_MULTIPLE - 5;
    pos /= 2;

    if (mTouchMoved) {
        mStartOffset += mTouchStartPos - pos;
        mOffset = mStartOffset;

        mVelocity.addMovement(event);

        mVelocity.computeCurrentVelocity(1000);
        double speed = mVelocity.getXVelocity();

        speed = (speed / mWidth) * MOVE_SPEED_MULTIPLE;
        if (speed > MAX_SPEED)
            speed = MAX_SPEED;
        else if (speed < -MAX_SPEED)
            speed = -MAX_SPEED;
        startAnimation(-speed);
    } else {
        if (mTouchRect != null) {
            // boolean test = RectF.intersects(mTouchRect, new
            // RectF(event.getX(),event.getY(),10,10));
            if (mCoverFlowListener != null && topImageClickEnable) {
                mCoverFlowListener.topImageClicked(this,
                        getActuallyPosition((int) mOffset));
            }
        }
    }
    mVelocity.clear();
    mVelocity.recycle();
}

But now I want to integrate up/down swipe + onlongclick event. Can you give me any point how to do it ?

解决方案

public class MainActivity extends Activity {

    String LOGTAG = "MainActivity";
    Boolean isSwipe = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final SwipeGestureDetector swipeGestureDetector = new SwipeGestureDetector();
        final GestureDetector gestureDetector = new GestureDetector(this,
                swipeGestureDetector);
        ImageView imageView = (ImageView) findViewById(R.id.imageView);
        View.OnTouchListener gestureListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        };

        // Attach listener to listen for gestures on a view. eg. an ImageView 
        imageView.setOnTouchListener(gestureListener);


        //inside long click listener we first check if a swipe has been detected.
        //return false if we want to consume the swipe event
        //true if we want to consume the long click event. 
        //You can set a click listener too in a similar way. 
        imageView.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                if (isSwipe) {
                    Log.d(LOGTAG, "Swipe inside long click");
                    return false;
                } else {
                    Log.d(LOGTAG, "Long Click");
                    return true;
                }
            }
        });
    }

    class SwipeGestureDetector extends SimpleOnGestureListener {

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {

            switch (getSlope(e1.getX(), e1.getY(), e2.getX(), e2.getY())) {
            case 0:
                isSwipe = false;
                return false;
            case 1:
                Log.d(LOGTAG, "top");
                isSwipe = true;
                return true;
            case 2:
                Log.d(LOGTAG, "left");
                isSwipe = true;
                return true;
            case 3:
                Log.d(LOGTAG, "down");
                isSwipe = true;
                return true;
            case 4:
                Log.d(LOGTAG, "right");
                isSwipe = true;
                return true;
            }
            return false;
        }

        private int getSlope(float x1, float y1, float x2, float y2) {
            final ViewConfiguration vc = ViewConfiguration
                    .get(getApplicationContext());
            final int swipeMaxOffPath = vc.getScaledTouchSlop();
            Double angle = Math.toDegrees(Math.atan2(y1 - y2, x2 - x1));
            if (angle > 45 && angle <= 135) {
                // top
                if (Math.abs(y2 - y1) > swipeMaxOffPath)
                    return 1;
            }
            if (angle >= 135 && angle < 180 || angle < -135 && angle > -180) {
                // left
                if (Math.abs(x2 - x1) > swipeMaxOffPath)
                    return 2;
            }
            if (angle < -45 && angle >= -135) {
                if (Math.abs(y2 - y1) > swipeMaxOffPath)
                    return 3;
            }

            if (angle >= -45 && angle <= 45) { // right

                if (Math.abs(x2 - x1) > swipeMaxOffPath)
                    return 4;
            }
            return 0;
        }
    }
}

这篇关于检测附加手势的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆