2011-05-12 6 views
1

무작위 픽셀 색상의 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; 
} 

은}

+0

내가 뭔가를 그리워하거나'Panel'가 생성되면 당신은 당신의'init' 방법에 한 번만 임의의 비트 맵을 작성 했습니까? – harism

답변

0

당신이 호출 스레드 only once when surfaceCreated()를 호출 나에게 나타납니다. 그 후에 스레드는 다시 호출되지 않습니다. timer and reinitiate thread or call thread run() method to display another image과 같은 것이 필요하다고 생각합니다.

[편집]

몇몇 다른 것들

1) 모든 동안 루프 캔버스 홀더를 다시 만듭니다.

while (run) { 
     c = null; 
     try { 
      c = panel.getHolder().lockCanvas(); 

2) 또한, 안드로이드 1.5 후에 서피스 뷰 SurfaceView 정도로 30 FPS 감소를 시도하고 어떤 차이가 있는지 초당 40-45 시간 더 리프레시 할 수 없다.

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

+0

다른 인스턴스를 만들지 않고 스레드를 다시 시작할 수 없다는 것을 이해합니다. 스레드를 실행하고 업데이트 된 비트 맵을 캔버스로 계속 푸시합니다. 나는 그것을 성취하는 방법을 모르겠습니다. – user750956

+0

while() 루프 내에서 스레드를 잠자기 (xxx)에 놓고 어떤 차이가 있는지 확인하십시오. – Priyank

+0

나는 새로운 발견에 근거 해 나의 대답을 편집했다. – Priyank