Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在视图上添加多个手势,不起作用_Android_Android Animation_Android Gesture - Fatal编程技术网

Android 在视图上添加多个手势,不起作用

Android 在视图上添加多个手势,不起作用,android,android-animation,android-gesture,Android,Android Animation,Android Gesture,我试图在一个视图中添加多个手势。我已经成功地让它们分别工作,但当我合并时,只有一个最终工作,我做错了什么 我要添加的第一个手势是缩放手势: public class MyScaleGestures implements View.OnTouchListener, ScaleGestureDetector.OnScaleGestureListener { private View view; private ScaleGestureDetector gestureS

我试图在一个视图中添加多个手势。我已经成功地让它们分别工作,但当我合并时,只有一个最终工作,我做错了什么

我要添加的第一个手势是缩放手势:

public class MyScaleGestures implements View.OnTouchListener, ScaleGestureDetector.OnScaleGestureListener {
        private View view;
        private ScaleGestureDetector gestureScale;
        private float scaleFactor = 1;
        private boolean inScale = false;

        public MyScaleGestures (Context c){ gestureScale = new ScaleGestureDetector(c, this); }

        @Override
        public boolean onTouch(View view, MotionEvent event) {
            this.view = view;
            gestureScale.onTouchEvent(event);
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            scaleFactor *= detector.getScaleFactor();
            Log.d(TAG, "onScale: " + scaleFactor);
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) { inScale = false; }
    }
我的第二个手势是一个
SimpleNogestureListener

 private class FlingGestureDetector extends GestureDetector.SimpleOnGestureListener {
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                

                return true;
            }

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

                return true;
            }
        }
将两者合并为一个类:

public class OnSwipeTouchListener implements View.OnTouchListener, ScaleGestureDetector.OnScaleGestureListener {

        private final GestureDetector gestureDetector;
        private ScaleGestureDetector gestureScale;

        private OnSwipeTouchListener(Context context) {
            gestureDetector = new GestureDetector(context, new FlingGestureDetector());
            gestureScale = new ScaleGestureDetector(context, this);
        }

        public boolean onTouch(View v, MotionEvent event) {
            gestureDetector.onTouchEvent(event);
            gestureScale.onTouchEvent(event);
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            Log.d(TAG, "onScale: " + detector.getScaleFactor());
            return false;
        }
使用它:

sceneView.setOnTouchListener(新的OnSwipeTouchListener(this))

将它们组合在一起后,第一个手势中只有一个可以工作
(手势检测器)
。我怎样才能让两个人都听风景呢


组合它们时,在
gestureScale
中执行
pinch
操作时,不会调用
onScale
方法。但是,当我不包含其他手势时,它会单独工作。

您需要将所有手势打包到一个
ontouch listener
类中,并实现您的逻辑

在下面的例子中,我遗漏了所有的参数。你应该按照你的要求提供所有这些

import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

class MyGesture implements View.OnTouchListener {
    private View view;
    private MyDetector myDetector;

    private ScaleGestureDetector scaleDetector;
    private GestureDetector gestureDetector;

    public MyGesture(View view, MyDetector myDetector) {
        this.view = view;
        this.myDetector = myDetector;

        initialGestures();
    }

    private void initialGestures() {
        scaleDetector = new ScaleGestureDetector(
                view.getContext(),
                new ScaleGestureDetector.SimpleOnScaleGestureListener() {
                    @Override
                    public boolean onScale(ScaleGestureDetector detector) {
                        myDetector.onScale();
                        return true;
                    }
                });

        gestureDetector = new GestureDetector(
                view.getContext(),
                new GestureDetector.SimpleOnGestureListener() {
                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                        myDetector.onFling();
                        return false;
                    }
                });
    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        scaleDetector.onTouchEvent(event);
        return true;
    }


    interface MyDetector {
        void onScale();

        void onFling();
    }
}
并使用它:

myView.setOnTouchListener(new MyGesture(myView, new MyGesture.MyDetector() {
    @Override
    public void onScale() {
        // do sth
    }

    @Override
    public void onFling() {
        // do sth
    }
}));

为什么
view.getContext()
总是等于
null
?我通过onCreate方法
sceneView=findviewbyd(R.id.sceneView)中已经创建的视图传递了它
sceneView.setOnTouchListener(新手势(sceneView
@DIRTYDAVE onCreate在哪里?我写它是为了一个视图。它在片段或活动中都不重要。它们都返回到MainActivity作为上下文,但对于视图,从其父级获取上下文更好。试试我的代码我认为您的视图为空,并且您正在寻找具有非关联id的视图。检查XML和java中的视图id代码。