3

因为我实际上对以编程方式更改视图不是很有信心,所以我有以下问题:

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

我不想使用AlertDialog而不是使用向导。所以,我决定采用类似于 Go SMS 的方法,并在第一次开始时创建一个覆盖。我创建的模型如下所示:

普通菜单: 普通的

第一次开始: 在此处输入图像描述

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

  1. 就像我说的,我不想在第一次启动时使用屏幕截图覆盖,因为这会占用太多空间并且不会独立于语言和屏幕。
  2. 我会将圆圈作为 png,但我不知道如何将它放在图像上
  3. 文字也有同样的问题
  4. 最后我想在应用程序上放置一个半透明的白色。它不一定需要图标的孔,尽管它会很好。

如果您需要 Layout Source,您可以在pastebin获得

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

谢谢!

/edit:我上传了一个新的、布局更合理的布局。

4

2 回答 2

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,然后在其中创建/显示。例如:

<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 值,并将叠加层的可见性再次设置为消失。

于 2011-12-15T12:03:05.960 回答
0

因为我对 ViewStub 没有太多经验,所以我会用 LayoutInflater 来做。

首先,您需要在当前布局之上加载第二个布局。最简单的方法是拥有一个 FrameLayout,它有一个子视图作为当前视图,并且在第一次启动时动态加载第二个子视图。当您在 Activity 中加载内容视图时,它将附加到一些已创建的视图(一些 DecorView、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 添加圆圈并根据坐标调整左右边距
于 2011-12-15T11:44:51.563 回答