我知道这是错误的做法,但任何人都缺乏帮助导致我这样做。我画了7个圆圈,每个圆圈在同一个游戏中有不同的半径,每个在绘制后暂停300毫秒,所以理论上它应该看起来像圆圈在绘制时正在扩展,但由于某种原因它不能有人告诉我为什么或也许回答这个问题导致我几周的努力。该应用程序在屏幕上随机显示绿色或红色圆圈。当它显示一个圆圈时,它确实应该显示7个圆圈,而不是只显示半径为300的最后一个圆圈。
public class SplashLaunch extends View{
Handler cool = new Handler();
DrawingView v;
Paint newPaint = new Paint();
int randomWidthOne = 0;
int randomHeightOne = 0;
private float radiusNsix = 10;
private float radiusNfive = 25;
private float radiusNfour = 50;
private float radiusNthree = 100;
private float radiusNtwo = 150;
private float radiusNone = 200;
private float radiusZero = 250;
private float radiusOne = 300;
final int redColorOne = Color.RED;
final int greenColorOne = Color.GREEN;
private static int lastColorOne;
ObjectAnimator radiusAnimator;
private final Random theRandom = new Random();
public SplashLaunch(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
private final Runnable circleUpdater = new Runnable() {
@Override
public void run() {
lastColorOne = theRandom.nextInt(2) == 1 ? redColorOne : greenColorOne;
newPaint.setColor(lastColorOne);
cool.postDelayed(this, 1000);
invalidate();
}
};
@Override
protected void onAttachedToWindow(){
super.onAttachedToWindow();
cool.post(circleUpdater);
}
protected void onDetachedFromWindow(){
super.onDetachedFromWindow();
cool.removeCallbacks(circleUpdater);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
if(theRandom == null){
randomWidthOne =(int) (theRandom.nextInt((int) Math.abs(getWidth()-radiusOne/2)) + radiusOne/2f);
randomHeightOne = (theRandom.nextInt((int)Math.abs((getHeight()-radiusOne/2 + radiusOne/2f))));
}else {
randomWidthOne =(int) (theRandom.nextInt((int) Math.abs(getWidth()-radiusOne/2)) + radiusOne/2f);
randomHeightOne = (theRandom.nextInt((int)Math.abs((getHeight()-radiusOne/2 + radiusOne/2f))));
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusNsix, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusNfive, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusNfour, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusNthree, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusNtwo, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusNone, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusZero, newPaint);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canvas.drawCircle(randomWidthOne, randomHeightOne, radiusOne, newPaint);
}
public void setRadiusOne(float value){
this.radiusOne = value;
invalidate();
}
public int startAnimation(int animationDuration) {
if (radiusAnimator == null || !radiusAnimator.isRunning()) {
// Define what value the radius is supposed to have at specific time values
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf2 = Keyframe.ofFloat(0.5f, 180f);
Keyframe kf1 = Keyframe.ofFloat(1f, 360f);
// If you pass in the radius, it will be calling setRadius method, so make sure you have it!!!!!
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("radiusOne", kf0, kf1, kf2);
radiusAnimator = ObjectAnimator.ofPropertyValuesHolder(this, pvhRotation);
radiusAnimator.setInterpolator(new LinearInterpolator());
radiusAnimator.setDuration(animationDuration);
radiusAnimator.start();
}
else {
Log.d("Circle", "I am already running!");
}
return animationDuration;
}
public void stopAnimation() {
if (radiusAnimator != null) {
radiusAnimator.cancel();
radiusAnimator = null;
}
}
public boolean getAnimationRunning() {
return radiusAnimator != null && radiusAnimator.isRunning();
}
}
答案 0 :(得分:1)
首先,你在做什么 - 绘制东西的错误方法。您不应该在onDraw方法中阻止UI线程。 第二个 - 圆圈显示在随机位置,因为你使用随机数生成器,canvas.drawCircle的前两个参数不是宽度和高度(如果我理解你的代码是正确的)。
现在所有UI线程都在每个Thread.sleep上阻塞。如果你真的想要动画所有这些圆圈,你应该根据时间计算每次调用onDraw方法的大小。给你一个想法:
public SplashLaunch(Context context) {
super(context);
startTime = System.currentTimeMills();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(x, y, calculateRadius(System.currentTimeMills() - startTime), paint);
}
还有一件事,你的代码只显示最后一个圆圈,因为你最后绘制它,你想要显示7个圆圈你需要以相反的顺序绘制它。