您的位置:首页 > 理论基础 > 计算机网络

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

2016-11-03 16:12 363 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息