如何为Android应用程序创建透明的演示屏幕?
我试图创建一个半透明的演示屏幕,只有当用户第一次安装我的应用程序时才会启动。以下是Pulse新闻应用程序中的一个示例: 银河系连接 Nexus One 我希望用户能够浏览两个这样透明的演示页面,而不是“点击关闭”功能 在我的第一次尝试中,我修改了库中的一个示例。我在每个视图寻呼机片段的ImageView中使用了半透明PNG。然后,我在我的“主活动”的onCreate方法中将其作为“演示活动”启动 问题:背景中看不到“主要活动”-它只是黑色的。我尝试了解决方案,但没有解决问题 有没有更好的方法来创造这样的东西,或者我走对了方向 我还有另一个相关问题,这取决于如何实施。我试图覆盖文本和箭头,使它们指向背景中的特定UI组件。使用带有文本和箭头的PNG,很可能无法在不同的设备上正确缩放。即,箭头不一定指向背景中的正确UI组件。有没有办法解决这个问题呢 谢谢 以下是我第一次尝试的代码: DemoActivity.java如何为Android应用程序创建透明的演示屏幕?,android,android-viewpager,transparent,demo,showcaseview,Android,Android Viewpager,Transparent,Demo,Showcaseview,我试图创建一个半透明的演示屏幕,只有当用户第一次安装我的应用程序时才会启动。以下是Pulse新闻应用程序中的一个示例: 银河系连接 Nexus One 我希望用户能够浏览两个这样透明的演示页面,而不是“点击关闭”功能 在我的第一次尝试中,我修改了库中的一个示例。我在每个视图寻呼机片段的ImageView中使用了半透明PNG。然后,我在我的“主活动”的onCreate方法中将其作为“演示活动”启动 问题:背景中看不到“主要活动”-它只是黑色的。我尝试了解决方案,但没有解决问题 有没有更好的方法
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;
}
}
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();
}
} }
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);
}
}
DemoFragmentAdapter.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;
}
}
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();
}
} }
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);
}
}
将主布局包装在
相对布局中,然后在其中添加第二个布局,如:
<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文件的主布局之下(如果内存可用)。然后,您可以在第二个布局中创建自己的布局,ViewFlipper
,无论您想要什么。您只需查看Android launcher代码即可。我不知道有没有实施
如果是我,我会(如果只是一个简单的叠加),这样你就不会破坏你的应用程序布局,只需创建你的叠加布局,并通过直接将其添加到你的活动WindowManager
将其附加到你的应用程序布局上。只需将ImageView
添加到WindowManager
,聆听ImageView
上的触摸,或者暂停从窗口中删除ImageView
,将演示信息放在不同的活动中,并设置以下主题
<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>
最后6位数字定义颜色:000000为黑色
前2个定义不透明度:00为100%透明,ff为100%不透明。所以,在两者之间选择一些东西。您看过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
在清单中,将以下内容添加到活动中:
android:theme=“@style/theme.Transparent”>
在您的外部相对物中添加:
android:background=“#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>
真的
@android:彩色/透明
@空的
真的
假的
假的
有关如何编程自定义字体的示例,请访问:
层次结构查看器中的布局如下所示(红色框是RelativeLayout容器):
做一个新的活动(比如说教程)
转到活动的布局xml文件(活动教程)。
在父布局下,添加“android:background=#000”和“android:alpha=“0.5”
..................................................
....................................................
.............................................
...............................................
为此,您需要在主布局的底部创建帮助布局
例:(结构)
(线性、相对等)
主布局
你的观点。。。
将7000000设置为此布局的背景
#70(透明范围可更改)000000(黑色)
以及高度和宽度作为填充
如果不查看代码,就很难提出任何建议。如果您可以输入活动代码,可能会有所帮助。这是一个好问题。感谢您的回答!我尝试了这个方法,但似乎确实有效。但是,有一个问题-叠加布局中的内容没有覆盖到我的activit中的ActionBar或ActionBar选项卡上y、 您将RelativeLayout
添加到demo\u activity.xml
文件中,并且DemoActivity
是您的主文件(第一个)Activity
?嗯,“DemoActivity”是我试图创建一个透明的活动,可以做同样的事情。“MainActivity”是我想要在背景下的活动。所以我用“RelativeLayout”包装了“MainActivity”的布局,即“main_Activity.xml”,就像你提到的那样,并插入了透明的“行”“arLayout”。问题是,“main_activity.xml”中的所有内容都显示在“ActionBar”及其任何导航选项卡的下方。谢谢你的回答!这正是我在做了很多之后所做的事情。我仍然好奇Pulse演示屏幕如何能够在正确的位置“重新定位”覆盖的内容,即使是在不同的屏幕上nt屏幕大小-查看更新的屏幕截图。有什么想法吗?在您的第一个活动中,找到您希望指向的视图(findViewById
)。然后使用获取其相对于根布局的位置。将位置发送到意图中的覆盖活动。进行正确对齐。或使用view.getLocationOnScreen(int[]location)
或视图。getLocationInWindow(int[]位置)
。我不确定哪一个更好。@Gautam:“有什么想法吗?”——对于Pulse,这是一个问题,将一个图像放在左上角,将另一个图像居中,将第三个图像放在右下角。十几行