自定义控件View 圆环转动!!

记得某天在某个手机看到的效果, 今天实现了一把;先看下效果吧

代码不多,有兴趣的可以看下;

package com.qypt.just.just_study_app;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.LinearInterpolator;

/**
 * Justson
 * Created by Administrator on 2016/7/3.
 */
public class CircleView extends View {


    private Paint paint;
    private int defCircleColor;
    private int defRingColor;
    private int defWidth = 160;
    private int defHeight = 160;
    private RectF rectF = new RectF();
    private float rx;
    private float ry;
    private static final int bouder = 3;
    private ObjectAnimator objectAnimator;

    public CircleView(Context context) {
        super(context);
        init(context, null, 0);
    }


    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        init(context, attrs, 0);

    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {

        paint = new Paint();
        paint.setColor(defCircleColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(1);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setAntiAlias(true);
        paint.setDither(true);

        int density = (int) context.getResources().getDisplayMetrics().density;
        defWidth = defWidth * density;
        defHeight = density * defHeight;


        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleView, defStyleAttr, 0);
        int count = ta.getIndexCount();

        for (int i = 0; i < count; i++) {

            int index = ta.getIndex(i);
            switch (index) {

                case R.styleable.CircleView_circleColor:
                    defCircleColor = ta.getColor(index, Color.YELLOW);
                    break;
                case R.styleable.CircleView_ringColor:
                    defRingColor = ta.getColor(index, Color.BLUE);
                    break;

            }

        }
        if (defCircleColor == 0) {
            defCircleColor = Color.parseColor("#335541");

        }
        if (defRingColor == 0) {
            defRingColor = Color.parseColor("#545633");
        }
        ta.recycle();

    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        rectF.top = 20f;
        rectF.bottom = 20f + h - 40f;
        rectF.left = 20f;
        rectF.right = 20f + w - 40f;

        rx = w / 2;
        ry = h / 2;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        this.setMeasuredDimension(widthMode == MeasureSpec.AT_MOST ? defWidth : MeasureSpec.getSize(widthMeasureSpec),
                heightMode == MeasureSpec.AT_MOST ? defHeight : MeasureSpec.getSize(heightMeasureSpec));

    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        objectAnimator = ObjectAnimator.ofFloat(this,"Rotation",0,359);
        objectAnimator.setDuration(6000);
        objectAnimator.setInterpolator(new LinearInterpolator());
        objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
        objectAnimator.start();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        objectAnimator.cancel();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        paint.setStyle(Paint.Style.STROKE);
        paint.setAlpha(130);
        canvas.drawArc(rectF, 0, 360, false, paint);
        paint.setColor(defCircleColor);
        paint.setStyle(Paint.Style.FILL);
        paint.setAlpha(230);
        canvas.drawCircle(getWidth() / 2, rectF.top, 20, paint);
    }
}
  代码不多,就全部贴上了, 这里主要讲下是先思路,  其实这里是两个圆, 一个大的空心圆和一个小的实心圆, 用属性动画开启转动;有不对的地方还请多多指出;;

   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值