Android进阶之(Dailog详解)

Dialog想必大家都很熟悉了,如果掌握了Dialog的原理的话,我们就很轻松的创建出属于我们自己的Dialog,以前我也就这么用着,能看到效果就可以了,然后就不管了,正好这段时间不是很忙,于是就打算写一篇博客分享下自己对Dialog的一些理解,就当笔记了,大牛勿喷(^__^) !
Dialog的一些简单的用法我这里就不讲了,直接上demo了,先来一张微信的dialog,然后我们试着模仿一下。
Android进阶之(Dailog详解)_第1张图片

不得不说微信的界面跟用户体验真是所有app中最好的,简洁给人非常舒服,废话不说了,直接上代码了。
第一步
首先我们要先画一个进度条:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="1080" android:pivotX="50%" android:pivotY="50%" >
    <shape android:shape="ring" android:innerRadiusRatio="3" android:thickness="3dp" android:useLevel="false" >
        <gradient  android:endColor="#b26D6D6D" android:startColor="#00000000" android:type="sweep" />
    </shape>
</rotate>

下面的属性只有在android:shape=”ring时可用:
android:innerRadius 尺寸,内环的半径。
android:innerRadiusRatio 浮点型,以环的宽度比率来表示内环的半径,
例如:
如果android:innerRadiusRatio,表示内环半径等于环的宽度除以5,这个值是可以被覆盖的,默认为9.
android:thickness 尺寸,环的厚度
android:thicknessRatio 浮点型,以环的宽度比率来表示环的厚度,例如,如果android:thicknessRatio=”2”,
那么环的厚度就等于环的宽度除以2。这个值是可以被android:thicknes覆盖的,默认值是3.
android:useLevel boolean值,如果当做是LevelListDrawable使用时值为true,否则为false.

然后我们给了一个渐变色gradient,
最后为了让它动起来,在最外面套了一个旋转动画rotate。

第二步
创建一个Dialog布局,也就是上面那张微信的截图样式,想必大家很快就能实现,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentPanel" android:layout_width="match_parent" android:layout_height="wrap_content" >
    <RelativeLayout  android:id="@+id/body" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:paddingBottom="10dp" android:paddingLeft="1dp" android:paddingRight="15dp" android:paddingTop="10dp" >
        <ProgressBar  android:id="@+id/progress" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginRight="12dip" android:indeterminate="false" android:indeterminateDrawable="@drawable/shape_ring" />
        <TextView  android:id="@+id/customFrameMsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@id/progress" android:singleLine="true" android:text="正在登录..." android:textColor="#ffffff" android:textSize="14.5sp" />
    </RelativeLayout>

</RelativeLayout>

布局很简单,左边一个ProgressBar,右边一个TextView.

第三步
创建一个自己style的Dialog。

public Dialog createLoadingDialog(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.wechat_dialog, null);// 得到加载view
        Dialog loadingDialog = new Dialog(context, R.style.loading_dialog);// 创建自定义样式dialog
        loadingDialog.setCancelable(false);// 不可以用“返回键”取消
        loadingDialog.setContentView(v);// 设置布局
        /** * 设置Dialog的宽度为屏幕宽度的61.8%,高度为自适应 */
        WindowManager.LayoutParams lp = loadingDialog.getWindow().getAttributes();
        lp.width= (int) (screenWidth*0.618f);
        lp.height=lp.WRAP_CONTENT;
        loadingDialog.getWindow().setAttributes(lp);
        return loadingDialog;
    }

styles.xml文件:

 <!-- 自定义loading dialog -->
    <style name="loading_dialog" parent="android:style/Theme.Dialog">
        <!--提示框是否有边框-->
        <item name="android:windowFrame">@null</item>
        <!--是否需要标题-->
        <item name="android:windowNoTitle">true</item>
        <!--对话框的背景-->
        <item name="android:windowBackground">@drawable/pd_shape</item>
        <!--对话框是否悬浮-->
        <item name="android:windowIsFloating">true</item>
        <!--默认Window的content背景-->
        <item name="android:windowContentOverlay">@null</item>
        <!--dialog遮罩透明度-->
        <item name="android:backgroundDimAmount">0.5</item>
        <!--是否需要dialog遮罩-->
        <item name="android:backgroundDimEnabled">true</item>
    </style>

pd_shape.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="8dp"/>
    <padding android:left="10dp" android:right="10dp"/>
    <solid android:color="#7f000000"/>
</shape>

最后运行app测试(MainActivity全部代码):

public class MainActivity extends AppCompatActivity {
    private int screenWidth;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WindowManager wm=getWindowManager();
        DisplayMetrics outMetrics=new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        screenWidth=outMetrics.widthPixels;
        createLoadingDialog(this).show();
    }
    public Dialog createLoadingDialog(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.wechat_dialog, null);// 得到加载view
        Dialog loadingDialog = new Dialog(context, R.style.loading_dialog);// 创建自定义样式dialog
        loadingDialog.setCancelable(false);// 不可以用“返回键”取消
        loadingDialog.setContentView(v);// 设置布局
        /** * 设置Dialog的宽度为屏幕宽度的61.8%,高度为自适应 */
        WindowManager.LayoutParams lp = loadingDialog.getWindow().getAttributes();
        lp.width= (int) (screenWidth*0.618f);
        lp.height=lp.WRAP_CONTENT;
        loadingDialog.getWindow().setAttributes(lp);
        return loadingDialog;
    }
}

运行效果:
Android进阶之(Dailog详解)_第2张图片

怎么样?是不是还不错哦,需要的可以直接托走~不谢哈!

未完待续……..

你可能感兴趣的:(dialog,对话框,仿微信)