您现在的位置是:首页 > 文章详情

Android BaseDialog(开发必备)动画、加载进度、阴影

日期:2018-10-15点击:318

GitHub

APK

使用方法

将libray模块复制到项目中,或者直接在build.gradle中依赖:

allprojects { repositories { maven { url 'https://jitpack.io' } } }
dependencies { compile 'com.github.AnJiaoDe:BaseDialog:V1.1.2' }

注意:如果sync报错,是因为和com.android.tools.build:gradle 3.0有关,
可以改将compile改为implementation 或者api

1.Center

这里写图片描述

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@drawable/white_shape" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:text="确定删除吗?" android:textSize="16sp" android:gravity="center"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="48dp" android:text="取消" android:id="@+id/tv_cancel" android:gravity="center" android:textSize="16sp"/> <View android:layout_width="1dp" android:layout_height="match_parent" android:background="@color/line"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:id="@+id/tv_confirm" android:layout_height="48dp" android:text="确定" android:gravity="center" android:textSize="16sp"/> </LinearLayout> </LinearLayout>

2.Left

这里写图片描述

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="250dp" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Google Assistant: 一句 OK, Google,多少手指都用不上了 人工智能是今年的 Google I/O 的一大主题。在发布会一开始,Google CEO 桑达拉·皮蔡(Sundar Pichai)就强调机器学习在生活中扮演的重要角色。随后,一系列基于 Google 人工智能的产品纷至沓来。 OK, Google. 这句耳熟能详的命令,如今承载了 Google 全新的产品——Google Assistant. 之所以 Google Assistant 是发布会上首个亮相的产品,是因为后续登场的数个产品都基于这一技术。Google 用将近十年的时间,改善自己的语音识别技术,更强调自然语义和对话式搜索。" android:textSize="16sp" /> </LinearLayout>

3.Top

这里写图片描述

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tv_photo" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center" android:text="拍照" android:textSize="16sp" /> <View android:layout_width="match_parent" android:layout_height="0.1dp" android:background="@color/line" /> <TextView android:id="@+id/tv_album" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center" android:text="从相册选择" android:textSize="16sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10dp" android:background="@color/bg"/> <TextView android:id="@+id/tv_photo_cancel" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center" android:text="取消" android:textSize="16sp" /> </LinearLayout>

4.Right

这里写图片描述

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="250dp" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="Google Assistant: 一句 OK, Google,多少手指都用不上了 人工智能是今年的 Google I/O 的一大主题。在发布会一开始,Google CEO 桑达拉·皮蔡(Sundar Pichai)就强调机器学习在生活中扮演的重要角色。随后,一系列基于 Google 人工智能的产品纷至沓来。 OK, Google. 这句耳熟能详的命令,如今承载了 Google 全新的产品——Google Assistant. 之所以 Google Assistant 是发布会上首个亮相的产品,是因为后续登场的数个产品都基于这一技术。Google 用将近十年的时间,改善自己的语音识别技术,更强调自然语义和对话式搜索。" android:textSize="16sp" /> </LinearLayout>

5.Bottom

这里写图片描述

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tv_photo" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center" android:text="拍照" android:textSize="16sp" /> <View android:layout_width="match_parent" android:layout_height="0.1dp" android:background="@color/line" /> <TextView android:id="@+id/tv_album" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center" android:text="从相册选择" android:textSize="16sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="10dp" android:background="@color/bg"/> <TextView android:id="@+id/tv_photo_cancel" android:layout_width="match_parent" android:layout_height="56dp" android:gravity="center" android:text="取消" android:textSize="16sp" /> </LinearLayout>

6.Progress

这里写图片描述

 public class MainActivity extends BaseActivity { private BaseDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn_center).setOnClickListener(this); findViewById(R.id.btn_left).setOnClickListener(this); findViewById(R.id.btn_top).setOnClickListener(this); findViewById(R.id.btn_right).setOnClickListener(this); findViewById(R.id.btn_bottom).setOnClickListener(this); findViewById(R.id.btn_progress).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_center: dialog = new BaseDialog(this); dialog.config(R.layout.dialog_center, true).show(); dialog.findViewById(R.id.tv_confirm).setOnClickListener(this); dialog.findViewById(R.id.tv_cancel).setOnClickListener(this); break; case R.id.btn_left: BaseDialog dialog_left = new BaseDialog(this); dialog_left.config(R.layout.dialog_left, 0.5f, Gravity.LEFT | Gravity.CENTER, BaseDialog.AnimInType.LEFT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.MATCH_PARENT, true).show(); break; case R.id.btn_top: BaseDialog dialog_top = new BaseDialog(this); dialog_top.setOffset(0, ScreenUtils.dpInt2px(this, 48)); dialog_top.config(R.layout.dialog_photo, 0.5f, Gravity.TOP, BaseDialog.AnimInType.TOP, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, true).show(); break; case R.id.btn_right: BaseDialog dialog_right = new BaseDialog(this); dialog_right.setOffset(20, 0); dialog_right.config(R.layout.dialog_right, Gravity.RIGHT | Gravity.CENTER, BaseDialog.AnimInType.RIGHT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.MATCH_PARENT, true).show(); break; case R.id.btn_bottom: BaseDialog dialog_bottom = new BaseDialog(this); dialog_bottom.config(R.layout.dialog_photo, Gravity.BOTTOM, BaseDialog.AnimInType.BOTTOM, true).show(); break; case R.id.btn_progress: CYProgressDialog cyProgressDialog=new CYProgressDialog(this); cyProgressDialog.config(0.4f,0xffffffff,20,0xffffffff,0xff2a5caa).show(); break; case R.id.tv_confirm: dialog.dismiss(); break; case R.id.tv_cancel: dialog.dismiss(); break; } } } 

源码:

BaseDialog

 public class BaseDialog extends Dialog { public BaseDialog(Context context) { this(context, 0); } public BaseDialog(Context context, int themeResId) { super(context, themeResId); requestWindowFeature(Window.FEATURE_NO_TITLE);// 去除对话框的标题 getWindow().setBackgroundDrawableResource(R.drawable.dialog_bg);//设置对话框边框背景,必须在代码中设置对话框背景,不然对话框背景是黑色的 setDimAmount(0.2f); } /* */ public BaseDialog config(@LayoutRes int layoutResID, boolean canceledOnTouchOutside) { config(layoutResID, 0.2f, Gravity.CENTER, AnimInType.CENTER, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, canceledOnTouchOutside); return this; } /* */ public BaseDialog config(@NonNull View view, boolean canceledOnTouchOutside) { config(view, 0.2f, Gravity.CENTER, AnimInType.CENTER, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, canceledOnTouchOutside); return this; } /* */ public BaseDialog config(@LayoutRes int layoutResID, int gravity, AnimInType animInType, boolean canceledOnTouchOutside) { config(layoutResID, 0.2f, gravity, animInType, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, canceledOnTouchOutside); return this; } /* */ public BaseDialog config(@NonNull View view, int gravity, AnimInType animInType, boolean canceledOnTouchOutside) { config(view, 0.2f, gravity, animInType, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, canceledOnTouchOutside); return this; } /* */ public BaseDialog config(@LayoutRes int layoutResID, int gravity, AnimInType animInType, int width, int height, boolean canceledOnTouchOutside) { config(layoutResID, 0.2f, gravity, animInType, width, height, canceledOnTouchOutside); return this; } /* */ public BaseDialog config(@NonNull View view, int gravity, AnimInType animInType, int width, int height, boolean canceledOnTouchOutside) { config(view, 0.2f, gravity, animInType, width, height, canceledOnTouchOutside); return this; } /* 参数:dimAmount背景阴影 */ public BaseDialog config(@LayoutRes int layoutResID, float dimAmount, int gravity, AnimInType animInType, int width, int height, boolean canceledOnTouchOutside) { setContentView(layoutResID);//填充对话框布局 setDimAmount(dimAmount); getWindow().setGravity(gravity); setAnimType(animInType); getWindow().setLayout(width, height); setCanceledOnTouchOutside(canceledOnTouchOutside ? true : false); return this; } /* 参数:dimAmount背景阴影 */ public BaseDialog config(@NonNull View view, float dimAmount, int gravity, AnimInType animInType, int width, int height, boolean canceledOnTouchOutside) { setContentView(view);//填充对话框布局 setDimAmount(dimAmount); getWindow().setGravity(gravity); setAnimType(animInType); getWindow().setLayout(width, height); setCanceledOnTouchOutside(canceledOnTouchOutside ? true : false); return this; } /* 参数:dimAmount背景阴影 */ public BaseDialog config(@NonNull View view, @Nullable ViewGroup.LayoutParams params, float dimAmount, int gravity, AnimInType animInType, int width, int height, boolean canceledOnTouchOutside) { setContentView(view, params);//填充对话框布局 setDimAmount(dimAmount); getWindow().setGravity(gravity); setAnimType(animInType); getWindow().setLayout(width, height); setCanceledOnTouchOutside(canceledOnTouchOutside ? true : false); return this; } /* 动画类型 */ public BaseDialog setAnimType(AnimInType animInType) { if (animInType == AnimInType.CENTER) { getWindow().setWindowAnimations(R.style.dialog_zoom); return this; } if (animInType == AnimInType.LEFT) { getWindow().setWindowAnimations(R.style.dialog_anim_left); return this; } if (animInType == AnimInType.TOP) { getWindow().setWindowAnimations(R.style.dialog_anim_top); return this; } if (animInType == AnimInType.RIGHT) { getWindow().setWindowAnimations(R.style.dialog_anim_right); return this; } if (animInType == AnimInType.BOTTOM) { getWindow().setWindowAnimations(R.style.dialog_anim_bottom); return this; } return this; } public void setOffset(int x, int y) { WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.x = x; layoutParams.y = y; } public float getDimAmount() { return getWindow().getAttributes().dimAmount; } /* 设置背景阴影,必须setContentView之后调用才生效 */ public BaseDialog setDimAmount(float dimAmount) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.dimAmount = dimAmount; return this; } /* 动画类型 */ public enum AnimInType { CENTER(0), LEFT(2), TOP(4), RIGHT(3), BOTTOM(1); AnimInType(int n) { intType = n; } final int intType; } } 

CYProgressDialog

 public class CYProgressDialog extends BaseDialog { private MaterialProgressDrawable mProgress; private ValueAnimator valueAnimator; public CYProgressDialog(Context context) { super(context); setCanceledOnTouchOutside(false); } /** * @param color_iv * @param radius_iv * @param color_bg_progress * @param colors_progress * @return */ public CYProgressDialog config(int color_iv, float radius_iv, int color_bg_progress, int... colors_progress) { config(0.2f, color_iv, radius_iv, color_bg_progress, colors_progress); return this; } public CYProgressDialog config(float dimAmount, int color_iv, float radius_iv, int color_bg_progress, int... colors_progress) { FrameLayout frameLayout = new FrameLayout(getContext()); CircleImageView imageView = new CircleImageView(getContext(), color_iv, radius_iv); mProgress = new MaterialProgressDrawable(getContext(), imageView); mProgress.setBackgroundColor(color_bg_progress); //圈圈颜色,可以是多种颜色 mProgress.setColorSchemeColors(colors_progress); //设置圈圈的各种大小 mProgress.updateSizes(MaterialProgressDrawable.DEFAULT); mProgress.showArrow(false); imageView.setImageDrawable(mProgress); frameLayout.addView(imageView); valueAnimator = valueAnimator.ofFloat(0f, 1f); valueAnimator.setDuration(600); valueAnimator.setInterpolator(new DecelerateInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float n = (float) animation.getAnimatedValue(); //圈圈的旋转角度 mProgress.setProgressRotation(n * 0.5f); //圈圈周长,0f-1F mProgress.setStartEndTrim(0f, n * 0.8f); //箭头大小,0f-1F mProgress.setArrowScale(n); //透明度,0-255 mProgress.setAlpha((int) (255 * n)); } }); getWindow().setLayout(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); setContentView(frameLayout); setDimAmount(dimAmount); setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { hide(); return true; } return false; } }); return this; } @Override public void show() { super.show(); if (mProgress == null) return; mProgress.start(); if (valueAnimator == null) return; valueAnimator.start(); } @Override public void hide() { super.hide(); if (mProgress == null) return; mProgress.stop(); if (valueAnimator == null) return; valueAnimator.cancel(); } public void setBackgroundColor(int color) { if (mProgress == null) return; mProgress.setBackgroundColor(color); } public void setColorSchemeColors(int... colors) { if (mProgress == null) return; mProgress.setColorSchemeColors(colors); } } 

GitHub

关注专题Android开发常用开源库

简书

原文链接:https://yq.aliyun.com/articles/653311
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章