将触摸事件传递给当前活动后面的活动

时间:2016-02-11 23:15:40

标签: java android android-activity touch

我有两个活动,其中一个显示RecyclerView,另一个显示图像。单击RecyclerView中的项目将显示第二个活动,其中包含与所单击项目相关的小图像,并且背景为透明,显示第一个活动。

我试图让第二个Activity忽略图像范围之外的所有触摸事件,以便可以使用屏幕上的图像滚动列表。这可以通过

实现
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);   

但是,只有当第二个Activity的Window不占用整个屏幕时,这才有效。这是第二个活动布局的示例:

<?xml version="1.0" encoding="utf-8"?>
<CustomFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent">

  <ImageView
     android:id="@+id/imageView_item"
     android:layout_width="150dp"
     android:layout_height="150dp"
     android:background="@color/colorPrimary"
     android:layout_gravity="center"/>

</CustomFrameLayout>

由于CustomFrameLayout的高度和宽度与父级相匹配,因此它会拦截ImageView中不存在的所有触摸事件。

我认为覆盖CustomFrameLayout中的onInterceptTouchEvent会允许我使用以下代码忽略不需要的触摸事件:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (/* Is touch event within bounds of ImageView */) {
        return true;
    }
    return false; //Otherwise don't intercept
}

但这也不起作用,有没有人有其他想法?

让我们说FrameLayout需要全屏,我不能使用片段,这是可行的吗?

1 个答案:

答案 0 :(得分:2)

你做不到。启动第二个Activity时,第一个Activity将暂停。暂停时,它不会处理任何触摸事件。执行此操作的正确方法是在第一个活动中将第二个活动设为片段。

即使你设法找到一种方法来强制它触摸事件,它也不一定像你希望的那样工作。编写良好的Activity会在调用onPaused时停止大量处理。它可能无法在之后正确处理触摸,并且可能会使其崩溃。