0

我是 android 编程新手,遇到了一个小问题。如果您能提供帮助,将不胜感激。

我正在为正在制作的动态壁纸制作矩形:

void drawFrame() {
        final SurfaceHolder holder = getSurfaceHolder();

        Canvas c = null;
        try {
            c = holder.lockCanvas();
            if (c != null) {
                Paint paint = new Paint();
                paint.setColor(Color.CYAN);
                Paint ypaint = new Paint();
                ypaint.setColor(Color.RED);
                Paint ppaint = new Paint();
                ppaint.setColor(Color.GREEN);

                drawVerStripes(c, ppaint, 0,20);
                drawVerStripes(c, paint, 50,20);
                drawVerStripes(c, ypaint,0,10);
            }

        } finally {
            if (c != null)
                holder.unlockCanvasAndPost(c);
        }

功能:

params:
width: 矩形
空间的宽度: last rect 和 this rect 之间的差异

    int y=0;
    int oldY=0;
    private void drawVerStripes(Canvas c, Paint paint, int space, int width) {


        y=oldY+space;

        c.drawRect(y, 0, y+width,c.getHeight(), paint);

        oldY=y;
    }

结果是矩形非常快地移动到屏幕的一侧。我希望他们留在屏幕上而不是移动
换句话说,有没有一种方法让drawVerStripes 只执行一次而不是每一帧。

4

2 回答 2

0

每一帧都会调用您的 drawFrame 方法。如果您的设备刷新率为 70,那么您的方法每秒调用 70 次。如果将 x 或 y 坐标增加 1,则在 x 或 y 坐标中移动 70 个像素。您应该进行与刷新率无关的移动。

1) 计算增量时间,即自上次屏幕更新以来经过的时间。2)确定您希望矩形每秒移动多少像素。

假设您希望矩形在 x 中移动 50 个像素。

然后执行以下操作。x += 增量时间 * 50。

long startTime = System.nanoTime(); // Execute before the first time your drawFrame executes
float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f; // In drawFrame method calculate
long startTime = System.nanoTime(); // Execute after calculating delta time. 
于 2013-06-11T15:21:32.883 回答
0

我相信你需要在drawFrame开始时再次将y和oldY设置为0。

于 2013-06-11T16:19:14.307 回答