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

Posted

技术标签:

【中文标题】无法在 Android 中的 FrameLayout 上检测手势【英文标题】:Can't Detect Gesture on a FrameLayout in Android 【发布时间】:2012-02-09 22:04:41 【问题描述】:

我想在 android 中实现一个全局 NavigationBar 小部件,扩展 FrameLayout ,这样它就可以在布局 xml 中声明,而不是包含在每个活动中。

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

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 中的 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。

【问题讨论】:

【参考方案1】:

我通过阅读 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 中的 FrameLayout 上检测手势的主要内容,如果未能解决你的问题,请参考以下文章

无法解析 Android Studio 中的依赖项

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

无法访问android中的视图

无法在android中的应用购买产品数据中显示

无法取消 Android 中的当前闹钟

无法在 detox 中的 android 日期选择器中选择 month_view 中的日期