本来想找一个ios的菊花加载图旋转一下搞定这个的,但是发现使用图片后由于图片的不对称导致动画时有抖动现象,不能忍,于是搜了下自定义菊花图,额,然后就没有然后了,都不是想要的,于是开始了苦逼的自定义View...
先来张效果图:
菊花图.png
再来张动画效果图:
嗯是的我动起来了.gif
看图说话:
1、12条颜色线,带圆角
2、动画起来后12个颜色跟着变化
需要解决的问题:
1、12个颜色,也太多了吧!!!!我可不想吸这么多次,有毒的!(嗯,我为吸管代言)
于是愉快的决定了只是用两种颜色,即开始颜色和结束颜色,其余使用渐变获取。(额,好吧,我是懒了!)
2、动画
什么,动画是问题吗?一个旋转搞定了!嗯,你大佬,你来,反正我做不来!!
由于旋转动画是转动的,难以实现颜色跟着变化的效果,所以我使用了ValueAnimator,
嗯,是的,你猜对了,既然使用了ValueAnimator,就要调用 invalidate(); 或 postInvalidate(); 来实现重绘。
嗯,看起来还是挺简单的,来试试吧:
先定义一下属性:
/**
* 线圆角及宽度
*/
private int mLineBold;
/**
* 线条开始颜色 默认白色
*/
private int mStartColor = Color.parseColor("#FFFFFF");
/**
* 线条结束颜色 默认灰色
*/
private int mEndColor = Color.parseColor("#9B9B9B");
/**
* view的宽度 高度
*/
private int mWidth;
/**
* view的高度
*/
private int mHeight;
/**
* 线条长度
*/
private int mLineLength;
/**
* 线条个数 默认12条
*/
private int mLineCount = 12;
/**
* 背景画笔
*/
private Paint mBgPaint;
/**
* 渐变颜色
*/
private int[] mColors;
/**
* 动画是否已开启
*/
private boolean isAnimationStart;
/**
* 开始index
*/
private int mStartIndex;
/**
* 动画
*/
private ValueAnimator mValueAnimator;
>>>>>>>>>>>>>>> 然后继续 >>>>>>>>>>>>>>>>>
1.第一步:
自定义属性:
// 由于考虑到后续可能使用更多数量的线,所以索性加了个线个数的属性
2.第二步,初始化:
public ChrysanthemumView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
loadAttrs(context, attrs);
initPaint();
initColor();
}
/**
* 加载自定义的属性
*/
private void loadAttrs(Context context, AttributeSet attrs) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ChrysanthemumView);
mStartColor = array.getColor(R.styleable.ChrysanthemumView_startColor, mStartColor);
mEndColor = array.getColor(R.styleable.ChrysanthemumView_endColor, mEndColor);
mLineCount = array.getInt(R.styleable.ChrysanthemumView_lineCount, mLineCount);
//TypedArray回收
array.recycle();
}
/**
* 初始化画笔
*/
private void initPaint() {
mBgPaint = new Paint();
//使得画笔更加圆滑
mBgPaint.setAntiAlias(