package com.example.myapplication;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class RingBall extends View {
int mWidth;
int mHeight;
private Paint mPaint;
private int mCenterX;
private int mCenterY;
private float radiusBig;
private float radiusSmall;
private Ball mOne;
private Ball mTwo;
private Ball mThree;
private Ball mFour;
private class Ball {
int speed;
boolean fast;
int angle;
public Ball(int speed, boolean fast, int angle) {
this.speed = speed;
this.fast = fast;
this.angle = angle;
}
public void upDateAngle() {
angle += speed;
if (angle > 360) {
angle -= 360;
}
}
public void addAngle() {
angle += 5;
}
}
public RingBall(Context context) {
super(context);
init();
}
public RingBall(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RingBall(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
radiusBig = dp2px(60);
radiusSmall = dp2px(50);
mOne = new Ball(3, true, 180);
mTwo = new Ball(2, false, 0);
mThree = new Ball(3, true, 270);
mFour = new Ball(2, false, 90);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
mCenterX = mWidth / 2;
mCenterY = mHeight / 2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**
* draw big ring
*/
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.BLUE);
canvas.drawCircle(mCenterX, mCenterY, radiusBig, mPaint);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(getBigBallCenterX(mOne.angle), getBigBallCenterY(mOne.angle), dp2px(2), mPaint);
mPaint.setColor(Color.RED);
canvas.drawCircle(getBigBallCenterX(mTwo.angle), getBigBallCenterY(mTwo.angle), dp2px(2), mPaint);
if (mOne.fast) {
if (mTwo.angle - mOne.angle < 5 && mTwo.angle - mOne.angle > 0) {
mTwo.speed = 3;
mOne.speed = 2;
mTwo.fast = true;
mOne.fast = false;
mTwo.addAngle();
}
mOne.upDateAngle();
mTwo.upDateAngle();
} else {
if (mOne.angle - mTwo.angle < 5 && mOne.angle - mTwo.angle > 0) {
mTwo.speed = 2;
mOne.speed = 3;
mTwo.fast = false;
mOne.fast = true;
mOne.addAngle();
}
mOne.upDateAngle();
mTwo.upDateAngle();
}
/**
* draw small ring
*/
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.BLUE);
canvas.drawCircle(mCenterX, mCenterY, radiusSmall, mPaint);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(getSmallBallCenterX(mThree.angle), getSmallBallCenterY(mThree.angle), dp2px(2), mPaint);
mPaint.setColor(Color.RED);
canvas.drawCircle(getSmallBallCenterX(mFour.angle), getSmallBallCenterY(mFour.angle), dp2px(2), mPaint);
if (mThree.fast) {
if (mFour.angle - mThree.angle < 5 && mFour.angle - mThree.angle > 0) {
mFour.speed = 3;
mThree.speed = 2;
mFour.fast = true;
mThree.fast = false;
mFour.addAngle();
}
mThree.upDateAngle();
mFour.upDateAngle();
} else {
if (mThree.angle - mFour.angle < 5 && mThree.angle - mFour.angle > 0) {
mFour.speed = 2;
mThree.speed = 3;
mFour.fast = false;
mThree.fast = true;
mThree.addAngle();
}
mThree.upDateAngle();
mFour.upDateAngle();
}
invalidate();
}
private float getBigBallCenterX(int angle) {
return (float) (radiusBig * Math.sin(angle * Math.PI / 180) + mCenterX);
}
private float getBigBallCenterY(int angle) {
return (float) (radiusBig * Math.cos(angle * Math.PI / 180) + mCenterY);
}
private float getSmallBallCenterX(int angle) {
return (float) (radiusSmall * Math.sin(angle * Math.PI / 180) + mCenterX);
}
private float getSmallBallCenterY(int angle) {
return (float) (radiusSmall * Math.cos(angle * Math.PI / 180) + mCenterY);
}
public float dp2px(float dp) {
return dp * getResources().getDisplayMetrics().density + 0.5f;
}
}
实现两个相互追逐的小球
最新推荐文章于 2020-10-25 21:08:40 发布