如何为Android应用程序创build透明的演示屏幕?
我正在尝试创build仅在用户首次安装我的应用程序时才启动的半透明演示屏幕。 以下是Pulse News应用程序的一个示例:
Galaxy Nexus
Nexus One
我希望用户能够通过几个这样的透明演示页面进行轻扫,而不是使用“点击即可解散”function。
对于我的第一次尝试,我从ViewPagerIndicator库中修改了一个示例。 我在每个视图分页器的片段中使用了ImageView中的半透明PNG。 然后,我在“主要活动”的onCreate方法中将其作为“演示活动”启动。
问题:“主要活动”无法在背景中看到 – 而只是黑色。 我在这里尝试了解决scheme,但是这并没有解决问题。
有没有更好的方法来创build这样的事情,还是我在正确的轨道上?
我还有另一个相关的问题,这取决于如何实施。 我正在尝试覆盖文本和箭头,以便在背景中指向特定的UI组件。 通过使用具有文本和箭头的PNG,很可能无法在不同的设备上正确缩放。 也就是说,箭头可能不一定指向背景中正确的UI组件。 有没有办法解决这个问题呢?
谢谢!
这是我第一次尝试的代码:
DemoActivity.java
public class DemoActivity extends FragmentActivity { DemoFragmentAdapter mAdapter; ViewPager mPager; PageIndicator mIndicator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.demo_activity); mAdapter = new DemoFragmentAdapter(getSupportFragmentManager()); mPager = (ViewPager)findViewById(R.id.pager); mPager.setAdapter(mAdapter); //mPager.setAlpha(0); UnderlinePageIndicator indicator = (UnderlinePageIndicator)findViewById(R.id.indicator); indicator.setViewPager(mPager); indicator.setFades(false); mIndicator = indicator; } }
DemoFragmentAdapter.java
class DemoFragmentAdapter extends FragmentPagerAdapter { protected static final int[] CONTENT = new int[] { R.drawable.demo1, R.drawable.demo2, R.drawable.demo3, R.drawable.demo4}; private int mCount = CONTENT.length; public DemoFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return DemoFragment.newInstance(CONTENT[position % CONTENT.length]); } @Override public int getCount() { return mCount; } public void setCount(int count) { if (count > 0 && count <= 10) { mCount = count; notifyDataSetChanged(); } } }
DemoFragment.java
public final class DemoFragment extends Fragment { private static final String KEY_CONTENT = "TestFragment:Content"; public static DemoFragment newInstance(int content) { DemoFragment fragment = new DemoFragment(); fragment.mContent = content; return fragment; } private int mContent; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) { mContent = savedInstanceState.getInt(KEY_CONTENT); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ImageView image = new ImageView(getActivity()); image.setBackgroundResource(mContent); LinearLayout layout = new LinearLayout(getActivity()); layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); layout.setGravity(Gravity.CENTER); layout.addView(image); return layout; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(KEY_CONTENT, mContent); } }
把你的演示信息放在一个不同的活动中,给它下面的主题。
<style name="Transparent" parent="@android:style/Theme.NoTitleBar"> <item name="android:windowContentOverlay">@null</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> <item name="android:backgroundDimEnabled">false</item> </style>
如果你使用ActionBarSherlock改变parent
到@style/Theme.Sherlock
。
这会给你一个透明的活动,所以你将能够看到它下面的活动。
现在我猜你也想要一个半透明的背景。
在透明活动的xml布局中添加:
android:background="#aa000000"
最后6位数字定义颜色:000000是黑色的。
前两个定义不透明度:00是100%透明,ff是100%不透明。 所以select之间的东西。
你看过ShowcaseView吗? https://github.com/Espiandev/ShowcaseView 。
使用这个:
View showcasedView = findViewById(R.id.view_to_showcase); ViewTarget target = new ViewTarget(showcasedView); ShowcaseView.insertShowcaseView(target, this, R.string.showcase_title, R.string.showcase_details);
Pulse正在使用一个有四个ImageView和四个TextView的RelativeLayout。 屏幕截图中的文字都是TextView的自定义字体。
在您的清单中,将以下内容添加到您的活动中:
机器人:主题= “@风格/ Theme.Transparent”>
在你的外部RelativeLayout中添加:
机器人:背景= “#aa000000”
到您的styles.xml文件中:
<style name="Theme.Transparent" parent="android:Theme"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">false</item> <item name="android:backgroundDimEnabled">false</item> </style>
一个示例如何编程自定义字体,您可以在:
https://github.com/commonsguy/cw-android/tree/master/Fonts/FontSampler/
Hierarchy Viewer中的布局看起来像这样(红框是RelativeLayout容器):
为此,您需要在主布局的底部创build帮助布局,例如:(结构)
<Parent layout> <Layout 1>(Linear,Relative,....) Main layout your view... </Layout 1> <Layout help> set #70000000 as background of this layout #70(transparent range can change) 000000(black) and height and width as fillparent </Layout help> </Parent layout>
setContentView(R.layout.sample_main); showOverLay(); private void showOverLay(){ final Dialog dialog = new Dialog(context, android.R.style.Theme_Translucent_NoTitleBar); dialog.setContentView(R.layout.transparent); RelativeLayout layout = (RelativeLayout) dialog.findViewById(R.id.transparent); layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { dialog.dismiss(); } }); dialog.show(); }
将你的主布局包装在一个RelativeLayout
,然后添加第二个布局,如下所示:
<RelativeLayout .... > <LinearLayout .... > <!-- Contents of your main layout --> </LinearLayout> <LinearLayout .... android:background="#44000000" > <!-- This is alpha 68/255, black --> <!-- Contents of your overlay layout --> </LinearLayout> </RelativeLayout>
我相信覆盖布局在XML文件的主布局之下(如果内存服务的话)。 然后,您可以在第二个布局中创build自己的布局, ViewFlipper
,无论您想要什么。
你可以看看Android的启动器代码,因为他们这样做。 我不知道在那里执行。
如果是我,我会(如果只是一个简单的覆盖),所以你不要拧你的应用程序的布局,只需创build您的覆盖布局,并将其附加在您的应用程序布局直接添加到您的活动WindowManager
。 可以像添加ImageView
到WindowManager
一样简单,监听ImageView
触摸,或者有一个超时从Window
删除ImageView
。
做一个新的活动(说教程)。
转到您的Activity的布局xml文件(activity_tutorial)。 在父级布局下,添加“android:background =#000”和“android:alpha =”0.5“
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".Tutorial_Activity" android:background="#000" android:alpha="0.5"> .................................................. .................................................... ............................................. ............................................... </RelativeLayout>