如何使用LayoutInflater / ViewStub进行叠加

时间:2011-11-27 10:46:40

标签: android android-layout layout-inflater viewstub

由于我对以编程方式更改视图实际上不太自信,因此我遇到了以下问题:

在我的应用程序第一次启动时,我希望主屏幕有一个叠加层,告诉用户查看设置,因为用户必须配置两个关键选项。

我不想使用AlertDialog而不是使用向导。因此,我决定采用类似于Go SMS的方法,并在第一次启动时创建叠加层。我创建的模型看起来像这样:

普通菜单: Normal

首先开始: enter image description here

所以这些是我遇到的问题:

  1. 就像我说的那样,我不想在首次启动时使用屏幕截图,因为这会占用太多空间而且不会与语言和屏幕无关。
  2. 我会将圆圈作为png,但我不知道它是如何将它完全放在图像上
  3. 与文字相同的问题
  4. 最后我想在应用程序上放一个半透明的白色。它不一定需要图标的洞,虽然它会很好。
  5. 如果您需要布局来源,可以在pastebin

    获取

    所以,我只需要从这里开始,如果最好使用LayoutInflater或ViewStub以及如何实现它,因为我完全没有使用它的经验......

    谢谢!

    / edit 我上传了一个更新,布局更好的布局。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,我的客户想要一个应用程序的演练,整个屏幕必须变得更白(正如他们所说:“透明”),除了按钮由叠加语音泡沫解释。
幸运的是,你的布局并不像我必须使用的那样复杂:)

现在,您可以通过两种方式获得透明效果,或者具有白色背景并调用所有视图setAlpha()方法,或者您可以创建半透明的白色叠加。
如果您使用叠加层,则必须找到一种通过叠加层显示不透明按钮的方法。这可能会有点复杂。 如果您使用第一个选项,则可以在不透明视图上设置Alpha(1)以使其显示。

setAlpha()方法仅适用于api版本11+,因此如果您定位的是早期版本,则可能需要以稍微复杂的方式执行此操作。
在蜂窝前的视图上设置alpha的示例:

按钮的布局(根据需要制作它们,只需使它们相似,以便循环使用它们):

<LinearLayout 
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <ImageView 
        android:tag="image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/tile"/>
    <TextView 
        android:tag="text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FF000000"
        android:text="button1"/>
</LinearLayout>

在您的程序中,当您想要使按钮透明时:

LinearLayout l = (LinearLayout) findViewById(R.id.button1);
((ImageView)l.findViewWithTag("image")).setAlpha(0x7F);
((TextView)l.findViewWithTag("text")).setTextColor(0x7F000000);



当您决定如何创建透明效果时,您必须决定如何显示叠加文本/气泡。您很可能希望将其放在整个布局的单独图层中,以确保它不受新视图的影响。
实现此目的的一种方法是将根布局元素更改为FrameLayout,然后在此中创建/显示。 e.g:

<FrameLayout background="#FFFF"> <!-- white background, just in case -->
    <LinearLayout>
        <!-- the rest of your layout -->
    </LinearLayout>
    <LinearLayout visibility="gone"> <!-- this will be your overlay view -->
        <ImageView /> <!-- the arrow/ring -->
        <TextView /> <!-- the description -->
    </LinearLayout>
</FrameLayout>

当显示介绍时,您将隐藏的叠加视图的位置设置为要解释的表项的位置,将文本更改为适当的字符串/资源并显示视图。

介绍结束后,您重置所有按钮的Alpha值,并将叠加层的可见性设置为再次消失。

答案 1 :(得分:0)

由于我没有太多使用ViewStub的经验,我会使用LayoutInflater。

首先,您需要在当前布局的基础上加载第二个布局。最简单的方法是使用FrameLayout,它将当前视图作为一个子项,并在第一次启动时动态加载第二个子项。在Activity中加载内容视图时,它将附加到一些已创建的视图(一些DecorView,一个FrameLayout等)。因此,您可以重复使用现有的FrameLayout,也可以创建一个新的FrameLayout。 我会投票给第二个解决方案,因为它更稳定(我刚才提到了另一种可能性,以防你想要最小化层数)。

因此,作为第一步,将当前布局包装在FrameLayout中,并给它一个id,让我们说“@ id / root”。

然后,在onCreate方法中,你可以这样:

setContentView(R.layout.main);
if (isFirstRun()) {
    ViewGroup parent = (ViewGroup)findViewById(R.id.root); // locate the FrameLayout
    LayoutInflater li = LayoutInflater.from(this); // get an instance of LayoutInflater
    li.inflate(R.layout.overlay, parent);
}

到目前为止,您将加载叠加层。现在由您来定义叠加层。 要获得美白效果,只需在overlay.xml布局的根视图中设置以下属性:

android:background="#40ffffff"

要定位圆圈,首先需要找到它的位置。您可以使用View.getLocationOnScreen获取屏幕上图标(圆圈下方)的绝对坐标。然后你可以有两个选择:

  • 创建自定义视图(用于叠加层)并在给定位置手动绘制圆圈
  • 或使用ImageView添加圆圈,并根据坐标
  • 调整左边距和上边距