有沒有辦法設置SurfaceView的背景圖像?是否有在XML來完成,或者我可以做到這一切在Java中 - 我已經得到的東西,看起來像這樣在我的構造函數:設置SurfaceView的背景圖像
Drawable sky = (getResources().getDrawable(R.drawable.sky));
this.setBackgroundDrawable(sky);
但它仍然沒有顯示任何東西。
有沒有辦法設置SurfaceView的背景圖像?是否有在XML來完成,或者我可以做到這一切在Java中 - 我已經得到的東西,看起來像這樣在我的構造函數:設置SurfaceView的背景圖像
Drawable sky = (getResources().getDrawable(R.drawable.sky));
this.setBackgroundDrawable(sky);
但它仍然沒有顯示任何東西。
您不能在SurfaceView上設置可繪製背景。你必須自己將背景繪製到表面上。
試試這個
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
}
如何我可以給佈局大小的位圖在畫布上繪製,並將其放置在surfaceview的中心。 – 2015-04-30 04:36:12
雖然你不能直接在背景圖片設置爲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);
謝謝你的男人! 2天我試圖做到這一點! 5年後這仍然救人一命。 – 2016-12-12 14:13:57
非常感謝...'canvas.drawColor(0,PorterDuff.Mode.CLEAR);''是離合! – annie 2017-02-08 19:23:03
xav答案的一小部分。你會想以後設置內容視圖rootPanel:
setContentView(rootPanel);
而且,由於FILL_PARENT已過時,考慮在這兩個地方使用MATCH_PARENT。
好的,那麼在onDraw()方法中,我會假設? – 2011-05-12 16:28:19
不,onDraw()不會做你想要的。在使用SurfaceView時,您可以使用OpenGL上下文渲染它,也可以通過SurfaceHolder抓取曲面的Canvas。你必須使用Canvas渲染你的背景(如果你正在做OpenGL,則使用OpenGL) – 2011-05-12 16:30:21
我只使用Canvas - 我只是想弄清楚如何使用Canvas做到這一點。 – 2011-05-12 16:31:47