现在的位置: 首页 > 综合 > 正文

交叉动画进度条

2018年02月16日 ⁄ 综合 ⁄ 共 5467字 ⁄ 字号 评论关闭

   好久没写博客啦。。今天来个交叉动画的进度条。。看着挺玄的,现在大多数都是直接使用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>

抱歉!评论已关闭.