一、前言
本文通过一个简单的旋转环控件,了解自定义view 的一些基本知识。在进一步的解释之前,先上效果图
                
              
二、代码
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import androidx.annotation.Nullable;
/*
 * Created by kwy on 2020/5/11
 */
public class RotatingRing extends View {
    private int centerX; // 圆环旋转中心X
    private int centerY; // 圆环旋转中心Y
    private Paint paint; // 用于绘制的画笔
    private RectF rectF; // 用于绘制圆环的矩形参数
    private int radius; // 圆环半径
    private int width; // 圆环宽度
    int angle; // 圆环的旋转角度
    int duration; // 旋转一圈耗时
    int startAngle; // 圆环初始角度 3点钟方向为 0°
    int sweepAngle; // 圆环扫过的角度
    int startColor; // 首部颜色
    int endColor; // 尾部颜色
    /**
     * 默认的构造函数
     * @param context 上下文
     */
    public RotatingRing(Context context) {
        super(context);
        radius = 100;
        width = 20;
        startAngle = 0;
        sweepAngle = 270;
        startColor = Color.WHITE;
        endColor = Color.BLUE;
        duration = 1000;
    }
    public RotatingRing(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public RotatingRing setColor(int endColor) {
        this.endColor = endColor;
        return this;
    }
    public RotatingRing setColor(int startColor, int endColor) {
        this.startColor = startColor;
        this.endColor = endColor;
        return this;
    }
    public RotatingRing setRadius(int radius) {
        this.radius = radius;
        return this;
    }
    public RotatingRing setWidth(int width) {
        this.width = width;
        return this;
    }
    public RotatingRing setAngle(int startAngle, int sweepAngle) {
        this.startAngle = startAngle;
        this.sweepAngle = sweepAngle;
        return this;
    }
    public RotatingRing setDuration(int duration) {
        this.duration = duration;
        return this;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.rotate(angle, centerX, centerY);
        canvas.drawArc(rectF, paint.getStrokeCap() == Paint.Cap.ROUND ? startAngle + width/2f: startAngle,
                sweepAngle, false, paint);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        centerX = w / 2;
        centerY = h / 2;
        rectF = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
        setPaint();
    }
    /**
     * 初始化画笔
     */
    private void setPaint(){
        paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setShader(new SweepGradient(centerX, centerY,
                new int[]{startColor, endColor},
                new float[]{startAngle/360f*1.0f, sweepAngle/360f*1.0f}));
        paint.setAntiAlias(true);
        paint.setStrokeWidth(width);
    }
    public void startAnim(){
        final ValueAnimator animator = ValueAnimator.ofInt(0,360);
        animator.setDuration(duration);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setRepeatMode(ValueAnimator.RESTART);
        animator.setInterpolator(new LinearInterpolator());
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                angle = (int) animation.getAnimatedValue();
                invalidate();
            }
        });
        animator.start();
    }
}
三、应用
在 activity_main.xml 中添加该自定义view,如下所示
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <你的包名.RotatingRing
        android:id="@+id/rotating_ring"
        android:layout_width="400dp"
        android:layout_height="400dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在 MainActivity.java 中,开启动画
import android.graphics.Color; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { RotatingRing rotatingRing; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rotatingRing = findViewById(R.id.rotating_ring); rotatingRing.setWidth(30) .setRadius(150) .setAngle(40,260) .setColor(Color.BLUE) .setDuration(1500) .startAnim(); } }
完成!下节 将对代码进行简单的解释
 
                    
                 
 posted on
 posted on 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号