自定义动画烟花

/**
 * Created by ylwang on 2017/8/10.
 */

public class LineView extends View {

    private final Paint paint = new Paint();

    public LineView(Context context) {
        this(context, null);
    }

    public LineView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LineView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initParams();
    }

    private void initParams() {
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);
        paint.setColor(Color.parseColor("#ffffff"));
        angel = 360 / count;
    }

    public void setCount(int count) {
        this.count = count;
        this.angel = 360 / count;
        invalidate();
    }

    private int angel;
    private int count = 10;
    private float startX = 50, endX = 50;
    private float centerX = 100;
    private float centerY = 100;
    private float ratio = 2f / 3f;
    private float size = 500f;

    /**
     * 内圆半径/外圆半径 比例
     *
     * @param ratio
     */
    public void setRatio(float ratio) {
        this.ratio = ratio;
        postInvalidate();
    }

    private float START_X;

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        centerX = getMeasuredWidth() / 2;
        centerY = getMeasuredHeight() / 2;
        size = centerX * (1 - ratio);//计算线的长度
        startX = centerX - size;//起点
        endX = startX;
        START_X = startX;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.translate(centerX, centerY);
        for (int i = 0; i < count; i++) {
            canvas.rotate(angel);
            canvas.drawLine(startX, 0, endX, 0, paint);
        }
//        canvas.drawCircle(0, 0, endX - paint.getStrokeWidth(), paint);
//        canvas.drawCircle(0, 0, startX - paint.getStrokeWidth(), paint);
    }

    private void setStart(float tempX) {
        startX = START_X + tempX;
        invalidate();
    }

    private void setEnd(float tempX) {
        endX = START_X + tempX;
        invalidate();
    }

    public void startAnim() {
        final float startV = 0.0f;//起始透明度
        final float endV = 0.8f;//最终透明度
        ObjectAnimator fadeOutIn = ObjectAnimator.ofFloat(this, "alpha", startV, endV);
//        fadeOutIn.setInterpolator(new AccelerateDecelerateInterpolator());
        fadeOutIn.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float f = (float) animation.getAnimatedValue();
                float d = (f - startV) / endV;
                if (d - 0.5f < 0.001) {//改变end
                    setEnd(size * (d * 2.0f));
                } else {//大于 改变start
                    setStart(size * ((d - 0.5f) * 2.0f));
                }
            }
        });
        fadeOutIn.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                animFinishListener.onFinish();
            }
        });
        fadeOutIn.setDuration(1600);
        fadeOutIn.start();
    }

    public void reset() {
        startX = START_X;//起点
        endX = START_X;
    }


    public interface onAnimFinishListener {
        void onFinish();
    }

    private onAnimFinishListener animFinishListener;

    public void setOnAnimFinishListener(onAnimFinishListener animFinishListener) {
        this.animFinishListener = animFinishListener;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值