Dialog想必大家都很熟悉了,如果掌握了Dialog的原理的话,我们就很轻松的创建出属于我们自己的Dialog,以前我也就这么用着,能看到效果就可以了,然后就不管了,正好这段时间不是很忙,于是就打算写一篇博客分享下自己对Dialog的一些理解,就当笔记了,大牛勿喷(^__^) !
Dialog的一些简单的用法我这里就不讲了,直接上demo了,先来一张微信的dialog,然后我们试着模仿一下。
不得不说微信的界面跟用户体验真是所有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;
}
}
运行效果:
怎么样?是不是还不错哦,需要的可以直接托走~不谢哈!
未完待续……..