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代码。