如何为Android应用程序创建透明的演示屏幕?

如何为Android应用程序创建透明的演示屏幕?,android,android-viewpager,transparent,demo,showcaseview,Android,Android Viewpager,Transparent,Demo,Showcaseview,我试图创建一个半透明的演示屏幕,只有当用户第一次安装我的应用程序时才会启动。以下是Pulse新闻应用程序中的一个示例: 银河系连接 Nexus One 我希望用户能够浏览两个这样透明的演示页面,而不是“点击关闭”功能 在我的第一次尝试中,我修改了库中的一个示例。我在每个视图寻呼机片段的ImageView中使用了半透明PNG。然后,我在我的“主活动”的onCreate方法中将其作为“演示活动”启动 问题:背景中看不到“主要活动”-它只是黑色的。我尝试了解决方案,但没有解决问题 有没有更好的方法

我试图创建一个半透明的演示屏幕,只有当用户第一次安装我的应用程序时才会启动。以下是Pulse新闻应用程序中的一个示例:

银河系连接

Nexus One

我希望用户能够浏览两个这样透明的演示页面,而不是“点击关闭”功能

在我的第一次尝试中,我修改了库中的一个示例。我在每个视图寻呼机片段的ImageView中使用了半透明PNG。然后,我在我的“主活动”的onCreate方法中将其作为“演示活动”启动

问题:背景中看不到“主要活动”-它只是黑色的。我尝试了解决方案,但没有解决问题

有没有更好的方法来创造这样的东西,或者我走对了方向

我还有另一个相关问题,这取决于如何实施。我试图覆盖文本和箭头,使它们指向背景中的特定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;
    }

}
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,这是一个问题,将一个图像放在左上角,将另一个图像居中,将第三个图像放在右下角。十几行