自定义网络请求时加载动画dialog

1.先自定义一个启动时的闪屏textView

package com.yskj.jh.app.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created by Administrator on 2016/11/3 0003.
 */
public class FlashTextView extends TextView {
    //下面是实现动画需要的一些变量
    private int mViewWidth = 0;
    private Paint mPaint;
    private LinearGradient mLinearGradient;
    private Matrix mMatrix = null;
    private int mTranslate;


    public FlashTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    public FlashTextView(Context context) {
        super(context, null);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

/**
 * 这个方法在TextView大小的改变会被调用
 *
 * int w 改变后的宽
 * int h 改变后的高
 * int oldw 改变前的宽
 * int oldh 改变前的高
 *
 * 该方法里面只是为了初始花上面定义的成员变量
 */
        if (mViewWidth == 0) {
            mViewWidth = getMeasuredWidth();   //拿到TextView的宽
            if (mViewWidth > 0) {
                mPaint = getPaint();   //拿到画TextView的笔

//初始化渐变色给画笔用
/**
 * LinearGradient所需的
 * float x0, float y0, float x1, float y1, startColor, stopColor, TileMode tile
 * float x0, float y0, float x1, float y1, int[] colors, float[] positions, TileMode tile
 *
 * float x0, float y0, float x1, float y1 在坐标上定了2个点,理解为在这个范围颜色渐变,渐变的颜色就是参数你设置的startColor, stopColor或则int[] colors
 * 这里没用到positions设为null就行
 */
                mLinearGradient = new LinearGradient(0, 0, mViewWidth, 0, new int[]{0xff16ade3, 0xffffffff, 0xff16ade3}, null, Shader.TileMode.CLAMP);
                mPaint.setShader(mLinearGradient);   //把你之前设置好渐变的颜色设置到上面初始画的笔中
                mMatrix = new Matrix();   //初始花颜色矩阵
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

/**
 * 在onSizeChanged中初始化我们要的东西就可以开始画了
 */
        if (mMatrix != null) {
            mTranslate += mViewWidth / 5;
            if (mTranslate > 2 * mViewWidth) {
                mTranslate = -mViewWidth;
            }

/**
 * 画出动画的主要的就是下面的3个方法
 */
            mMatrix.setTranslate(mTranslate, 0);   //平移矩阵
            mLinearGradient.setLocalMatrix(mMatrix);   //把平移后的矩阵设置到颜色渐变中
            postInvalidateDelayed(100);   //最后一步就开始画了,这个方法会隔100毫秒画一次,但是每次颜色的矩阵是不同,这样你就会看到颜色动起来了
        }
    }
}

2.自定义dialog

package com.yskj.jh.app.dialog;

import android.app.Dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.yskj.jh.app.R;


public class MyLoading extends Dialog{

    private Context context = null;

    public MyLoading(Context context) {
        super(context);
        this.context = context;
    }

    public MyLoading(Context context, int theme) {
        super(context, theme);
    }

    /** 
     * 得到自定义的progressDialog 
     * @param context 
     * @return
     */  
    public static MyLoading createLoadingDialog(Context context) {  

        View view = LayoutInflater.from(context).inflate(R.layout.loading, null);// 得到加载view
        FrameLayout dialogView = (FrameLayout) view.findViewById(R.id.dialog_view);// 加载布局   
        ImageView loading = (ImageView) view.findViewById(R.id.loading);

        Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(context, R.anim.loading_animation);// 加载动画    
        loading.startAnimation(hyperspaceJumpAnimation);// 使用ImageView显示动画 

        MyLoading loadingDialog = new MyLoading(context, R.style.loading_dialog);// 创建自定义样式dialog  

        loadingDialog.setCancelable(true);// 不可以用“返回键”取消  
        loadingDialog.setContentView(dialogView, new LinearLayout.LayoutParams(  
                LinearLayout.LayoutParams.FILL_PARENT,  
                LinearLayout.LayoutParams.FILL_PARENT));// 设置布局  
        return loadingDialog;  
    }  

}

3.dialog布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialog_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@mipmap/loading_bg"
    android:gravity="center"
    android:minHeight="60dp"
    android:minWidth="60dp"
    android:orientation="vertical"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@mipmap/loading" />

    <com.yskj.jh.app.widget.FlashTextView
        android:id="@+id/loading_logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="加载中"
        android:textSize="14sp"/>

</FrameLayout>

4.在style中自定义dialog样式

<!-- 自定义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">@mipmap/loading_bg</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

5.用到的动画再res中anim文件夹

<?xml version="1.0" encoding="utf-8"?>
<set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android">  
    <rotate   
        android:interpolator="@android:anim/linear_interpolator"  
        android:pivotX="50%"  
        android:pivotY="50%"  
        android:fromDegrees="0"  
        android:toDegrees="+360"  
        android:duration="1000"
        android:startOffset="-1"  
        android:repeatMode="restart"
        android:repeatCount="-1"/> 

</set>

6.用到的背景图
这里写图片描述
这里写图片描述

7.使用-调用下面方法(可写在基类中)

 /**
     * dialog 启动
     */
    public void startMyDialog() {
        if (myloading == null) {
            myloading = MyLoading.createLoadingDialog(context);
        }
        if (!isFinishing()) {
            myloading.show();
        }
    }

    /**
     * dialog 销毁
     */
    public void stopMyDialog() {
        if (myloading != null) {
            if (!isFinishing()){
                myloading.dismiss();
            }
            myloading = null;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值