android之SurfaceView和SurfaceHolder用法 android中viewholder

SurfaceView是视图(View)的继承类,SurfaceView控制这个Surface的绘制位置。

surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,surface的排版显示收到视图层级关系的影响,它的兄弟视图节点会在顶端显示。注意,如果surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明结构,这回影响性能。

你可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。

surfaceview提供了两个线程:UI线程和渲染线程。

1>所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序的主线程。渲染线程访问的各种变量应该做同步处理。

2>由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。

SurfaceView是个重要的绘图容器,它可以在主线程外的线程中向屏幕绘图,这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

可以把Surface理解为显存的一个映射,写入到Surface的内容可以直接复制到显存从而显示出来,这会使得显示速度非常快),Surface被销毁之前必须结束。

应用过程:

1,class MyView extends SurfaceViewimplements SurfaceHolder.Callback

2,SurfaceView.getHolder()获得SurfaceHolder对象

3,SurfaceHolder.addCallback(callback)添加回调函数

4,SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布

5,Canvas绘画

6,SurfaceHolder.unlockCanvasAndPost(Canvascanvas)结束锁定画图,并提交改变,将图形显示。

其中4,5,6都应该在绘图线程中执行,1,2,3同步变量并且在主线程中执行。

SurfaceHolder可以看成是一个surface控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。

实例代码:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(new MyView(this));

}

class MyView extends SurfaceView implements SurfaceHolder.Callback{

private SurfaceHolder holder;

private MyThread myThread;

public MyView(Context context) {

super(context);

// TODO Auto-generated constructorstub

holder = this.getHolder();

holder.addCallback(this);

myThread = new MyThread(holder);//创建一个绘图线程

}

@Override

public void surfaceChanged(SurfaceHolderholder, int format, int width,

android之SurfaceView和SurfaceHolder用法 android中viewholder

int height) {

// TODO Auto-generated method stub

}

@Override

public void surfaceCreated(SurfaceHolder holder){

// TODO Auto-generated method stub

myThread.isRun = true;

myThread.start();

}

@Override

public void surfaceDestroyed(SurfaceHolderholder) {

// TODO Auto-generated method stub

myThread.isRun = false;

}

}

class MyThread extends Thread{

private SurfaceHolder holder;

public boolean isRun;

public MyThread(SurfaceHolderholder){

this.holder = holder;

isRun = true;

}

@Override

public void run() {

// TODO Auto-generated method stub

//super.run();

int count = 0;

while(isRun){

Canvas c = null;

try{

synchronized(holder){

c = holder.lockCanvas();

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("这是第"+(count++)+"秒", 100, 310, p);

Thread.sleep(1000);

}

}catch(Exception e){

e.printStackTrace();

}finally{

if(c!=null){

holder.unlockCanvasAndPost(c);

}

}

}

}

}

}

ref:

http://www.cnblogs.com/xuling/archive/2011/06/06/android.html

现在word中排版再弄上来,比较好。哈哈哈

  

爱华网本文地址 » http://www.aihuau.com/a/25101017/365713.html

更多阅读

转载 关于BOLL-M和BBIBOLL在实战中的比对秋实原创系列 王秋实

原文地址:关于BOLL-M和BBIBOLL在实战中的比对(秋实原创系列)作者:秋实一般平时常用指标BOLL-M布林线-主图叠加指标和BBIBOLL多空指标BBI和布林线叠加比对来分析股票,而且盘中30分钟比较有效,特别是对于BBIBOLL的观察有些心得。BBIBOLL的用

北广之星和中传有关系吗?手把手教你认清! 中传之星

临近艺考,同学们寻找培训班的需要紧迫,一些培训机构和个人为了某些利益和目的,在网络平台上散布关于北广之星的不实信息。北广之星和中传到底有没有关系,相信这是很多学生和家长所关心的,下面,小编就手把手教大家来认清北广之星。第一步:

声明:《android之SurfaceView和SurfaceHolder用法 android中viewholder》为网友花开又三年分享!如侵犯到您的合法权益请联系我们删除