风儿带你创建一个透明Activity

2017-04-18  本文已影响728人  yzzCool

前言

写了那么多页面,和这么多Activity对着干。有一天要写一个透明Activity,竟然思考半天。。。说多了都是泪啊!!!

任务:可以新建透明的Activity

透明的Activity和普通的Activity没有太大的区别。没有什么神圣之处,扯远了吧!!!
上代码:新建Activity;TransparentActivity.class

public class TransparentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题头
        setContentView(R.layout.activity_transparent);
    }
}

目前是不是没有区别。
布局文件activity_transparent.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.example.transparentactivity.TransparentActivity">

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="上面的" />


    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="最下面" />


</RelativeLayout>

从布局文件可以看到有两个按钮。从另外一个页面跳转过来。
显示如下图所示

截图一

现在不是透明的啊!那我们就让他变透明。。
styles.xml中添加下面的代码:

    <style name="dialog_activity" parent="@style/Theme.AppCompat.Light.Dialog">
        <!-- 去黑边 -->
        <item name="android:windowFrame">@null</item>
        <!-- 设置是否可滑动 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 设置是否透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 背景 -->
        <item name="android:background">@null</item>
        <!-- 窗口背景 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 是否变暗 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 点击空白部分activity不消失 -->
        <item name="android:windowCloseOnTouchOutside">true</item>
        <!-- 无标题 有的手机设置这行代码-->
        <item name="windowNoTitle">true</item>
    </style>

注意:
1.parent="android:style/Theme.Dialog"parent="@style/Theme.AppCompat.Light.Dialog"根据自己的activity选择相应的parent。
2.无标题,也可以向上面一样,用代码实现。。

        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 无标题 有的手机设置这行代码-->
        <item name="windowNoTitle">true</item>

AndroidManifest.xml中注册TransparentActivity代码如下:

        <activity
            android:name=".TransparentActivity"
            android:theme="@style/dialog_activity"></activity>

运行一下得到下图:

截图二

我只是想说这不科学。最下面的按钮上图是满屏的到了这一张图就是没有满屏。不用怀疑你的眼睛,就是没有满屏。
继续修改,现在我们去TransparentActivity.class进行操作。

public class TransparentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题头
        setContentView(R.layout.activity_transparent);




        //窗口对齐屏幕宽度
        Window win = this.getWindow();
        win.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams layoutParams = win.getAttributes();
        layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.gravity = Gravity.BOTTOM;//设置对话框在底部显示
        win.setAttributes(layoutParams);
    }
}

运行一下得到下图:

截图三

哎,好多了,基本满足需求了。但是有一个地方还是有点别扭,那就是最上面的状态栏。怎么是黑色的呢??继续在TransparentActivity.class进行操作。

public class TransparentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题头
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        setContentView(R.layout.activity_transparent);

        //窗口对齐屏幕宽度
        Window win = this.getWindow();
        win.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams layoutParams = win.getAttributes();
        layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.gravity = Gravity.BOTTOM;//设置对话框在底部显示
        win.setAttributes(layoutParams);
    }
}

运行一下得到下图:

截图四

哎,还是别扭啊!上面的按钮被顶上去了。继续来。。在TransparentActivity.class进行操作。

public class TransparentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题头
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        setContentView(R.layout.activity_transparent);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // 设置根布局的参数
            ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
            rootView.setFitsSystemWindows(true);
            rootView.setClipToPadding(true);
        }
        //窗口对齐屏幕宽度
        Window win = this.getWindow();
        win.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams layoutParams = win.getAttributes();
        layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.gravity = Gravity.BOTTOM;//设置对话框在底部显示
        win.setAttributes(layoutParams);
    }
}

运行一下得到下图:

截图五

满足需求完工。透明Activity的背景,布局都是很灵活的。。。

上一篇下一篇

猜你喜欢

热点阅读