gpt4 book ai didi

android - 无法在 Android 中的 FrameLayout 上检测手势

转载 作者:行者123 更新时间:2023-11-29 02:08:11 26 4
gpt4 key购买 nike

我想在 android 中实现一个全局的 NavigationBar Widget,扩展 FrameLayout ,这样它就可以只在布局 xml 中声明,而不是包含在每个 Activity 中。

NavigationBar 包含三个组件:Logo , Title , Button当在NavgationBar(不包括按钮)上触摸或向下滑动时,我会显示一些东西。但是现在无法检测到我的onFling手势(SwipeGestureListener中的OnFling已经测试过),任何人都可以帮助我。

导航栏类:

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);
}
});

点击():

@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 中的 onFling():

@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:当Touch或Fling Down navigationBar时,已经输出了“onTouch”,但是没有检测到手势onFling。

最佳答案

我自己通过阅读 Android 开发者博客上的一篇文章解决了这个问题: Making Sense of Multitouch .

解决方案是让 GestureDetector 处理手势,然后您可以像这样处理触摸事件:

    mGestureDetector = new GestureDetector(mSwipeListener);

this.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.v("Nav", "onTouch");

mGestureDetector.onTouchEvent(event);
final int action = event.getAction();

switch (action) {
case MotionEvent.ACTION_DOWN:{
Log.v("Nav", "onDown");
break;
}
case MotionEvent.ACTION_UP:{
Log.v("Nav", "onUp");
break;
}
}

return true;
}
});

当我向下飞过 NavigationBarWidget 时,日志将是:onTouch->onDown->onTouch(多少次onTouch取决于你按住屏幕的时间)->onFlingDown->onUp

关于android - 无法在 Android 中的 FrameLayout 上检测手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8855034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com