自定義旋轉太極圖

package com.packg.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;

/**
 * created by wy on 2020-03-26
 * description : 自定義太極圖,自動旋轉
 */
public class TaijiView extends View {

    private Paint bPaint;//黑色畫筆
    private Paint wPaint;//白色畫筆
    private Paint gPaint;//陰影

    private int padding = 40;//邊距
    private int radius = 0;//半徑
    private int width, height;//寬高
    private PointF center = new PointF();//中心點

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

    public TaijiView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TaijiView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        bPaint = new Paint();
        bPaint.setColor(Color.BLACK);
        bPaint.setAntiAlias(true);
        wPaint = new Paint();
        wPaint.setColor(Color.WHITE);
        wPaint.setAntiAlias(true);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        //計算寬高、邊距、半徑、中心點
        width = right - left;
        height = bottom - top;
        padding = width / 20;
        radius = (Math.min(width, height) - padding * 2) / 2;
        center.x = width / 2;
        center.y = height / 2;
    }

    private int angle = 0;

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

        RadialGradient rgl = new RadialGradient(center.x, center.y, radius + padding / 2, new int[]{Color.DKGRAY, Color.LTGRAY, Color.TRANSPARENT},
                new float[]{0.8f, 0.95f, 1f}, Shader.TileMode.CLAMP);
        gPaint = new Paint();
        gPaint.setAntiAlias(true);
        gPaint.setShader(rgl);
        RectF rfsd1 = new RectF(0, 0, width, height);
        canvas.drawArc(rfsd1, 0, 360, true, gPaint);//畫陰影

        Matrix matrix = new Matrix();
        matrix.setRotate(angle, center.x, center.y);//以繪製區域中心爲遠點旋轉,並將旋轉角度遞增,達到轉圈的效果
        canvas.setMatrix(matrix);

        RectF rv = new RectF(padding, padding, width - padding, height - padding);
        canvas.drawArc(rv, 180, 180, true, wPaint);//上半圓底色
        canvas.drawArc(rv, 0, 180, true, bPaint);//下半圓底色
        RectF wHead = new RectF(padding, center.y - radius / 2 - 1, center.x, center.y + radius / 2 - 1);//top和bottom - 1是爲了完全閉合,右邊半圓同理+1
        canvas.drawArc(wHead, 0, 180, true, wPaint);//左小半圓
        RectF bHead = new RectF(center.x, center.y - radius / 2 + 1, width - padding, center.y + radius / 2 + 1);
        canvas.drawArc(bHead, 180, 180, true, bPaint);//右小半圓
        canvas.drawCircle(center.x - radius / 2, center.y, padding, bPaint);//白色中間的黑圓
        canvas.drawCircle(center.x + radius / 2, center.y, padding, wPaint);//黑色中間的白圓
        angle += 2;//角度自增,旋轉
        angle %= 360;
        invalidate();
    }
}

demo審覈中,後面補充
或者可以自己去翻,不要分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章