2011-01-07 29 views
2

main.xmlレイアウトで作成されたSurfaceViewで描画しようとすると、単純なコーディングが行われます。背景色を変えてアイコンを表示することはできますが、描画しようとするとエラーが発生します。私は初心者ですので、私は何かが欠けている、明らかに助けのヒントを貸してください!ここSurfaceViewに描画するときのアプリケーションエラー

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/root" android:orientation="vertical" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"> 

     <SurfaceView android:id="@+id/Paper" 
      android:layout_height="fill_parent" 
      android:layout_width="fill_parent"> 
     </SurfaceView> 

</LinearLayout> 

とコード。

package com.example.SurfaceViewTest; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class SurfaceViewTest extends Activity implements SurfaceHolder.Callback { 

    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 
    private Paint paint; 
    Bitmap mDrawing; 

    boolean mRun; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     mSurfaceView = (SurfaceView) this.findViewById(R.id.Paper); 

     mSurfaceHolder = mSurfaceView.getHolder(); 

     mSurfaceHolder.addCallback(this); 

     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); 
    } 

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

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     mSurfaceView.setBackgroundColor(Color.rgb(0, 255, 0)); 
     mRun=true; 
     thread.start(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    Thread thread = new Thread(){ 

     public void doDraw(Canvas c){ 
      mDrawing = Bitmap.createBitmap(200, 300, Bitmap.Config.RGB_565); 

      c.setBitmap(mDrawing); 

      paint = new Paint(); 
      paint.setColor(Color.rgb(255, 255,255)); 

      c.drawLine(1,1,200,300, paint); 
     } 

     public void run() { 
      while (mRun) { 
       Canvas c = null; 
       try { 
        c = mSurfaceHolder.lockCanvas(null); 
        synchronized (mSurfaceHolder) { 
         doDraw(c); 
        } 
       } finally { 
        // do this in a finally so that if an exception is thrown 
        // during the above, we don't leave the Surface in an 
        // inconsistent state 
        if (c != null) { 
         mSurfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 
    }; 
} 

UPDATE:

[OK]を私は作品のおかげでそれを得ました!

package com.example.SurfaceViewTest; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class SurfaceViewTest extends Activity implements SurfaceHolder.Callback { 

    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 
    Bitmap mDrawing; 
    Canvas tempCanvas = new Canvas(); 
    Paint paint; 

    boolean mRun; 

    int intCanvasWidth, intCanvasHeight; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     mSurfaceView = (SurfaceView) this.findViewById(R.id.Paper); 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     intCanvasWidth = width; 
     intCanvasHeight = height; 
     mDrawing = Bitmap.createBitmap(intCanvasWidth, intCanvasHeight, 
       Bitmap.Config.RGB_565); 
     paint = new Paint(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     if (thread.getState() == Thread.State.TERMINATED) { 
      thread = new Thread(); 
     } 
     mRun = true; 
     thread.start(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 
     mRun = false; 
     while (retry) { 
      try { 
       thread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // we will try it again and again... 
      } 
     } 
    } 

    Thread thread = new Thread() { 
     public void doDraw(Canvas c) { 
      tempCanvas.setBitmap(mDrawing); 

      paint.setColor(Color.rgb(255, 255,255)); 

      tempCanvas.drawLine(1,1,200,300, paint); 

      c.drawBitmap(mDrawing, 0, 0, null); 
     } 

     @Override 
     public void run() { 
      Canvas c; 
      while (mRun) { 
       c = null; 
       try { 
        c = mSurfaceHolder.lockCanvas(null); 
        synchronized (mSurfaceHolder) { 
         doDraw(c); 
        } 
       } finally { 
        // do this in a finally so that if an exception is thrown 
        // during the above, we don't leave the Surface in an 
        // inconsistent state 
        if (c != null) { 
         mSurfaceHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 
    }; 
} 

答えて

1

ここで私のSurfaceViewの仕組みを説明します。あなたの問題は、surfaceCreated()であなたのビットマップをやっていると思う。

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    thread.start(); 
} 

Thread thread = new Thread(){ 
... 
public void doDraw(Canvas c){ 
//draw onto the canvas here 
} 

public void run() { 
    while (mRun) { 
     Canvas c = null; 
     try { 
     c = mSurfaceHolder.lockCanvas(null); 
     synchronized (mSurfaceHolder) { 
      doDraw(c); 
     } 
     } finally { 
     // do this in a finally so that if an exception is thrown 
     // during the above, we don't leave the Surface in an 
     // inconsistent state 
     if (c != null) { 
      mSurfaceHolder.unlockCanvasAndPost(c); 
     } 
     } 
    } 
    } 
}; 
+0

返信ありがとうございますが、新しいスレッドにブラケットがないようです。私はAndroidとJavaの両方で初心者の方を指摘してください。 – DKDiveDude

+0

Eclipseを使用していますか?もしあなたが本当にそうでなければならない。ブラケットがどこにないかを大まかに指摘します(それは最後です)。 – fredley

+0

私は感謝しています。フィールド宣言または "}"を完成させる。どちらもエラーを削除しません。 – DKDiveDude

関連する問題