整个Android应用的触摸事件

5

我正在开发一款新应用程序,我有一个疑问是否可能实现以下功能:

我们需要为整个应用程序设置一次监听器,并且当应用程序中的任何触摸事件发生时运行一组代码。 例如,我们的应用程序中可能会有n个活动,但我们需要为所有活动设置一次监听器,并在任何n个活动中发生触摸事件时运行一组代码。 我已经尝试了很多方法,欢迎任何想法。 提前致谢。


“接收广播”是什么意思?接收到哪里? - dor506
我改了我的问题,你现在能理解吗? - Chris
6个回答

3

我希望我理解得没错。

你可以创建一个扩展了Activity的类,比如叫TouchActivity。 然后每个你的活动都会继承TouchActivity。

 public class TouchActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            Log.d("Touch", "Touch");
            sendBroadcast(new Intent("touch_event_has_occured"));
        }

        return super.onTouchEvent(event);
    }
}

现在在您的全局广播接收器中,您将收到该广播。

public class TouchReveiver extends BroadcastReceiver 
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        if (intent.getAction().equals("touch_event_has_occured"))
        {
            Log.d("Touch", "Touch");
        }
    }

}

不要忘记将接收器与操作一起注册。

如何使用此操作注册接收器?我像下面这样做: ``` - Md. Masum Billah

2
你可以创建一个自定义视图,它是不可见的,占据整个屏幕,并使用onTouchEvent执行你需要做的任何操作。
然后,你需要让每个布局文件在顶部包含该视图(可能在FrameLayout中)。

1
你可以创建一个基础活动类,让所有应用程序中的其他活动都继承它。然后,你可以在这个基础活动中重写public boolean dispatchTouchEvent (MotionEvent ev)方法。这个重写的实现将是所有触摸事件落脚的唯一位置。
但是有一个重要的注意事项,它只适用于所有活动都是相同类型的情况(例如-它们都是Activitiy类型或者都是ListActivity类型)。

你的答案是唯一一个对我有用的,谢谢! - Gilian Marques

0
如果您想在整个应用程序中使用此功能,您需要创建一个继承自ActionBarActivity(或SherlockActivity)的类。
public class MyCustomActivity extends ActionBarActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FrameLayout decorView = (FrameLayout) getActivity().getWindow().getDecorView();
        decorView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "Click X:" + event.getX() + " Y:" + event.getY());
                return false;
            }
        });
    }
}

然后从MyCustomActivity扩展所有其他活动:

public class MainActivity extends MyCustomActivity{ }

然后所有的触摸事件都将通过您的TouchListener事件处理


0

完全可以。

创建一个名为MyTouchActivity(或其他名称)的活动,覆盖onTouch事件并编写你所说的set代码。

现在,所有其余的n个活动应该扩展MyTouchActivity而不是常规活动。这样,该代码将继承到您的所有n个活动中。您需要创建单独的MyTouchListActivity(用于ListActivity)和MyTouchMapActivity(用于MapActivity)。

另一种方法是简单地创建一个Ontouch监听器,然后覆盖每个活动中的onTocuh事件以首先调用您的监听器。但那很麻烦。


它能够工作,但如果我在任何一个活动中添加一个按钮并且点击该按钮,则ontouch事件将无法工作! - Chris
@Srinivas,抱歉,你能具体说明一下吗?按钮没有响应点击吗?你注册了onClickListeners吗?在onTouch中,你返回了false吗?如果你返回true,触摸事件将不会传递到组件(例如按钮等),请确保你返回false或者super.onTouch() - st0le
当我在ontouchevent()中打印日志时,它会在触摸空屏幕时打印该日志,但是当我点击同一屏幕上的按钮时,它不会打印。 - Chris
@Srinivas,啊,我想相反的情况发生了,触摸事件首先被赋予给组件,然后再传递到活动。现在按钮已经重写了Touch,所以当你点击它时,它不会将该事件向上传递到活动中。我认为你需要创建一个全局的OnTouchListener,并为你想要拦截的每个组件设置它。 - st0le

0

使用dispatchTouchEventonTouch方法的解决方案并不适用于整个应用程序。因为有不同类型的窗口。例如,如果弹出一个片段或用户点击菜单,则这些解决方案将无法捕获触摸事件,因为在这些情况下会发生其他事情。

长话短说,我在处理我的毕业项目时遇到了这个问题,并开发了一个库,能够收集应用程序的所有触摸事件。该库依赖于一些巧妙的方式,但它确实有效。该库是开源的。如果您想要查看它,请访问:https://github.com/fatih-iver/touchy

只需将其添加为依赖项:

implementation 'fun.observe:touchy:1.0.0'

然后,通过注册您的接收器来使用它:

MotionEventBroadcaster.registerReceiver(new MotionEventReceiver() {
    @Override
    protected void onReceive(MotionEvent motionEvent) {
        Log.d(TAG, motionEvent.toString());
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接