android的转盘

1、概述

今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么东西?什么时候用比较好呢?

可以看到SurfaceView也是继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢?

因为它和View有一个很大的区别,View在UI线程去更新自己;而SurfaceView则在一个子线程中去更新自己;这也显示出了它的优势,当制作游戏等需要不断刷新View时,因为是在子线程,避免了对UI线程的阻塞。

知道了优势以后,你会想那么不使用draw方法,哪来的canvas使用呢?

大家都记得更新View的时候draw方法提供了一个canvas,SurfaceView内部内嵌了一个专门用于绘制的Surface,而这个Surface中包含一个Canvas。

有了Canvas,我们如何获取呢?

SurfaceView里面有个getHolder方法,我们可以获取一个SurfaceHolder。通过SurfaceHolder可以监听SurfaceView的生命周期以及获取Canvas对象。


2、一般的写法

综上所述,一般SurfaceView类中我们会这么写代码:

[java]  view plain   copy
  1. public class SurfaceViewTemplate extends SurfaceView implements Callback, Runnable  
  2. {  
  3.   
  4.     private SurfaceHolder mHolder;  
  5.     /** 
  6.      * 与SurfaceHolder绑定的Canvas 
  7.      */  
  8.     private Canvas mCanvas;  
  9.     /** 
  10.      * 用于绘制的线程 
  11.      */  
  12.     private Thread t;  
  13.     /** 
  14.      * 线程的控制开关 
  15.      */  
  16.     private boolean isRunning;  
  17.   
  18.     public SurfaceViewTemplate(Context context)  
  19.     {  
  20.         this(context, null);  
  21.     }  
  22.   
  23.     public SurfaceViewTemplate(Context context, AttributeSet attrs)  
  24.     {  
  25.         super(context, attrs);  
  26.   
  27.         mHolder = getHolder();  
  28.         mHolder.addCallback(this);  
  29.   
  30.         // setZOrderOnTop(true);// 设置画布 背景透明  
  31.         // mHolder.setFormat(PixelFormat.TRANSLUCENT);  
  32.           
  33.         //设置可获得焦点  
  34.         setFocusable(true);  
  35.         setFocusableInTouchMode(true);  
  36.         //设置常亮  
  37.         this.setKeepScreenOn(true);  
  38.   
  39.     }  
  40.   
  41.     @Override  
  42.     public void surfaceCreated(SurfaceHolder holder)  
  43.     {  
  44.   
  45.         // 开启线程  
  46.         isRunning = true;  
  47.         t = new Thread(this);  
  48.         t.start();  
  49.     }  
  50.   
  51.     @Override  
  52.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  53.             int height)  
  54.     {  
  55.         // TODO Auto-generated method stub  
  56.   
  57.     }  
  58.   
  59.     @Override  
  60.     public void surfaceDestroyed(SurfaceHolder holder)  
  61.     {  
  62.         // 通知关闭线程  
  63.         isRunning = false;  
  64.     }  
  65.   
  66.     @Override  
  67.     public void run()  
  68.     {  
  69.         // 不断的进行draw  
  70.         while (isRunning)  
  71.         {  
  72.             draw();  
  73.         }  
  74.   
  75.     }  
  76.   
  77.     private void draw()  
  78.     {  
  79.         try  
  80.         {  
  81.             // 获得canvas  
  82.             mCanvas = mHolder.lockCanvas();  
  83.             if (mCanvas != null)  
  84.             {  
  85.                 // drawSomething..  
  86.             }  
  87.         } catch (Exception e)  
  88.         {  
  89.         } finally  
  90.         {  
  91.             if (mCanvas != null)  
  92.                 mHolder.unlockCanvasAndPost(mCanvas);  
  93.         }  
  94.     }  
  95. }  

结合上面我们的介绍,我们在构造中通过getHolder拿到SurfaceHolder对象,然后设置一个addCallback回调,去监听SurfaceView的生命周期,生命周期有三个方法,分别为create,change,destory;我们一般在create里面进行初始化的一些操作,然后开启线程;在destroy里面设置关闭线程;

所有的绘制流程都是线程的run方法里面,可以看到我们的draw方法。

注意下,我们在draw里面进行了try catch然后很多的判空,主要是因为,当用户点击back或者按下home键以后,surfaceview会被销毁;

 mHolder.lockCanvas();返回的就是null了,所以为了避免造成空指针错误,我们各种判null,甚至还加了个try catch。

说了这么多,竟然没看到效果图,这怎么能行~~


3、效果图


就这么个效果,当然了模拟器录制的效果肯定没有真机上效果流畅。

结合上面我们给出的模版,我们需要改变的就是,在create回调里面需要去初始化一些变量,在draw方法里面去绘制我们的文本、图片、扇形块块等等。整体架构没有变化。

4、转盘的制作


1、构造方法以及变量

[java]  view plain   copy
  1. public class LuckyPanView extends SurfaceView implements Callback, Runnable  
  2. {  
  3.   
  4.     private SurfaceHolder mHolder;  
  5.     /** 
  6.      * 与SurfaceHolder绑定的Canvas 
  7.      */  
  8.     private Canvas mCanvas;  
  9.     /** 
  10.      * 用于绘制的线程 
  11.      */  
  12.     private Thread t;  
  13.     /** 
  14.      * 线程的控制开关 
  15.      */  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值