2012-04-10 9 views
0

私はSurfaceViewの例を試しています。私はSurfaceViewから私のクラスを継承し、次のように使用していますSurfaceView描画の失敗

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

    Context context; 
    MySurfaceViewThread mThread; 
    SurfaceHolder holder; 
    Paint paint; 

    int x = 20, y = 20, r = 10; 

    public void init() { 
     holder = getHolder(); 
     holder.addCallback(this); 
     mThread = new MySurfaceViewThread(getHolder(), this); 

     paint = new Paint(); 
     paint.setStyle(Style.STROKE); 
     paint.setStrokeCap(Cap.ROUND); 
     paint.setStrokeWidth(1); 
     paint.setColor(Color.rgb(255, 255, 255)); 
    } 

    public MySurfaceView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
     this.context = context; 
     init(); 

    } 

    public MySurfaceView(Context context, AttributeSet attr) { 
     super(context,attr); 
     this.context = context; 
     init(); 
    } 

    public MySurfaceView(Context context, AttributeSet attr, int defStyle) { 
     super(context, attr, defStyle); 
     this.context = context; 
     init(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     // TODO Auto-generated method stub 


    } 



    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     mThread.isRunning = false; 
     while (true) { 
      try { 
       mThread.join(); 
       break; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    @Override 
    public void onDraw(Canvas canvas) { 
//  super.onDraw(canvas); 
//  canvas.drawColor(0, Mode.CLEAR); 
     x += 2; 
     y += 2; 
     r += 3; 
     canvas.drawColor(Color.rgb(x%255, y%255, (x+y)%255)); 
     canvas.drawCircle(x, y, r, paint); 
     canvas.drawText("x:"+x, 100, 100, paint); 
     Log.d("onDraw","onDraw()"+"x:"+x + ",y:"+y+",r:"+r); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     Log.d("surfaceCreated", "surfaceCreated()"); 
     mThread.isRunning = true; 
     mThread.start(); 
    } 

} 

私はあるThreadから私のCanvasを更新しています:

public class MySurfaceViewThread extends Thread { 

    SurfaceHolder holder; 
    MySurfaceView surfaceView; 
    boolean isRunning = false; 

    public MySurfaceViewThread(SurfaceHolder holder, MySurfaceView surfaceView) { 
     Log.d("thread","thread constructor"); 
     this.holder = holder; 
     this.surfaceView = surfaceView; 
    } 

    @Override 
    public void run() { 
     Log.d("run","run()"); 
     while(isRunning) { 

      Canvas canvas = null; 
      try { 
       canvas = holder.lockCanvas(); 

       synchronized(holder) { 
        surfaceView.onDraw(canvas); 
       } 
       sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      finally { 
       holder.unlockCanvasAndPost(canvas); 
       Log.d("canvas status", "canvas unlocaked..."); 
      } 
     } 
    } 

} 

アプリケーションが起動し、そのonDraw()が呼び出されると、それは、円を描くと、テキストだけでなく、onDraw()への更なる呼び出しでは何も描画されません。最初の更新後に画面上で何も変わらなかったことを意味します。私がどこに間違っているのか?私はアンドロイドとスロー学習者にも新しいです。

答えて

0

私は答えを得た。その非常に奇妙な。なぜこれが働いたのか分かりません。 私の活動から次の行にコメントしています。

surfaceView.setBackgroundColor(Color.rgb(0, 255, 0)); 

アクティビティコードは次のとおりです。

public class SurfaceViewTutorialActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MySurfaceView surfaceView = new MySurfaceView(this); 
//  surfaceView.setBackgroundColor(Color.rgb(0, 255, 0)); 
     surfaceView.setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 
     setContentView(surfaceView); 
    } 
} 

いずれかがこのことについて知っている場合は、親切に正しい方向に私を導きます。

関連する問題