Android:使用新数据刷新位图
我试图创建随机像素颜色的15fps“位图视频”。以下代码正确显示一个位图,但不会使用新的随机图像更新/刷新图像。任何人都可以请帮我弄清楚为什么?Android:使用新数据刷新位图
public class ViewThread extends Thread {
private SurfaceHolder mHolder;
private Panel mPanel;
private boolean mRun = false;
public ViewThread(Panel panel) {
mPanel = panel;
mHolder = mPanel.getHolder();
}
public void setRunning(boolean run) {
mRun = run;
}
@Override
public void run() {
Canvas canvas = null;
while (mRun) {
canvas = mHolder.lockCanvas();
if (canvas != null) {
mPanel.doDraw(canvas);
mHolder.unlockCanvasAndPost(canvas);
}
}
}
}
public class Panel extends SurfaceView implements SurfaceHolder.Callback {
private ViewThread mThread;
private Bitmap mBitmap;
private int[] mcolors;
public Panel(Context context) {
super(context);
init();
}
private void init() {
getHolder().addCallback(this);
mThread = new ViewThread(this);
// create a graphic
mcolors = colorMap();
int[] colors = mcolors;
mBitmap = Bitmap.createBitmap(colors, 64, 64, Bitmap.Config.ARGB_8888);
mBitmap = Bitmap.createScaledBitmap(mBitmap, 256, 256, false);
}
protected void doDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(mBitmap, 8, 8, null);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//@Override
public void surfaceCreated(SurfaceHolder holder) {
if (!mThread.isAlive()) {
mThread = new ViewThread(this);
mThread.setRunning(true);
mThread.start();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
if (mThread.isAlive()) {
mThread.setRunning(false);
}
}
}
private static int[] colorMap() {
int[] ltable = { 0xff000000, 0xff00000f, 0xff00001e, 0xff00002d, 0xff00003c, 0xff00004b,
0xff00005a, 0xff000069, 0xff000078, 0xff000087, 0xff000096, 0xff0000a5,
0xff0000b4, 0xff0000c3, 0xff0000d2, 0xff0000e1, 0xff0000f0, 0xff0000ff,
0xff0f00ff, 0xff1e00ff, 0xff2d00ff, 0xff3c00ff, 0xff4b00ff, 0xff5a00ff,
0xff6900ff, 0xff7800ff, 0xff8700ff, 0xff9600ff, 0xffa500ff, 0xffb400ff,
0xffc300ff, 0xffd200ff, 0xffe100ff, 0xfff000ff, 0xffff00ff, 0xffff00f0,
0xffff00e1, 0xffff00d2, 0xffff00c3, 0xffff00b4, 0xffff00a5, 0xffff0096,
0xffff0087, 0xffff0078, 0xffff0069, 0xffff005a, 0xffff004b, 0xffff003c,
0xffff002d, 0xffff001e, 0xffff000f, 0xffff0000 };
int[] mcolors = new int[4096];
Random rand = new Random();
for(int i=0; i < 4096; i++)
{
int num = rand.nextInt(52);
mcolors[i] = ltable[num];
}
return mcolors;
}
}
在我看来,你在呼唤你的线程only once when surfaceCreated()
被调用。之后,你的线程再也不会被调用。我相信你需要类似timer and reinitiate thread or call thread run() method to display another image
。
[编辑]
一些其他的东西
1)重新画布持有人在每个while循环。
while (run) {
c = null;
try {
c = panel.getHolder().lockCanvas();
2)此外,机器人1.5后surfaceview不能每秒刷新更40-45时间,以便尝试减少FPS至30,看看它是否有什么差别。
这是我的理解,你不能重新启动一个线程,而不创建它的另一个实例。我想让线程运行并不断将更新的位图推送到画布。我只是不确定如何完成。 – user750956 2011-05-12 20:09:30
把你的线程放在while()循环中的sleep(xxx)里面,看看是否有任何区别。 – Priyank 2011-05-12 20:15:23
我编辑我的答案根据新的调查结果。 – Priyank 2011-05-12 20:22:33
我错过了什么,还是你在你的'init'方法创建一个随机的位图只有一次一次'创建Panel'? – harism 2011-05-12 19:52:41