gpt4 book ai didi

android - SurfaceView.lockCanvas() 没有正确清除位图缓冲区

转载 作者:行者123 更新时间:2023-11-29 14:53:27 28 4
gpt4 key购买 nike

我创建了一个扩展 SurfaceView 的类,以便循环一系列 ARGB 位图。这主要是有效的,除了(通常但不总是)为每个新帧保留底层位图的状态。

换句话说,如果我显示的第一帧是不透明的,而随后的帧是透明的,那么在绘制新帧时,不会清除原始帧中的不透明像素。

这种行为让我感到困惑,因为 SurfaceHolder.lockCanvas() 的文档明确指出:

“在 unlockCanvas() 和 lockCanvas() 之间永远不会保留 Surface 的内容,因此,必须写入 Surface 区域内的每个像素。”

如果我只是纯色背景,那么调用canvas.drawARGB(255,0,0,0)成功清除为黑色...但是我想要透明背景,我无法清除它为透明色,因为 canvas.drawARGB(0,0,0,0) 没有效果。

import java.util.ArrayList;
import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/*
* Accepts a sequence of Bitmap buffers and cycles through them.
*/

class AnimatedBufferView extends SurfaceView implements Runnable
{
Thread thread = null;
SurfaceHolder surfaceHolder;
volatile boolean running = false;

ArrayList<Bitmap> frames;
int curIndex = 0;

public AnimatedBufferView(ArrayList<Bitmap> _frames, Context context)
{
super(context);
surfaceHolder = getHolder();
frames = _frames;
}

public void onResume(){
running = true;
thread = new Thread(this);
thread.start();
}

public void onPause(){
boolean retry = true;
running = false;
while(retry){
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

@Override
public void run()
{
// TODO Auto-generated method stub
while(running)
{
if(surfaceHolder.getSurface().isValid())
{
Canvas canvas = surfaceHolder.lockCanvas();

//clear the buffer?
//canvas.drawARGB(255, 0, 0, 0);

//display the saved frame-buffer..
Matrix identity = new Matrix();
Bitmap frame = frames.get(curIndex);
canvas.drawBitmap(frame, identity, null);


surfaceHolder.unlockCanvasAndPost(canvas);

curIndex = (curIndex + 1) % frames.size();

try {
thread.sleep( 100 );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

最佳答案

好的,发现问题是默认的 Porter-Duff 绘图模式无法绘制透明颜色。只需要改变模式。即,

Canvas canvas surfaceView.lockCanvas();
canvas.drawColor(0, Mode.CLEAR);

关于android - SurfaceView.lockCanvas() 没有正确清除位图缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910675/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com