【问题标题】:Android: Refresh bitmap with new dataAndroid:用新数据刷新位图
【发布时间】:2011-05-13 04:22:14
【问题描述】:

我正在尝试创建一个随机像素颜色的 15fps“位图视频”。以下代码正确显示一个位图,但不会使用新的随机位图更新/刷新图像。谁能帮我弄清楚为什么?

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;
}

}

【问题讨论】:

  • 我是否遗漏了什么,或者您是否在创建 init 方法后仅创建了一次随机位图 Panel

标签: android


【解决方案1】:

在我看来,您正在调用您的线程 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) 此外,在 android 1.5 之后,surfaceview 不能每秒刷新 40-45 次,因此请尝试将 fps 降低到 30,看看是否有什么不同。

示例:http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/surfaceview-portage-1-5-other-version-of-android-t15675.html

【讨论】:

  • 据我了解,如果不创建线程的另一个实例,就无法重新启动线程。我希望线程运行并不断将更新的位图推送到画布。我只是不确定如何做到这一点。
  • 把你的线程放在 while() 循环中的 sleep(xxx) 上,看看是否有什么不同。
  • 我找到了问题,非常感谢。我的线程在循环,我只是没有更新图像数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多