演示效果,用的是真机测试不方便弄图片了,直接缓存一下源码:
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
}
}