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);
Được rồi, vậy trong phương thức onDraw() tôi sẽ đoán? –
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.) –
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. –