Android之SurfaceView学习一
16lz
2021-12-04
实例代码:
import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.os.Bundle;import android.view.Menu;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new MyView(this));}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}/** * surfaceview的实例,用来处理贴图问题 */class MyView extends SurfaceView implements SurfaceHolder.Callback {private SurfaceHolder holder;private MyThread myThread; // 处理绘图的线程public MyView(Context context) {super(context);// TODO Auto-generated constructor stubholder = this.getHolder(); // 获得SurfaceHodler对象holder.addCallback(this); // 添加回调方法myThread = new MyThread(holder); // 创建处理绘图的线程}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubmyThread.isRun = true;myThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubmyThread.isRun = false;}}public class MyThread extends Thread {public boolean isRun;private SurfaceHolder holder;public MyThread(SurfaceHolder holder) {this.holder = holder;isRun = true;}@Overridepublic void run() {int count = 0;while (isRun) {Canvas c = null;try {synchronized (holder) {c = holder.lockCanvas();c.save();// 保存当前绘图环境c.drawColor(Color.BLACK); // 设置画布背景黑色Paint p = new Paint(); // 创建画壁p.setColor(Color.WHITE);Rect r = new Rect(100, 50, 300, 250);c.drawRect(r, p);c.drawText("This is the " + (count++) + " seconds",100, 310, p);c.restore(); // 恢复先前绘图环境Thread.sleep(1000); // sleep 1 second}} catch (Exception e) {e.printStackTrace();} finally {if(c!= null){holder.unlockCanvasAndPost(c); // 结束锁定画布,并提交改变}}}}}}
上面的代码从整体的使用方面给出了实例,接下来进行逐步分解。
1. 首先是声明一个继承SurfaceView并且实现SurfaceHolder.CallBack的子类
class MyView extends SurfaceView implements SurfaceHolder.Callback { @Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stub}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub}
2. 在子类中获得一个用于控制suerfce对象的surfaceHolder对象
holder = SurfaceView.getHodler();holder.addCallback()
3. 在surfaceCreated方法中调用处理绘图线程,并将holder对象传递给绘图线程
4. 绘图线程中处理步骤:
//首先获得canvas对象Canvas c = holder.lockCanvas();c.store();......//解锁并提交改变c.restore();holder.unlockCanvasAndPost(c);
更多相关文章
- 类和 Json对象
- android camera 通过onPreviewFrame采集视频
- Android实现DES对字符串加密
- Android(安卓)Exception异常汇集【不定时更新】
- android源码阅读--线程间通信Handler消息机制
- android:Service
- Android的support v4中的Fragment的一个Bug
- android 顶部的通知栏
- Android--登录界面(demo)