android 绘图的一点总结

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

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

在写一个视频播放器的时候用到了绘图的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);
this.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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值