surfaceview使用详解

SurfaceView是Android中专门用于绘制复杂、频繁刷新的视图控件,它可以在单独的线程中绘制图像,提高绘制的效率和性能。SurfaceView的使用方法较复杂,需要与SurfaceHolder配合使用。

一、基本用法

1. 在XML布局文件中添加SurfaceView控件:

```xml

android:id="@+id/surfaceview"

android:layout_width="match_parent"

android:layout_height="match_parent" />

```

2. 在Activity中找到SurfaceView控件并获取其SurfaceHolder对象:

```java

SurfaceView surfaceView = findViewById(R.id.surfaceview);

SurfaceHolder holder = surfaceView.getHolder();

```

3. 设置SurfaceHolder的回调方法:

```java

holder.addCallback(new SurfaceHolder.Callback() {

@Override

public void surfaceCreated(SurfaceHolder holder) {

// Surface被创建时调用

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// Surface改变时调用

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// Surface被销毁时调用

}

});

```

4. 在相应的回调方法中进行绘制操作:

```java

@Override

public void surfaceCreated(SurfaceHolder holder) {

// 获取Canvas对象,并在其上进行绘制操作

Canvas canvas = holder.lockCanvas();

// 绘制操作...

holder.unlockCanvasAndPost(canvas);

}

```

二、SurfaceView的主要方法和作用

1. surfaceCreated(SurfaceHolder holder):Surface被创建时调用,一般在这里初始化绘制资源。

2. surfaceChanged(SurfaceHolder holder, int format, int width, int height):Surface改变时调用,如旋转屏幕等,一般在这里重新设置绘制参数。

3. surfaceDestroyed(SurfaceHolder holder):Surface被销毁时调用,一般在这里释放绘制资源。

三、SurfaceHolder的主要方法和作用

1. lockCanvas():获取Canvas对象,用于绘制操作。

2. unlockCanvasAndPost(Canvas canvas):解锁Canvas对象,并将绘制内容提交显示在Surface上。

四、使用案例:绘制动画

下面以绘制一个简单的动画为例,说明SurfaceView的使用方法。

1. 新建一个名为MySurfaceView的类,继承SurfaceView,并实现SurfaceHolder.Callback接口:

```java

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

private MyThread thread;

public MySurfaceView(Context context) {

super(context);

getHolder().addCallback(this);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

thread = new MyThread(getHolder(), this);

thread.setRunning(true);

thread.start();

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

boolean retry = true;

thread.setRunning(false);

while (retry) {

try {

thread.join();

retry = false;

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public void update() {

// 更新绘制内容

}

public void draw(Canvas canvas) {

// 绘制操作

}

}

```

2. 新建一个名为MyThread的线程类,用于在单独的线程中进行绘制操作:

```java

public class MyThread extends Thread {

private SurfaceHolder surfaceHolder;

private MySurfaceView surfaceView;

private boolean running;

public MyThread(SurfaceHolder surfaceHolder, MySurfaceView surfaceView) {

this.surfaceHolder = surfaceHolder;

this.surfaceView = surfaceView;

}

public void setRunning(boolean running) {

this.running = running;

}

@Override

public void run() {

Canvas canvas;

while (running) {

canvas = null;

try {

canvas = surfaceHolder.lockCanvas();

synchronized (surfaceHolder) {

surfaceView.update();

surfaceView.draw(canvas);

}

} finally {

if (canvas != null) {

surfaceHolder.unlockCanvasAndPost(canvas);

}

}

}

}

}

```

3. 在Activity中使用MySurfaceView:

```java

public class MainActivity extends AppCompatActivity {

private MySurfaceView surfaceView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

surfaceView = findViewById(R.id.surfaceview);

}

@Override

protected void onPause() {

super.onPause();

surfaceView.surfaceDestroyed(surfaceView.getHolder());

}

@Override

protected void onResume() {

super.onResume();

surfaceView.surfaceCreated(surfaceView.getHolder());

}

}

```

以上就是SurfaceView的详细使用方法和一个绘制动画的简单案例。通过使用SurfaceView,我们可以更高效地进行复杂、频繁刷新的绘制操作,提高应用的性能和用户体验。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(67) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部