2012-06-24 88 views
0

我有一個XML佈局,並希望添加我自己的自定義SurfaceView並在其畫布上繪製。當我調試時,畫布運行它的onDraw並獲取unlockandpost函數,但它總是隻是一個黑屏。這是我的代碼。我一直試圖弄清楚幾個小時,並嘗試了多種選擇,例如將我的自定義SurfaceView添加到XML中,而不是動態添加它,但我得到了相同的結果。RelativeLayout中的SurfaceView不會繪製

任何幫助,將不勝感激,

謝謝。

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@color/white" 
> 
<ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/guitar_neck"> 
</ImageView> 
<RelativeLayout 
     android:id="@+id/letter_bar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
/> 

public class BeginGame extends Activity implements OnClickListener { 
public RelativeLayout game_screen; 
public LetterBar theBar; 
public SurfaceHolder holder; 
public static int width, height; 

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

    try { 
     theBar = new LetterBar(this); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    Display display = getWindowManager().getDefaultDisplay(); 
    width = display.getWidth(); // deprecated 
    height = display.getHeight(); // deprecated 

    setContentView(R.layout.game_menu); 
    game_screen = (RelativeLayout)findViewById(R.id.letter_bar); 
    game_screen.addView(theBar); 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

} 

}

public class LetterBar extends SurfaceView implements SurfaceHolder.Callback { 
private int width, height, toneWidth, toneHeight; 
private Paint backgroundPaint, paint; 

private Resources res; 
private Drawable myImage; 
private Bitmap neck, b; 

private LetterThread _thread; 

public LetterBar(Context context) throws IOException { 
    super(context); 
    // TODO Auto-generated constructor stub 

    getHolder().addCallback(this); 
    _thread = new LetterThread(getHolder(), this); 

    paint = new Paint(); 
    paint.setColor(0xFFFFFF); 
    backgroundPaint = new Paint(); 
    backgroundPaint.setARGB(0, 255, 255, 255); 

    res = context.getResources(); 

    neck = BitmapFactory.decodeFile("/assets/guitar_neck.gif"); 

    InputStream bitmap=null; 
    b = BitmapFactory.decodeResource(context.getResources(), R.drawable.guitar_neck); 
    toneWidth = b.getWidth(); 
    toneHeight = b.getHeight(); 
} 

@Override 
public void onDraw(Canvas canvas){ 
    canvas.drawText("TEST", 20, 20, paint); 
    canvas.drawBitmap(b, 0, 0, paint); 
} 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder arg0) { 
    // TODO Auto-generated method stub 
    setWillNotDraw(false); 
    _thread.setRunning(true); 
    _thread.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // simply copied from sample application LunarLander: 
    // we have to tell thread to shut down & wait for it to finish, or else 
    // it might touch the Surface after we return and explode 
    boolean retry = true; 
    _thread.setRunning(false); 
    while (retry) { 
     try { 
      _thread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 
      // we will try it again and again... 
     } 
    } 
} 
} 


public class LetterThread extends Thread { 
private SurfaceHolder _surfaceHolder; 
private LetterBar letter_bar; 
private boolean _run = false; 

public LetterThread(SurfaceHolder surfaceHolder, LetterBar bar) { 
    _surfaceHolder = surfaceHolder; 
    letter_bar = bar; 
} 

public void setRunning(boolean run) { 
    _run = run; 
} 

@Override 
public void run() { 
    Canvas c; 
    while (_run) { 
     c = null; 
     try { 
      c = _surfaceHolder.lockCanvas(null); 
      synchronized (_surfaceHolder) { 
       letter_bar.onDraw(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) { 
       _surfaceHolder.unlockCanvasAndPost(c); 
      } 
     } 
    } 
} 
} 

回答

0

目前您paintbackgroundPaint都有阿爾法0

試試這個:

paint = new Paint(); 
paint.setColor(0xFFFFFFFF); // Added alpha bits out front to make it visible white 
backgroundPaint = new Paint(); 
backgroundPaint.setARGB(255, 255, 255, 255); // 255 alpha bit, so it's visible black 
+0

/捂臉感謝....愚蠢的錯誤...... – lespommes