设为首页 加入收藏

TOP

Android SurfaceView使用 笔记
2014-11-24 11:50:12 来源: 作者: 【 】 浏览:1
Tags:Android SurfaceView 使用 笔记

SurfaceView 是一个继承了View但是由于一般的View有这很大区别的类.


这是由于 SurfaceView 的绘制方法和原来的View不同.在 View 中系统不允许主线程外的线程控制 UI .但是 SurfaceView 却可以 .下面是我总结的几个要点:


1. 首先需要实现 View 的构造方法.( 如果 需要在XML 文件中布局需要实现public S(Context context, AttributeSet attrs) 这个构造方法 )


2. 由于需要对SurfaceView 进行监控所以需要实现 SurfaceHolder.Callback 这个接口( 可以用内部类或者方法实现.) 这个接口需要实现三个方法:


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} //大小改变的时候被调用到.


public void surfaceCreated(SurfaceHolder holder) {} // 创建的时候被调用到


public void surfaceDestroyed(SurfaceHolder holder) {} //销毁的时候被调用


3.在SurfaceView 中屏幕接触处理和 布局处理和View一样.


4. 使用绘制的时候和 View 完全不一样.他是使用 SufaceHodler 的方法


public canvas holder.lockCanvas();


public void unlockCanvasAndPost(canvas);


第一个方法可以调用出一个Canvas 画布.在上面绘制所需的画面.然后调用第二个方法.这样就可以在屏幕上面绘制出来的.


View中的 invalidate()方法需要在主线程中调用(postInvalidate()不同).但是 SurfaceView不需要.SurfaceView绘制效率比View高.


5.SurfaceView中如果需要请求重新布局同样使用 requestLayout();


6. 和View一样重要的一些方法:


onMeasure(int ,int); 是使用 View 前需要调用的方法. 通知View进行自身尺寸测量.如果自己重写的话测量完自身大小注意需要调用setMeasuredDimension(int, int);这个方法设置控件大小.


onLayout(boolean,int,int,int,int); 这个方法使父控件具体分配给当前View的具体位置的方法.


下面是一个小例子 :


main.xml:


/>




SurfaceView 子类 SVD:



import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class SVD extends SurfaceView implements SurfaceHolder.Callback, Runnable{



SurfaceHolder holder;

public SVD(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("init()");

holder = getHolder();

holder.addCallback(this);
}

public void draw(){
System.out.println(" draw()");

Canvas canvas = holder.lockCanvas();

draw(canvas);

holder.unlockCanvasAndPost(canvas);
}


@Override
public void draw(Canvas canvas) {
canvas.drawColor(0xff7f7f7f + (run << 3));
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.setMeasuredDimension(130, 100);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
System.out.println("width:"+width+" height:"+height);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
System.out.println(" create ");

new Thread(this).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {

this.holder = null;
}


int run = 10;
@Override
public void run() {
// TODO Auto-generated method stub
try{
while( run-- > 0){

draw();

Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}
}
}


Activity 中 的onCreate(Bundle)


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android中Bitmap按比例放大 下一篇Android TabHost 详细讲解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·深入理解 Java 集合 (2025-12-27 07:22:48)
·Java集合框架全面解 (2025-12-27 07:22:45)
·时隔 15 年,巨著《J (2025-12-27 07:22:43)
·定义一个类模板并实 (2025-12-27 06:52:28)
·一文搞懂怎么用C语言 (2025-12-27 06:52:25)