surfaceview bitmap
时间: 2023-10-11 21:13:39 浏览: 27
SurfaceView 是 Android 平台上的一个 View,它允许我们在一个单独的线程中绘制图形,以提高性能和用户体验。在 SurfaceView 中绘制图形时,我们通常会使用 Bitmap 对象来处理图像数据,因为它是 Android 平台上最常用的图像格式之一。
使用 SurfaceView 和 Bitmap 绘制图形的基本流程如下:
1. 创建一个 SurfaceView 对象,并在 XML 布局文件中引用它。
2. 在 Activity 的 onCreate() 方法中获取 SurfaceHolder 对象,并设置 SurfaceHolder.Callback 接口以获取 SurfaceView 的绘制事件。
3. 在 SurfaceHolder.Callback 接口的 surfaceCreated() 方法中创建一个新的绘图线程,并启动它。
4. 在绘图线程中创建一个 Canvas 对象,并使用 Canvas.drawBitmap() 方法绘制 Bitmap 对象。
5. 在绘图线程中调用 SurfaceHolder.unlockCanvasAndPost() 方法提交绘制结果。
需要注意的是,由于 SurfaceView 和 Bitmap 都是 Android 平台上的重要组件,因此在使用它们时需要遵循一些最佳实践,以确保应用程序的性能和稳定性。例如,我们应该尽可能避免频繁地创建和销毁 Bitmap 对象,以减少内存使用和 GC 压力。
相关问题
surfaceview 展示 bitmap
要在 SurfaceView 上展示 Bitmap,需要遵循以下步骤:
1. 获取 SurfaceHolder 对象,通过 SurfaceView.getHolder() 方法获取。
2. 在 SurfaceHolder.Callback 中的 surfaceCreated() 方法中,获取 Canvas 对象。
3. 在 Canvas 上绘制 Bitmap,可以使用 Canvas.drawBitmap() 方法。
4. 在 SurfaceHolder.Callback 中的 surfaceChanged() 方法中,设置 SurfaceView 的尺寸和格式。
5. 在 SurfaceHolder.Callback 中的 surfaceDestroyed() 方法中,释放资源。
下面是一个简单的代码示例:
```
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mSurfaceHolder;
private Bitmap mBitmap;
public MySurfaceView(Context context) {
super(context);
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(mBitmap, 0, 0, null);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO: 设置 SurfaceView 的尺寸和格式
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mBitmap.recycle();
}
}
```
这个例子中,我们在 SurfaceView 的构造方法中加载了一张图片,然后在 SurfaceHolder.Callback 的 surfaceCreated() 方法中将图片绘制到 Canvas 上,并通过 SurfaceHolder.unlockCanvasAndPost() 方法提交绘制结果。在 surfaceDestroyed() 方法中释放图片资源。
surfaceview 刷新bitmap
要在 SurfaceView 中刷新 Bitmap,你需要在 SurfaceView 中创建一个绘制线程,然后在该线程中使用 Canvas 绘制 Bitmap。具体步骤如下:
1. 在 SurfaceView 中创建一个绘制线程:
```
class DrawThread extends Thread {
private SurfaceHolder surfaceHolder;
private boolean isRunning;
private Bitmap bitmap;
public DrawThread(SurfaceHolder surfaceHolder, Bitmap bitmap) {
this.surfaceHolder = surfaceHolder;
this.bitmap = bitmap;
isRunning = true;
}
public void setRunning(boolean running) {
isRunning = running;
}
@Override
public void run() {
while (isRunning) {
Canvas canvas = null;
try {
canvas = surfaceHolder.lockCanvas();
if (canvas != null) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}
```
2. 在 SurfaceView 中创建一个 SurfaceHolder.Callback 对象,实现 surfaceCreated() 方法,在该方法中启动绘制线程:
```
class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private DrawThread drawThread;
private Bitmap bitmap;
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
getHolder().addCallback(this);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_bitmap);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
drawThread = new DrawThread(holder, bitmap);
drawThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
drawThread.setRunning(false);
while (retry) {
try {
drawThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
}
```
这样,每当你更新 Bitmap 的时候,就可以在绘制线程中重新绘制 Bitmap,从而实现 SurfaceView 中 Bitmap 的刷新。
阅读全文