确定多个视图中的哪个VIEW有手势(双击,向左滑动,向右滑动等)?

时间:2015-12-07 02:10:00

标签: android view gesture

我有一个水平多个relativelayout视图的滚动视图...一个用于数据库中的每个记录...以编程方式创建。

我需要确定哪些视图受某些手势影响...点击,双击,左/右滑动。

当然,CLICK我能够得到:

     RelativeLayout rlView = new RelativeLayout(this);
     rlView.setId(10000+myrecordid);
     rlView.setOnClickListener(myviewclick);

和myviewclick:

private View.OnClickListener myviewclick = new View.OnClickListener() {
    public void onClick(View v) {
        Integer i=v.getId()-10000;
        // Do some processing on this view
    }
};

根据我在网上找到的内容,我试图通过这种方式获得手势:

rlView.setOnTouchListener(myviewtouch);

使用此代码:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.i("MYLOG","double tap");
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i("MYLOG","SingleTapConfirmed");
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            Log.i("MYLOG","LongPress");
        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if (e1.getX()<e2.getX())
                Log.i("MYLOG","Fling Right");
            else
                Log.i("MYLOG","Fling Left");
            return true;
        }
    });
};

根据MYLOG,我正在根据需要采取适当的姿态。问题是,我不知道如何获取手势所在的视图ID。我知道它位于onTouch但是调用了gestureDetector.OnTouchEvent以确定动作...而我现在迷失了。

我在StackOverflow和其他网站上搜索了几个小时...他们都显示了如何确定手势的差异......但是无法找到关于使用我可以使用的多个视图的任何内容。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

我想我明白了。可能不是最优雅的方式,并且由于以这种方式处理它可能存在其他“问题”,但是现在它可以工作。但如果其他人发现了这个问题,我就是这样解决的:

以下是我修改后的代码的解决方法。我添加了一个名为vTouch的公共变量:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){
    public View vTouch;
    public boolean onTouch(View v, MotionEvent event) {
        vTouch=v;
        return gestureDetector.onTouchEvent(event);
    }

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Integer viewId=vTouch.getId();
            Log.i("MYLOG","double tap in view: "+viewId);
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Integer viewId=vTouch.getId();
            Log.i("MYLOG","SingleTapConfirmed in view: "+viewId);
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            Integer viewId=vTouch.getId();
            Log.i("MYLOG","LongPress in view: "+viewId);
        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Integer viewId=vTouch.getId();
            if (e1.getX()<e2.getX())
                Log.i("MYLOG","Fling Right in view: "+viewId);
            else
                Log.i("MYLOG","Fling Left in view: "+viewId);
            return true;
        }
    });
};

通过使用内部公共变量vTouch,我现在可以在每个手势事件中引用视图,其中需要手势恰好位于“视图”。