Android 在视图上禁用多点触控

Posted

技术标签:

【中文标题】Android 在视图上禁用多点触控【英文标题】:Android Disable Multitouch on Views 【发布时间】:2013-09-06 05:47:50 【问题描述】:

我面临多点触控问题。问题是我可以同时触摸屏幕上的两个按钮。 我知道这个问题在这个论坛上被问了好几次,唯一的解决方案是在你的父布局中声明 android:splitMotionEvents="false"。但是在宣布这一点之后,问题仍然存在。是硬件问题还是代码问题?此处的任何指针表示赞赏。

【问题讨论】:

您尝试过使用 android:windowEnableSplitTouch 吗?原因将 android:windowEnableSplitTouch="false" 或 android:splitMotionEvents="false" 设置为按钮所在的视图组,有效。 【参考方案1】:

出现此问题是因为从 android 4.0 开始,每个 onClick 都在一个新线程中执行。

我是如何解决的:

//1.创建自己的点击监听器

    public abstract class AbstractCarOnClickListener 
        protected static volatile boolean processing = false;
        protected void executeBlock() 
            ActivityUtil.scheduleOnMainThread(new Runnable() 
                public void run() 
                    processing=false;
                
            , 400);
        
    

//2.创建监听器的子类

public abstract class AppButtonsOnClickListener extends AbstractCarOnClickListener implements View.OnClickListener 

    public void onClick(View v) 
        if(processing) return;
        try
            processing=true;            
            onCarButtonClick(v);
         finally 
            executeBlock();
        
    
    public abstract void onCarButtonClick(View v);

//3.为您的视图设置监听器

    public void onClick(View v) 
         clickListener.onClick(v);
    

    public OnClickListener clickListener = new AppButtonsOnClickListener()
        public void onCarButtonClick(View v) 
            hintContainer.setVisibility(View.GONE);
            if (v == cancelButton) 
                listener.onCancelButtonClicked();
            
        
    

【讨论】:

【参考方案2】:

这对我有用。除了在每个包含按钮的 ViewGroup 上设置 android:splitMotionEvents="false" 我把它放在 MyAdapter.getView()...

    view.setOnTouchListener(new OnTouchListener() 
        @Override
        public boolean onTouch(View cell, MotionEvent event) 
            // Process touches only if: 1) We havent touched a cell, or 2) This event is on the touched cell
            if (mTouchedCell == null || cell.equals(mTouchedCell)) 
                int action = event.getAction();
                if (action == MotionEvent.ACTION_DOWN) 
                    cell.startAnimation(mShrink);
                    mTouchedCell = cell;
                 else if (action == MotionEvent.ACTION_CANCEL) 
                    if (cell.equals(mTouchedCell)) 
                        cell.startAnimation(mGrow);
                    
                    mTouchedCell = null;
                    return true;
                 else if (action == MotionEvent.ACTION_UP) 
                    cell.startAnimation(mFadeOut);
                    mTouchedCell = null;
                
                return false;
            
            return true;
        
    );

...当然这在适配器中...

private static View mTouchedCell = null;

【讨论】:

以上是关于Android 在视图上禁用多点触控的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Tableview (ios 7) 上禁用多点触控

如何在 UIPageViewController 上禁用多点触控?

有啥方法可以在 Android Emulator 上测试多点触控吗?

Android LinearLayout 多点触控

Android实现多点触控,自由缩放图片

android想要利用多点触控放大或者缩小一个view该怎么实现