我想得到fling 手势检测在我的 Android 应用程序中工作。
我拥有的是 GridLayout 包含 9 ImageView s。来源可以在这里找到:Romain Guys's Grid Layout .
我拿的那个文件来自 Romain Guy 的 Photostream application并且只是稍作改编。
对于简单的点击情况,我只需要设置 onClickListener 对于每个 ImageView 我加为主要activity 实现View.OnClickListener .实现识别 fling 的东西似乎要复杂得多。 .我想这是因为它可能跨越 views ?
如果我的 Activity 实现OnGestureListener 我不知道怎么做 将其设置为手势监听器Grid 或 Image 我的观点 添加。
public class SelectFilterActivity extends Activity implements
View.OnClickListener, OnGestureListener { ...
如果我的 Activity 实现OnTouchListener 那么我没有onFling 方法 override (它有 两个事件作为参数允许我 来确定 throw 是否是 值得注意)。
public class SelectFilterActivity extends Activity implements
View.OnClickListener, OnTouchListener { ...
如果我定制 View ,如 GestureImageView 扩展 ImageView 我不知道如何告诉 Activity fling 从 View 中已经发生。无论如何,我尝试了这个,当我触摸屏幕时没有调用这些方法。 我真的只需要一个跨 View 工作的具体示例。什么,何时以及如何附上这个 listener ?我还需要能够检测到单击。
// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
if (velocityX > 0) {
moveRight();
} else {
moveLeft();
}
return true;
} else {
return false;
}
}
});
是否可以在我的屏幕顶部放置一个透明 View 来捕捉一闪而过?
如果我选择不inflate 我的子 ImageView 来自 XML 我可以通过 GestureDetector 作为 ImageView 的新子类的构造函数参数我创造的?
这是我试图获得 fling 的非常简单的 Activity 。检测工作:SelectFilterActivity (Adapted from photostream) .
我一直在寻找这些来源: Detect Gestures - Tutorial SDK docs Calculator Code 到目前为止,没有什么对我有用,我希望得到一些指示。
Best Answer-推荐答案
感谢 Code Shogun ,我根据自己的情况调整了他的代码。
让您的 Activity 实现OnClickListener 照常:
public class SelectFilterActivity extends Activity implements OnClickListener {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* ... */
// Gesture detection
gestureDetector = new GestureDetector(this, new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// nothing
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
}
将您的手势监听器附加到您添加到主布局的所有 View ;
// Do this for each view added to the grid
imageView.setOnClickListener(SelectFilterActivity.this);
imageView.setOnTouchListener(gestureListener);
敬畏地观看你被覆盖的方法,onClick(View v) Activity 和onFling 手势监听器。
public void onClick(View v) {
Filter f = (Filter) v.getTag();
FilterFullscreenActivity.show(this, input, f);
}
后“ throw ”舞蹈是可选的,但鼓励。
关于android - 网格布局上的 Fling 手势检测,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/937313/
|