Android(缩放太极图的源码:)

演示效果,用的是真机测试不方便弄图片了,直接缓存一下源码:
java版本:

package com.example.testcomponent.MyViews;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.ScaleAnimation;

import androidx.annotation.Nullable;

public class MyView1 extends View {
    private Paint paint;
    /*圆心的坐标*/
    private float currentX = 0;
    private float currentY = 0;

    /*大圆半径*/
    private float radiusBig = 200;
    /*中圆半径*/
    private float radiusCenter = radiusBig / 2;
    /*小圆半径*/
    private float radiusSmall = radiusCenter / 3;

    private float padding = 8;

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

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

    public MyView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        paint = new Paint();
        /*抗锯齿*/
        paint.setAntiAlias(true);


        setAnimation();
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        /*屏幕的宽高:*/

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        /*通过Measure 拿到x轴*/
        /*通过Measure 拿到Y轴*/
        currentX = MeasureSpec.getSize(widthMeasureSpec) / 2;
        currentY = MeasureSpec.getSize(heightMeasureSpec) / 2;

        System.out.println("--------currentX:" + currentX + "  currentY:" + currentY);
        /*绘制*/

        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
    }

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

        drawBg(canvas);
        drawLeftHalfCirle(canvas);
        drawTBCircle(canvas);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        /*获取当前手指所在的X轴和Y轴*/
        currentX = event.getX();
        currentY = event.getY();
        /*在当view里面的当前位置的坐标*/


        invalidate();/*重绘*/

        return true;/*表示不通知父亲控件,自己处理。。。*/
    }

    private void setAnimation() {
        ScaleAnimation scaleAnimation = new ScaleAnimation(
                /*从 X  Y到 x Y*/
                0.7f,
                1.0f,

                0.7f,
                1.0f,

                /*设置缩放中心:*/
                ScaleAnimation.RELATIVE_TO_PARENT,
                0.5f,
                ScaleAnimation.RELATIVE_TO_PARENT,
                0.5f);

        /*设置动画周期*/
        scaleAnimation.setDuration(1000);

        /*设置重复状态*/
        scaleAnimation.setRepeatCount(0);

        /*设置是否保持,结束时候的状态:*/
        scaleAnimation.setFillAfter(true);

        /*设置动画属性*/
        startAnimation(scaleAnimation);
    }

    private void drawBg(Canvas canvas) {
        paint.setColor(Color.BLACK);

        canvas.drawCircle(
                currentX,
                currentY,
                radiusBig + padding,//半径
                paint);
    }

    private void drawLeftHalfCirle(Canvas canvas) {
        paint.setColor(Color.WHITE);
        canvas.drawArc(new RectF(
                        currentX - radiusBig,
                        currentY - radiusBig,
                        currentX + radiusBig,
                        currentY + radiusBig),
                90,
                180,
                true,
                paint);
    }

    private void drawTBCircle(Canvas canvas) {
        paint.setColor(Color.WHITE);
        /*画上面的小白圆*/
        canvas.drawCircle(currentX,
                currentY - radiusBig / 2,
                radiusCenter, paint);
        /*画上面的小黑圆*/
        paint.setColor(Color.BLACK);
        canvas.drawCircle(currentX,
                currentY - radiusBig / 2,
                radiusSmall,
                paint);


        /*画下面的小白圆*/
        paint.setColor(Color.BLACK);
        canvas.drawCircle(currentX,
                currentY + radiusBig / 2,
                radiusCenter, paint);
        /*画下面的小黑圆*/
        paint.setColor(Color.WHITE);
        canvas.drawCircle(currentX,
                currentY + radiusBig / 2,
                radiusSmall, paint);
    }

}

Kotlin版本:

package com.example.juhe.ConstomViews

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.icu.util.Currency
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.animation.ScaleAnimation

class MyView1(ctx: Context) : View(ctx) {

    val paint: Paint by
    lazy {
        Paint()
    }

    /*大圆的中心:*/
    private var currentX: Float = 0F
    private var currentY: Float = 0F

    private val padding = 8

    private val radiusBig = 200F
    private val radiusMid = radiusBig / 2
    private val radiusSmall = radiusMid / 3

    constructor(
        ctx: Context,
        attrs: AttributeSet
    ) : this(ctx) {

    }

    constructor(
        ctx: Context,
        attrs: AttributeSet,
        defStyleAttr: Int
    ) : this(ctx, attrs) {

        /*抗锯齿*/
        paint.isAntiAlias = true

        setAniamtion()

    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        currentX = (MeasureSpec.getSize(widthMeasureSpec) / 2).toFloat()
        currentY = (MeasureSpec.getSize(heightMeasureSpec) / 2).toFloat()

        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        canvas!!.let {
            drawBig(it)
            drawHalfLeftCircle(it)
            drawCircles(it)
        }
        
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        event!!.let {
            currentX = it.x
            currentY = it.y

            invalidate()/*重绘*/
        }
        return true
    }

    fun drawBig(canvas: Canvas) {
        paint.color = black

        canvas!!.drawCircle(
            currentX, currentY,
            padding + radiusBig,
            paint
        )

    }

    fun drawHalfLeftCircle(canvas: Canvas) {
        paint.color = white
        canvas.drawArc(
            RectF(
                currentX - radiusBig,
                currentY - radiusBig,
                currentX + radiusBig,
                currentY + radiusBig
            ),
            90F,
            180F, true, paint
        )
    }

    fun drawCircles(canvas: Canvas) {
        paint.color = white
        canvas.drawCircle(currentX, currentY - radiusMid, radiusMid, paint)

        paint.color = black
        canvas.drawCircle(currentX, currentY + radiusMid, radiusMid, paint)
        canvas.drawCircle(currentX, currentY - radiusMid, radiusSmall, paint)

        paint.color = white
        canvas.drawCircle(currentX, currentY + radiusMid, radiusSmall, paint)
    }

    fun setAniamtion() {
        val scaleAnimation = ScaleAnimation(
            0.7f,
            1.0f,

            0.7f,
            1.0f,
            ScaleAnimation.RELATIVE_TO_PARENT,
            0.5f,
            ScaleAnimation.RELATIVE_TO_PARENT,
            0.5f
        )

        scaleAnimation.duration = 1000L
        scaleAnimation.repeatCount = 0
        scaleAnimation.fillAfter = true


        startAnimation(scaleAnimation)
    }

    companion object {
        val black = Color.BLACK
        val white = Color.WHITE
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值