2011-05-12 38 views
5

Có cách nào để đặt hình nền của SurfaceView không? Liệu nó có phải được thực hiện trong xml hoặc tôi có thể làm tất cả trong Java - Tôi đã có một cái gì đó trông giống như thế này trong constructor của tôi:Đặt hình nền của SurfaceView

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

Nhưng nó vẫn không hiển thị bất cứ điều gì.

Trả lời

3

Bạn không thể đặt nền có thể vẽ trên SurfaceView. Bạn sẽ phải tự mình vẽ nền.

+0

Được rồi, vậy trong phương thức onDraw() tôi sẽ đoán? –

+0

Không, onDraw() sẽ không làm những gì bạn muốn. Khi bạn sử dụng một SurfaceView, bạn hoặc render vào nó bằng cách sử dụng một bối cảnh OpenGL hoặc bạn lấy Canvas của bề mặt thông qua SurfaceHolder. Bạn phải tạo nền của mình bằng Canvas đó (hoặc OpenGL nếu bạn đang làm OpenGL.) –

+1

Tôi chỉ sử dụng Canvas - Tôi chỉ đang cố gắng tìm hiểu cách tôi sẽ làm điều đó với Canvas. –

4

Hãy thử điều này

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

làm thế nào tôi có thể cung cấp cho kích thước bố trí để vẽ bitmap trên vải, và đặt nó ở trung tâm của surfaceview. –

6

Trong khi bạn không thể trực tiếp thiết lập một hình ảnh nền cho một SurfaceView, bạn có thể chồng lên nhau một ImageView (hiển thị hình nền của bạn) và SurfaceView của bạn trên đầu trang này, làm cho nó minh bạch.

Tôi có vấn đề biểu diễn khi vẽ một bitmap 1920x1080 làm hình nền cho mỗi repaint SurfaceView: giải pháp duy nhất tôi tìm thấy (nhờ this answer) đã sử dụng một ImageView hiển thị 1920x1080 này bitmap (cố định), và sử dụng SurfaceView của tôi trên đầu trang của nó, làm cho nó minh bạch, để tránh sơn hình nền lớn cho mỗi SurfaceView sơn lại. Bây giờ ứng dụng của tôi là mượt mà hơn nhiều, nhờ vào mã này:

// 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); 

Sau đó, bạn sẽ bắt đầu 'phương pháp s sơn với điều này: (theo thứ tự để 'tuôn' hình ảnh được vẽ trước đó trong SurfaceView' SurfaceView bạn s đệm)

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

Cảm ơn bạn! 2 ngày tôi đã cố gắng để làm điều đó! Sau 5 năm điều này vẫn cứu mạng người khác. –

+1

cảm ơn rất nhiều ... rằng 'canvas.drawColor (0, PorterDuff.Mode.CLEAR);' là ly hợp! – annie

0

Một bổ sung nhỏ cho câu trả lời của xav. Bạn muốn đặt chế độ xem nội dung là rootPanel sau đó:

setContentView(rootPanel); 

Ngoài ra, vì FILL_PARENT không được dùng nữa, hãy cân nhắc sử dụng MATCH_PARENT ở cả hai nơi.

Các vấn đề liên quan