2011-05-12 128 views
5

有沒有辦法設置SurfaceView的背景圖像?是否有在XML來完成,或者我可以做到這一切在Java中 - 我已經得到的東西,看起來像這樣在我的構造函數:設置SurfaceView的背景圖像

Drawable sky = (getResources().getDrawable(R.drawable.sky)); 
    this.setBackgroundDrawable(sky); 

但它仍然沒有顯示任何東西。

回答

3

您不能在SurfaceView上設置可繪製背景。你必須自己將背景繪製到表面上。

+0

好的,那麼在onDraw()方法中,我會假設? – 2011-05-12 16:28:19

+0

不,onDraw()不會做你想要的。在使用SurfaceView時,您可以使用OpenGL上下文渲染它,也可以通過SurfaceHolder抓取曲面的Canvas。你必須使用Canvas渲染你的背景(如果你正在做OpenGL,則使用OpenGL) – 2011-05-12 16:30:21

+1

我只使用Canvas - 我只是想弄清楚如何使用Canvas做到這一點。 – 2011-05-12 16:31:47

4

試試這個

public void surfaceCreated(SurfaceHolder arg0) { 
    Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.background); 
    float scale = (float)background.getHeight()/(float)getHeight(); 
    int newWidth = Math.round(background.getWidth()/scale); 
    int newHeight = Math.round(background.getHeight()/scale); 
    Bitmap scaled = Bitmap.createScaledBitmap(background, newWidth, newHeight, true); 
} 

public void onDraw(Canvas canvas) { 
    canvas.drawBitmap(scaled, 0, 0, null); // draw the background 
} 
+1

如何我可以給佈局大小的位圖在畫布上繪製,並將其放置在surfaceview的中心。 – 2015-04-30 04:36:12

6

雖然你不能直接在背景圖片設置爲SurfaceView,您可以在此之上的ImageView(顯示你的背景圖像)和你的SurfaceView重疊,使之透明。

我有表演的問題畫一個1920×1080的位圖作爲每個SurfaceView重繪背景圖像時:唯一的解決辦法,我發現(感謝this answer)使用的ImageView顯示這1920×1080(固定)的位圖,並在上面用我的SurfaceView ,使其透明,以避免繪製每個SurfaceView重繪的大背景圖像。現在,我的應用程序更加順暢,這得益於此代碼:

// Setup your SurfaceView 
SurfaceView surfaceView = ...; // use any SurfaceView you want 
surfaceView.setZOrderOnTop(true); 
surfaceView.getHolder().setFormat(PixelFormat.TRANSPARENT); 

// Setup your ImageView 
ImageView bgImagePanel = new ImageView(context); 
bgImagePanel.setBackgroundResource(...); // use any Bitmap or BitmapDrawable you want 

// Use a RelativeLayout to overlap both SurfaceView and ImageView 
RelativeLayout.LayoutParams fillParentLayout = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); 
RelativeLayout rootPanel = new RelativeLayout(context); 
rootPanel.setLayoutParams(fillParentLayout); 
rootPanel.addView(surfaceView, fillParentLayout); 
rootPanel.addView(bgImagePanel, fillParentLayout); 

就要把「這個paint方法:(爲了在SurfaceView以‘刷新’先前繪製的圖像」啓動SurfaceView小號緩衝)

canvas.drawColor(0, PorterDuff.Mode.CLEAR); 
+0

謝謝你的男人! 2天我試圖做到這一點! 5年後這仍然救人一命。 – 2016-12-12 14:13:57

+1

非常感謝...'canvas.drawColor(0,PorterDuff.Mode.CLEAR);''是離合! – annie 2017-02-08 19:23:03

0

xav答案的一小部分。你會想以後設置內容視圖rootPanel:

setContentView(rootPanel); 

而且,由於FILL_PARENT已過時,考慮在這兩個地方使用MATCH_PARENT。