【问题标题】:SurfaceView only update UI onceSurfaceView 只更新一次 UI
【发布时间】:2019-07-25 16:35:48
【问题描述】:

我正在尝试学习如何使用 SurfaceView,因为我需要在未来的项目中使用它。我读到如果我需要快速更新 UI,最好在线程的帮助下使用 SurfaceView。

我的代码的目的是能够在位图上打印'B'的图案,这是代码:

public void testTransition(Canvas canvas) {
    if (canvas != null) {
        canvas.drawColor(Color.BLACK);
        Log.i("Thread", "Running...");
        for (int y = 0; y < 8; y++) {
            if (test[y] == 1) {

                canvas.drawBitmap(ledBitMap, (x - diameterLeds) / 2, diameterLeds * y, paint);

            }

        }


        canvas.drawColor(Color.BLACK);
        delay(1000);

        for (int y=0; y<8; y++){
            if(test[y + 8] == 1)
                canvas.drawBitmap(ledBitMap, (x - diameterLeds) / 2,diameterLeds * y, paint);

        }
        canvas.drawColor(Color.BLACK);
        //ledThread.delay(1000);


        for (int y=0; y<8; y++){
            if(test[y + 16] == 1)
                canvas.drawBitmap(ledBitMap, (x- diameterLeds) / 2,diameterLeds * y, paint);

        }
        canvas.drawColor(Color.BLACK);
        //ledThread.delay(1000);

        for (int y=0; y<8; y++){
            if(test[y + 24] == 1)
                canvas.drawBitmap(ledBitMap, (x - diameterLeds) / 2,diameterLeds * y, paint);

        }
        canvas.drawColor(Color.BLACK);
        //ledThread.delay(1000);

        for (int y=0; y<8; y++){
            if(test[y + 32] == 1)
                canvas.drawBitmap(ledBitMap, (x - diameterLeds) / 2,diameterLeds * y, paint);

        }

        //canvas.drawColor(Color.BLACK);



        //ledThread.delay(600);

        //delay(1);
    }
}


@Override
public void run() {
    long ticksPS = 1000 / 30;
    long startTime;
    long sleepTime;

    while(isRunning){

        Canvas canvas = null;
        startTime = System.currentTimeMillis();

        try {
            canvas = ledView.getHolder().lockCanvas();
            synchronized (ledView.getHolder()){
                testTransition(canvas);
            }
        }finally {
           if(canvas != null){
               ledView.getHolder().unlockCanvasAndPost(canvas);
           }
        }
    }
}

变量test[]是一个由40个元素(0或1)组成的矩阵

private static int test[] = {1,1,1,1,1,1,1,1, 1,0,0,1,0,0,0,1, 1,0,0,1,0,0,0,1, 1,0,0,1,0,0,0,1, 0,1,1,0,1,1,1,0};

我的目标是阅读这种安排并模拟字母 B 模式的“开或关”。但是当我执行代码时,活动会在空白屏幕上停留几秒钟,然后圆圈出现在位图上,但不交替序列,尽管线程似乎正在运行。仅绘制测试数组的最后 8 个元素

【问题讨论】:

  • 看起来您在同一x 处绘制所有位图。并且不清楚为什么您会期望“序列交替”; testTransition() 每次调用时执行完全相同的功能:它没有以任何方式参数化,并且您没有推进任何成员变量的状态。
  • @greeble31 是的,x 是一样的,当另外 8 个元素到来时,我想重新绘制接下来的 8 个元素。 X也是一样,因为我要做POV效果。
  • 您的 while 循环是否多次运行? test[] 中的对象是否正在更新?你有没有调试并看到什么没有发生
  • 通常你的while有两个步骤,1)处理输入和改变背景数据test[] 2)绘制屏幕;重复
  • 另外:您的 testTransition 正在阻止绘制,只有在方法完成后您才会看到结果(并且 delay(1000);) 将阻止它的时间,并且您在同一方法中绘制所有状态,会显示最后一个,早点提出两个建议都可以解决问题

标签: android multithreading surfaceview


【解决方案1】:

使用SurfaceViewlockCanvas(),在您调用unlockCanvasAndPost() 之前 后屏幕才能更新。 (我认为您希望屏幕在 testTransition() 中途更新。)

解决方案是实现一个状态机,它根据计时器(例如)弄脏 SurfaceView,并在每次迭代时将 LED 显示推进一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 2020-10-30
    相关资源
    最近更新 更多