由于我对以编程方式更改视图实际上不太自信,因此我遇到了以下问题:
在我的应用程序第一次启动时,我希望主屏幕有一个叠加层,告诉用户查看设置,因为用户必须配置两个关键选项。
我不想使用AlertDialog
而不是使用向导。因此,我决定采用类似于Go SMS的方法,并在第一次启动时创建叠加层。我创建的模型看起来像这样:
普通菜单:
首先开始:
所以这些是我遇到的问题:
如果您需要布局来源,可以在pastebin
获取所以,我只需要从这里开始,如果最好使用LayoutInflater或ViewStub以及如何实现它,因为我完全没有使用它的经验......
谢谢!
/ edit 我上传了一个更新,布局更好的布局。
答案 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获取屏幕上图标(圆圈下方)的绝对坐标。然后你可以有两个选择: