我正在开发一个新的应用程序,我非常怀疑它是否可能?我的疑问是
我们必须为整个应用程序设置一个时间监听器。我们必须为应用程序中发生的任何触摸事件运行一组代码。例如。我们的应用程序中可能有 n 个活动。但是我们必须为所有活动设置一个时间监听器,并在 n 个活动中的任何一个发生任何触摸时运行一组代码。我为此做了很多尝试。欢迎任何想法。提前致谢。
我正在开发一个新的应用程序,我非常怀疑它是否可能?我的疑问是
我们必须为整个应用程序设置一个时间监听器。我们必须为应用程序中发生的任何触摸事件运行一组代码。例如。我们的应用程序中可能有 n 个活动。但是我们必须为所有活动设置一个时间监听器,并在 n 个活动中的任何一个发生任何触摸时运行一组代码。我为此做了很多尝试。欢迎任何想法。提前致谢。
我希望我理解你的正确。
您可以做的是创建一个扩展 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");
}
}
}
不要忘记使用动作注册接收器
您可以创建一个不可见的自定义视图,占用所有屏幕并使用 onTouchEvent 执行您需要执行的任何操作。
然后,您需要让每个布局文件在顶部包含该视图(可能在 FrameLayout 中)。
您可以做的是,创建一个由应用程序中所有其他活动扩展的基本活动类。然后,您可以覆盖public boolean dispatchTouchEvent (MotionEvent ev)
此基本活动中的方法。这个被覆盖的实现将是您所有触摸事件的唯一位置。
但是有一个重要的警告,它仅在您的所有活动都属于同一类型的情况下才有效(例如 - 所有活动都是Activitiy
类型或所有活动都是类型ListActivity
)
如果您想在整个应用程序中使用它,您需要创建从 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 事件
完全有可能。
创建一个名为MyTouchActivity
(或其他)的活动覆盖onTouch
事件并编写set
您正在谈论的代码。
现在,所有其余的n
活动都应该扩展MyTouchActivity
而不是常规活动。这样,该代码将被继承到您的所有 n 个活动中。您需要创建 Seperate MyTouchListActivity
(用于 ListActivity)和 MyTouchMapActivity(用于 MapActivity)
另一种方法是简单地创建一个 Ontouch 监听器,然后覆盖每个onTocuh
活动中的每个事件以首先调用您的监听器。但这很麻烦。
使用dispatchTouchEvent
oronTouch
方法的解决方案不适用于整个应用程序。因为有不同类型的窗户。例如,如果弹出片段或用户单击菜单,这些解决方案将无法捕获触摸事件,因为在这些情况下会发生其他事情。
长话短说,我正在为我的高级项目处理这个问题,我开发了一个能够收集应用程序的所有触摸事件的库。该库依赖于棘手的方法,但它也可以工作。该库是开源的。如果需要,您可以检查它: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());
}
});