我有这段代码可以正常工作:在此自定义视图上,3 Ball对象不断弹跳:
public class AnimatedView extends android.support.v7.widget.AppCompatImageView {
private Context mContext;
private boolean running = true;
private Handler h;
private final int FRAME_RATE = 10;
ArrayList<Ball> balls = new ArrayList<>();
public AnimatedView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
h = new Handler();
balls.add(new Ball(mContext, AnimatedView.this.getWidth(), AnimatedView.this.getHeight(), false));
balls.add(new Ball(mContext, AnimatedView.this.getWidth(), AnimatedView.this.getHeight(), false));
balls.add(new Ball(mContext, AnimatedView.this.getWidth(), AnimatedView.this.getHeight(), false));
}
private Runnable r = new Runnable() {
@Override
public void run() {
if (running) {
invalidate();
}
}
};
protected void onDraw(Canvas c) {
if (running) {
for (Ball ball : balls) {
if (ball.getX() < 0 && ball.getY() < 0) {
ball.setX(this.getWidth() / 2);
ball.setY(this.getHeight() / 2);
} else {
ball.setX(ball.getX() + ball.getxVelocity());
ball.setY(ball.getY() + ball.getyVelocity());
if ((ball.getX() > this.getWidth() - ball.getBall().getWidth()) || (ball.getX() < 0)) {
ball.setxVelocity(ball.getxVelocity() * -1);
}
if ((ball.getY() > this.getHeight() - ball.getBall().getHeight()) || (ball.getY() < 0)) {
ball.setyVelocity(ball.getyVelocity() * -1);
}
}
c.drawBitmap(ball.getBall(), ball.getX(), ball.getY(), null);
}
h.postDelayed(r, FRAME_RATE);
}
}
}
我唯一的问题是,它需要大量的内存和硬件资源。 在我的全新手机上,它运行非常流畅(使用130-140MB的内存和3个弹跳球),但是在我的旧手机上却很糟糕,因为该手机只能使用20-30MB。
什么,以及如何重构代码以提高效率(我很确定,这就是问题所在)。
在我看来,这些计算对于每个新帧中的每个球都是必需的。 即使我将FRAME_RATE设置为33(即大约30FPS),我的旧手机也没有明显的区别。
谢谢! :)