android 如何创建一个浮动的可触摸Activity,同时仍然允许触摸其边界之外的本地控件?

ogsagwnx  于 2023-02-14  发布在  Android
关注(0)|答案(2)|浏览(118)

我用mspaint所做的方案最好地解释了我所要实现的目标:

我试着设置FLAG_NOT_TOUCH_MODAL,根据描述,它应该正是我想要的,但它根本不起作用。我的活动消耗了所有触摸事件,甚至在它的边界之外。
如果我设置了FLAG_NOT_FOCUSABLE,那么Activity下的本地控件当然是可触摸的,但Activity甚至在其边界内触摸时也完全不可触摸。
我尝试过在清单中设置isFloatingWindow=true,但似乎没有任何区别。
任何人都可以做到这一点吗?我真的很感激一个小的演示活动,这样的工作方式,所以我可以采取它,并从那里工作。我已经尝试了许多排列的WindowManager和意图标志,似乎没有什么工作完全符合我的需要。
先谢了。

    • 更新日期:**

我已经试过你的建议了,但仍然没有达到预期效果.
这是我的活动布局xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="385dp"
android:layout_height="300dp"
android:theme="@android:style/Theme.Dialog"
tools:context="com.ui.activities.TestActivity"
android:id="@+id/testLayout"
android:visibility="visible"
android:background="@drawable/abc_ab_solid_light_holo"
android:clickable="true">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me"
    android:id="@+id/button"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="35dp"
    android:clickable="true"
    android:enabled="true"
    android:onClick="onClick" />

这是Activity类:

public class TestActivity extends Activity implements View.OnClickListener {

private String TAG = TestActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    setWindowParams();
}

private void setWindowParams() {
    WindowManager.LayoutParams wlp = getWindow().getAttributes();
    wlp.dimAmount = 0;
    wlp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    getWindow().setAttributes(wlp);
}

不幸的是,结果是这样的:

我错过了什么?
谢谢。

wbgh16ku

wbgh16ku1#

在清单中的Activity上设置Dialog主题。例如:

android:theme="@android:style/Theme.Dialog"

然后在onCreate()中设置以下Window参数:

public void setWindowParams() {
    WindowManager.LayoutParams wlp = getWindow().getAttributes();
    wlp.dimAmount = 0;            
    wlp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    getWindow().setAttributes(wlp);     
}
nkkqxpd9

nkkqxpd92#

您可以在AndroidManifest文件中使用具有特殊主题的活动:

<style name="Theme.Transparent">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <!--<item name="android:backgroundDimEnabled">false</item>--> // show/hide background 
        <item name="android:windowIsFloating">true</item>
</style>

另外,不要忘记在Activity中设置mach_parent属性,如下所示:

@Override
protected void onStart() {
    super.onStart();
    Window w = getWindow();
    w.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

相关问题