无法检测 Android 中 FrameLayout 上的手势
我想在 android 中实现一个全局 NavigationBar Widget,扩展 FrameLayout ,以便它可以只在布局 xml 中声明,而不是包含在每个活动中。
NavigationBar 具有三个组件:Logo、Title、Button 当触摸或向下滑动导航栏(不包括按钮)时,我会显示一些内容。但是现在我的 onFling 手势无法被检测到(SwipeGestureListener 中的 OnFling 已经测试过),任何人都可以帮助我。
类 NavigationBar:
public class NavigationBarWidget extends FrameLayout implements View.OnClickListener
private SwipeGestureListener mSwipeListener = new SwipeGestureListener();
private GestureDetector mGestureDetector;
NavigationBarWidget():
mGestureDetector = new GestureDetector(mSwipeListener);
this.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.v("Nav", "onTouch");
return mGestureDetector.onTouchEvent(event);
}
});
OnClick():
@Override
public void onClick(View paramView)
{
if(paramView.getId()== mShareIcon.getId()){
AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}else{
Log.v("Nav", "onClick");
}
}
SwipeGestureListener 中的
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.v("Nav", "onFling");
try {
if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
{
return false;
}
else
{
if ((e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)) {
this.mCallbackListener.onFlingDown();
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
onFling(): Logcat:当 Touch 或 Fling Down navigationBar 时,已输出“onTouch”,但未检测到手势 onFling。
I want to implement a global NavigationBar Widget in android , extends FrameLayout , so that it can just declare in layout xml , not to include in every activity.
The NavigationBar has three components:Logo , Title , Button
When touch or fling down on NavgationBar(Not Including Button),I will show something.But now my onFling gesture can`t be detected(OnFling in SwipeGestureListener have been tested),any one can help me.
Class NavigationBar:
public class NavigationBarWidget extends FrameLayout implements View.OnClickListener
private SwipeGestureListener mSwipeListener = new SwipeGestureListener();
private GestureDetector mGestureDetector;
NavigationBarWidget():
mGestureDetector = new GestureDetector(mSwipeListener);
this.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.v("Nav", "onTouch");
return mGestureDetector.onTouchEvent(event);
}
});
OnClick():
@Override
public void onClick(View paramView)
{
if(paramView.getId()== mShareIcon.getId()){
AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}else{
Log.v("Nav", "onClick");
}
}
onFling() in SwipeGestureListener:
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.v("Nav", "onFling");
try {
if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
{
return false;
}
else
{
if ((e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)) {
this.mCallbackListener.onFlingDown();
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
Logcat:When Touch or Fling Down navigationBar , "onTouch" have been output , but gesture onFling are not detected.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我通过阅读 Android 开发者博客上的一篇文章自己解决了这个问题:
理解多点触控。
解决方案是让 GestureDetector 处理手势,您可以像这样处理触摸事件:
当我在 NavigationBarWidget 上向下滑动时,日志将是:
onTouch->onDown->onTouch(多少次onTouch到按住屏幕的时间)->onFlingDown->onUp
I solved it myself by reading a post on Android Developer Blog:
Making Sense of Multitouch.
The Solution is Let GestureDetector handle the gesture, you can handle touch event then like this:
When I Fling Down over The NavigationBarWidget the log will be:
onTouch->onDown->onTouch(how many onTouch up to how long you keep press on the screen)->onFlingDown->onUp