您的位置:首页 > 移动开发 > Android开发

android 绘图的一点总结

2014-11-06 17:46 309 查看
第一次写博客啊,可谓是处作。开始学做安卓,好多东西都不会,上网查,才发现,写技术博客这么有用啊,希望以后能经常写,与大家交流。

水平太浅,只能去读别人的代码,在总结。

在写一个视频播放器的时候用到了绘图的surfaceview和SurfaceHolder.Callback等类,经过自己上网查资料,总结了以下的东西

一个绘图文件的分析:

1.建一个活动,在活动中去启动绘图类

2.绘图类中要引用 SurfaceHolder类 private surfaceholder suf。绘图类要继承surfaceview类,这时需要重写构造器,在构造器中用 suf = this.getHolder()得到实例对象;为对象添加回调方法,上下文是自己, suf.addCallback(this);这时绘画类又要去实现SurfaceHolder.Callback的接口方法;三个回调方法

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub

}

public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub

}

具体的绘图行为在surfaceCreated方法中起一个线程去实现,要想实现图片的切换可以在这些方法的外面写一个函数,在线程里去调用这个方法;

我们要绘画实际是在surface中去绘制,surface提供了画布canvas,画图实质是调用了画布的方法再加一个自己实现的画笔(可绘文字,可绘图片,等);而我们要去操作画布就得需要surface,而对surface的操作是由SurfaceHolder对象完成的,这就需要调用surfaceview的getholder方法得到一个SurfaceHolder的对象,经过这些复杂的关系:

可以得到以下的代码:

//#########画布锁上后去绘画,解锁后,图像才会显示出来

public class Suu extends SurfaceView implements SurfaceHolder.Callback {

public Suu(Surfaceview_testActivity sp) {
super(sp);
t
4000
his.sb = sp;
// TODO Auto-generated constructor stub
// 通过SurfaceView获得SurfaceHolder对象  

        suf = this.getHolder();  

  Log.i("new", "getholder");

        // 为SurfaceHolder添加回调结构SurfaceHolder.Callback  

        suf.addCallback(this);

        Log.i("new", "添加回调函数");
}

     Surfaceview_testActivity sb;//本类中包含了活动类,资源文件属于活动类的
private String str = "hello";
private SurfaceHolder suf;
private Boolean flag;
private int  counter;
private Canvas canvas;

Bitmap[] bt = new Bitmap[1];//bitmap数组,不能单用

//按back键时会返回异常,activity虽然退出,但线程仍然在执行画图,所以就出问题了
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Log.i(str, "surfaceChanged");
}

// public void lo(){

// Log.i("", "########$$");//线程体内可以调用此方法,这样就能实现动画效果了

// }

     public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub

Log.i(str, "surfaceCreated"); 

        counter = 0;  

        flag = true; 

        new Thread(){

        public void run() {

        while (flag) {  

                // 锁定画布,得到Canvas对象  

                canvas = suf.lockCanvas();  

                // 设定Canvas对象的背景颜色  

                canvas.drawColor(Color.BLUE);  

                // 创建画笔  

                Paint p = new Paint();  

                // 设置画笔颜色  

                p.setColor(Color.YELLOW);  

                // 设置文字大小  

                p.setTextSize(40);        
  // 创建一个Rect对象rect  __-_-位置参数的对象

                // public Rect (int left, int top, int right, int bottom)  

                Rect rect = new Rect(100, 50, 400, 350);  

                // 在canvas上绘制rect  

                canvas.drawRect(rect, p);  

                // 在canvas上显示时间  

                // public void drawText (String text, float x, float y, Paint  

                // paint) 

                 

                canvas.drawText("时间 = " + (counter++) + " 秒", 500, 200, p);

                 // lo();可以调用外部方法的哦   

                bt[0]= BitmapFactory.decodeResource(sb.getResources(), R.drawable.ic_launcher);

             //  canvas.drawBitmap(bitmap, left, top, paint)

                canvas.drawBitmap(bt[0], 500,200, p);

                if (canvas != null) {  

                    // 解除锁定,并提交修改内容,更新屏幕  

                //画布用过了,就解锁       

//                 for(int i = 0;i<20;i++){

//                 try {

// Thread.sleep(1000);

// } catch (InterruptedException e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }

//                 Log.i("", "**"+i);

//                 }

                    suf.unlockCanvasAndPost(canvas);  

                } 

                try {  

                    Thread.sleep(1000);  

                } catch (InterruptedException e) {  

                    // TODO Auto-generated catch block  

                    e.printStackTrace();  

                }  

            }  

          }

        }.start() ;

        
}
//函数中加上结束线程标记即

public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.i(str, "surfaceDESTORY");
}

}

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

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

2.SurfaceHolder

显示一个surface的抽象接口,使你可以控制surface的大小和格式, 以及在surface上编辑像素,和监视surace的改变。这个接口通常通过SurfaceView类实现。

3. SurfaceHolder.Callback

用户可以实现此接口接收surface变化的消息。当用在一个SurfaceView 中时,  它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。设置Callback的方法是SurfaceHolder.addCallback.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android