我正在尝试创建一个半透明的演示屏幕,该屏幕仅在用户首次安装我的应用程序时启动。以下是Pulse News应用程序的一个示例:
Galaxy Nexus
Nexus One
我希望用户能够轻扫几个这样的透明演示页面,而不是“点按即关闭”功能。
对于我的第一次尝试,我修改了ViewPagerIndicator库中的示例。我在每个视图寻呼机片段中的ImageViews中使用了半透明的PNG。然后我在“主要活动”的onCreate方法中将其作为“演示活动”启动。
问题:在后台无法看到“主要活动” - 相反,它只是黑色。我尝试了解决方案here,但这并没有解决问题。
有没有更好的方法来创造这样的东西,还是我走在正确的轨道上?
我还有另一个相关的问题,这取决于如何实施。我正在尝试覆盖文本和箭头,以便它们指向背景中的特定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);
}
}
答案 0 :(得分:79)
将您的演示信息放在不同的活动中,并为其提供以下主题。
<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为黑色。
前2个定义不透明度:00是100%透明,ff是100%不透明。所以选择介于两者之间的东西。
答案 1 :(得分:64)
你看过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);
答案 2 :(得分:11)
Pulse正在使用具有四个ImageView和四个TextView的RelativeLayout。 屏幕截图中的文字都是TextView,带有自己的自定义字体。
在您的清单中,将以下内容添加到您的活动中:
机器人:主题= “@风格/ Theme.Transparent” &GT;
在你的外部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容器):
答案 3 :(得分:6)
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();
}
答案 4 :(得分:5)
为此,您需要在主布局的底部创建帮助布局 例如:(结构)
<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>
答案 5 :(得分:2)
将您的主要布局包裹在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文件中的主要布局(如果内存服务)。然后,您可以在第二个布局中制作自己的布局ViewFlipper
,无论您想要什么。
答案 6 :(得分:1)
制作一个新的活动(比如教程)。
转到Activity的布局xml文件(activity_tutorial)。 在父布局下,添加&#34; android:background =#000&#34;和&#34; android:alpha =&#34; 0.5&#34;
<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>
&#13;
现在,转到应用程序清单文件并在您的教程活动下添加属性android:theme =&#34; @android:style / Theme.Translucent.NoTitleBar&#34;&gt;
<application>
.........................................
..........................................
....................................
..........................................
<activity
android:name="com.aird.airdictionary.Tutorial_Activity"
android:label="@string/title_activity_tutorial"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
</activity>
</application>
</manifest>
&#13;
多数民众赞成,现在在任何其他活动之上运行此活动,您就可以获得所需的结果。 自定义,添加文本,图像视图和其他内容以获得所需的教程屏幕。 很确定你可以让viewpager使用这种技术。
答案 7 :(得分:0)
您可以查看Android启动器代码,就像它们一样。我不知道有没有实施。
如果是我,我会(如果只是一个简单的叠加),所以你不要为你的应用程序设置你的布局,只需创建你的叠加布局,并通过直接添加你的活动{{1 }}。可以简单到向WindowManager
添加ImageView
,监听WindowManager
上的触摸,或者暂停以从ImageView
中移除ImageView
}。