自定义视图上的弹跳球-Android

时间:2018-08-05 11:16:47

标签: android performance canvas android-canvas ondraw

我有这段代码可以正常工作:在此自定义视图上,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),我的旧手机也没有明显的区别。

谢谢! :)

0 个答案:

没有答案