本文撰写目的在于重写复习自定义控件的一些方法,希望对大家用帮助。 首先看效果图:
再来代码:
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