【发布时间】: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