package com.example.custome_view.diwoda;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.example.custome_view.R;
import com.fudaojun.fudaojunlib.utils.LibCalcUtil;
/**
* Created by ZhijunHong on 2018/7/5.
* 一個簡單的自定義View + 動畫集合
*/
public class DiWoDaView extends View {
//控件寬度
private int mWidth;
//控件高度
private int mHeight;
//外部圓畫筆
private Paint mOutCirclePaint;
//外部圓半徑
private float mOutCircleRaduis;
//外部圓透明度
private int mTransparency;
//外部圓顏色
private int mCircleColor;
//內部圓畫筆
private Paint mInCirclePaint;
//內部圓半徑
private float mInCicleRadius;
//handler
private Handler mHandler;
//動畫集合
private AnimatorSet mAnimationSet;
public DiWoDaView(Context context) {
this(context, null);
}
public DiWoDaView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DiWoDaView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 初始化資源
*/
private void init() {
mOutCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
mOutCirclePaint.setStyle(Paint.Style.FILL);
mOutCirclePaint.setColor(Color.YELLOW);
mInCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
mInCirclePaint.setStyle(Paint.Style.FILL);
mInCirclePaint.setColor(getResources().getColor(R.color.orange));
mOutCircleRaduis = LibCalcUtil.dp2px(getContext(), 80);
mInCicleRadius = LibCalcUtil.dp2px(getContext(), 40);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(mWidth / 2, mHeight / 2);
//畫外圍大圓
canvas.drawCircle(0, 0, mOutCircleRaduis, mOutCirclePaint);
//畫裏面小圓
canvas.drawCircle(0, 0, mInCicleRadius, mInCirclePaint);
}
/**
* 開始動畫
*/
public void playAnimation() {
if (mAnimationSet == null) {
mAnimationSet = new AnimatorSet();
//大圓半徑變更動畫
ValueAnimator anim1 = ValueAnimator.ofFloat(0, mOutCircleRaduis);
//大圓透明度變更動畫
ValueAnimator anim2 = ValueAnimator.ofInt(256, 0);
// //沿Y軸旋轉動畫
// ObjectAnimator anim3 = ObjectAnimator.ofFloat(this, "rotationY", 0f, 360f);
// //設置一起執行動畫
// mAnimationSet.playTogether(anim1, anim2, anim3);
// anim3.setRepeatCount(ValueAnimator.INFINITE);
mAnimationSet.playTogether(anim1, anim2);
//設置重複執行動畫
anim1.setRepeatCount(ValueAnimator.INFINITE);
anim2.setRepeatCount(ValueAnimator.INFINITE);
anim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (animation != null) {
//改變外圍大圓半徑
mOutCircleRaduis = (float) animation.getAnimatedValue();
}
}
});
anim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//改變外圍大圓透明度
mTransparency = (int) animation.getAnimatedValue();
}
});
}
//啓動動畫
mAnimationSet.setDuration(2000).start();
if (mHandler == null) {
mHandler = new Handler();
}
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mCircleColor = Color.argb(mTransparency, 255, 143, 5);
mOutCirclePaint.setColor(mCircleColor);
//重繪
postInvalidate();
mHandler.postDelayed(this, 50);
}
}, 50);
}
}
小視頻系統源碼自定View-模仿點我達開頻頁加載動畫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.