downloadView下载动画(自定义控件)

本文介绍了如何在Android中创建一个自定义控件downloadView,用于显示下载过程的动画。通过分析下载的三个阶段:开始、进行中和完成,展示了从java代码、attrs代码到XML布局和Activity的实现步骤。虽然部分细节未展开详细讲解,但提供了关键代码段,方便开发者直接应用或参考。
摘要由CSDN通过智能技术生成
	本文撰写目的在于重写复习自定义控件的一些方法,希望对大家用帮助。
	
	首先看效果图:


再来代码:

java代码:

package com.hs.samplewidget.myView;

import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DrawFilter;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

import com.hs.samplewidget.R;

/**
 * 下载时显示进度的动画效果
 * 
 * 作者:zhanghaitao on 2017/8/15 09:42
 * 邮箱:820159571@qq.com
 * 
 * 补充知识:
 * postInvalidate();//在非UI线程中使用
 * invalidate();//在UI线程自身中使用
 * onDraw是在View初化完成之后开始调用
 * 调用invalidate()/postInvalidate()后系统会重新调用onDraw方法画一次。
 * 单线程模型:AndroidUI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
 * Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。
 */

public class DownloadView extends View {

    private static final String TAG = "DownloadView";

    private int mProgressBackgroundColor;    //进度条的背景色
    private int mProgressColor;    //进度条的颜色
    private float mProgressMax = 100;    //最大的进度值
    private float mCircleWidth;    //圆环的宽度
    private float mTextSize;    //文字大小
    private int mTextColor;    //文字颜色
    private float mProgress = 80;    //当前进度,只要不小于0,随便改

    //动画对象
    private ValueAnimator arrowAnimator;
    private ValueAnimator launchAnimator;
    private ValueAnimator progressAnimator;

    //画笔
    private Paint mRingPaint;
    private Paint mTextPaint;
    private Paint mPaint;
    private Paint mLaunchBallPaint;

    //水波纹
    private static final float STRETCH_FACTOR_A = 10;   //幅度
    private static final int OFFSET_Y = 0;              //y的偏移量
    private static final int TRANSLATE_X_SPEED = 1; //水波移动速度
    private float mCycleFactorW;    //周期
    private float[] mYPositions;    //Y的坐标点
    private float[] mResetYPositions;   //改变后Y的坐标点
    private int mXOffsetSpeed;  //每次偏移量
    private int mXOffset;   //每次便宜的距离

    private Context context;
    private DrawFilter mDrawFilter;  //开启抗锯齿
    private int mTotalWidth;    //view的宽度

    //箭头动画的类型
    private int drawType = 0;
    private final int START_DOWNLOAD = 1;    //开始下载前箭头收缩的动画
    private final int START_LAUNCH = 2;    //箭头收缩后,小球弹射的动画
    private final int START_PROGRESS = 3;    //绘画进度的动画

    private float arrowCoordinate;    //箭头变化的坐标
    private float launchCoordinate;    //弹射小球Y坐标

    public DownloadView(Context context) {
        this(context, null);
        initCofig(context, null);
        init();
    }

    public DownloadView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        initCofig(context, attrs);
        init();
    }

    public DownloadView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initCofig(context, attrs);
        init();
    }

    private void initCofig(Context context, AttributeSet attrs) {
        this.context = context;
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DownloadView);
        mProgressBackgroundColor = typedArray.getColor(R.styleable.DownloadView_progress_background_color, Color.GRAY);
        mProgressColor = typedArray.getColor(R.styleable.DownloadView_progress_color, Color.BLUE);
        mProgressMax = typedArray.getFloat(R.styleable.DownloadView_progress_max, 100);
        mCircleWidth = typedArray.getDimension(R.styleable.DownloadView_circle_width, 10);
        mTextSize = typedArray.getDimension(R.styleable.DownloadView_text_size, 60);
        mTextColor = typedArray.getColor(R.styleable.DownloadView_text_color, Color.RED);
        typedArray.recycle();
    }

    private void init() {
        //圆环画笔
        mRingPaint = new Paint();
        mRingPaint.setAntiAlias(true);
        mRingPaint.setColor(mProgressBackgroundColor);
        mRing
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值