好久没写博客啦。。今天来个交叉动画的进度条。。看着挺玄的,现在大多数都是直接使用DialogFragment来实现,那咱们也就用DialogFragment来实现。使用DialogFragment实现对话框和进度条是现在比较流行和常用的方式
要有交叉的动画效果,我们首先需要一些列的图片来构成一个完整的动画,将这些图片按顺序放到一个xml中,随便找一个组件作为它的背景即可
先看xm文件
<?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="wrap_content" android:background="@drawable/bg_cross_progress_back" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/tv_cp_load" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg_cross_progress" android:text="" /> <TextView android:id="@+id/tv_cp_content" style="@style/text_22" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="@string/app_name" android:textColor="@color/white" /> </LinearLayout>
接下来就是我们的bg_cross_progres背景即一个包含一些列图片的drawable
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/bg_cross_progress_1" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_2" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_3" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_4" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_5" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_6" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_7" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_8" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_9" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_10" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_11" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_12" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_13" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_14" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_15" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_16" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_17" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_18" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_19" android:duration="50"/> <item android:drawable="@drawable/bg_cross_progress_20" android:duration="50"/> </animation-list>
需要注意的是这个xml文件的根目录是 animation-list,将这个xml文件放到你定义的drawable文件夹中
3:定义自己的交叉动画dialog【继承DialogFragment】
public class CrossProgressDialog extends DialogFragment { /** 名称&TAG **/ private static final String NAME = CrossProgressDialog.class.getSimpleName(); /** 加载内容对应的bundle key **/ private static final String CONTENT = "dialog_progress_content"; /** 对话框实例 **/ private static CrossProgressDialog mDialog; /** 取消事件 **/ private DialogCancelListener mCancelListener; /** * 消失dialog */ public static void dismissDialog() { if (mDialog != null) { try { mDialog.dismiss(); mDialog = null; } catch (Exception e) { LogUtils.logException(e); } } } /** * {@link android.support.v4.app.DialogFragment#show(FragmentManager, String)} * 显示 */ public static CrossProgressDialog show(FragmentManager fragmentManager) { return show(fragmentManager, null, true); } /** * {@link android.support.v4.app.DialogFragment#show(FragmentManager, String)} * 显示 */ public static CrossProgressDialog show(FragmentManager fragmentManager, String content, boolean cancelable) { return show(fragmentManager, content, cancelable, null); } /** * {@link android.support.v4.app.DialogFragment#show(FragmentManager, String)} * 显示 */ public static CrossProgressDialog show(FragmentManager fragmentManager, String content, boolean cancelable, DialogCancelListener cancelListener) { //存在即移除 removeIfExist(fragmentManager); //初始化对象 mDialog = newInstance(); //设置取消事件 mDialog.setCancelable(cancelable); if (cancelable) { mDialog.mCancelListener = cancelListener; } //设置加载内容 if(!TextUtils.isEmpty(content)) { Bundle args = new Bundle(); args.putString(CONTENT, content); mDialog.setArguments(args); } //显示 mDialog.show(fragmentManager, NAME); return mDialog; } /** * 存在即移除.
初始化的时候若存在则直接强制从pop栈中移除 */ private static void removeIfExist(FragmentManager fragmentManager) { Fragment f = fragmentManager.findFragmentByTag(NAME); if (f != null) { fragmentManager.beginTransaction().remove(f).commit(); } } /** * 初始化实例. * @Description: 初始化 */ private static CrossProgressDialog newInstance() { CrossProgressDialog dialog = new CrossProgressDialog(); dialog.setStyle(STYLE_NO_FRAME, R.style.cross_dialog); return dialog; } @Override public void onCancel(DialogInterface dialog) { super.onCancel(dialog); if (mCancelListener != null) { mCancelListener.onCancelDialog(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.dialog_cross_progress, container, false); AnimationDrawable loadAnima = (AnimationDrawable) layout.findViewById(R.id.tv_cp_load).getBackground(); loadAnima.start(); //启动背景动画 TextView tv = (TextView) layout.findViewById(R.id.tv_cp_content); int visibility = View.GONE; //如果有内容,设置内容. if (getArguments() != null) { String content = getArguments().getString(CONTENT); if(!TextUtils.isEmpty(content)) { visibility = View.VISIBLE; tv.setText(content); } } tv.setVisibility(visibility); return layout; } }
ok 了。。最后贴一下dialog的那个style
这个style就是保持屏幕背景不会变暗
<style name="cross_dialog" parent="@style/dialog"> <item name="android:backgroundDimEnabled">false</item> </style>