【发布时间】:2018-12-12 06:32:54
【问题描述】:
我正在做一个学校项目。在这个项目中,我必须做一个程序,让一个或多个球在屏幕上弹跳。我在谷歌上做了一些研究来帮助我,我找到了这段代码:
public class BouncingBallInside extends View {
private List<Ball> balls = new ArrayList<>();
public BouncingBallInside(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BouncingBallInside(Context context) {
super(context);
init();
}
private void init(){
//Add a new ball to the view
balls.add(new Ball(50,50,100, Color.RED));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Draw the balls
for(Ball ball : balls){
//Move first
ball.move(canvas);
//Draw them
canvas.drawOval(ball.oval,ball.paint);
}
invalidate(); // See note
}
}
球类:
public class Ball{
public int x,y,size;
public int velX = 10;
public int velY=7;
public Paint paint;
public RectF oval;
public Ball(int x, int y, int size, int color){
this.x = x;
this.y = y;
this.size = size;
this.paint = new Paint();
this.paint.setColor(color);
}
public void move(Canvas canvas) {
this.x += velX;
this.y += velY;
this.oval = new RectF(x-size/2,y-size/2,x+size/2,y+size/2);
//Do we need to bounce next time?
Rect bounds = new Rect();
this.oval.roundOut(bounds); ///store our int bounds
//This is what you're looking for ▼
if(!canvas.getClipBounds().contains(bounds)){
if(this.x-size<0 || this.x+size > canvas.getWidth()){
velX=-velX;
}
if(this.y-size<0 || this.y+size > canvas.getHeight()){
velY=-velY;
}
}
}
}
该程序完美运行。 我尽可能地深入研究它。但是在它之后和看了文档之后,我无法理解两件事:
- 第一次调用 onDraw(Canvas canvas) 方法的位置和时间。
- 为什么 onDraw 的末尾有 invalidate()?
我的意思是文档说:
使整个视图无效。如果视图可见,onDraw(android.graphics.Canvas) 将在未来某个时间点被调用。
so...如果这个方法是用来调用onDraw的,为什么不直接调用呢?有什么区别?
【问题讨论】:
标签: android