为了账号安全,请及时绑定邮箱和手机立即绑定

android surfaceViewd的使用——简单画图

标签:
Android

surfaceView 继承于 View,View里面嵌套了一个专门用于画图的 surface,

对于一个View的onDraw()方法,不能够满足将其移动到后台线程中去。因为从后台线程修改一个GUI元素会被显式地禁止的。当需要快速地更新View的UI,或者当前渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。SurfaceView封装了一个Surface对象,而不是Canvas。这一点很重要,因为Surface可以使用后台线程绘制。对于那些资源敏感的操作,或者那些要求快速更新或者高速帧率的地方,例如使用3D图形,创建游戏,或者实时预览摄像头,这一点特别有用。

可以直接从内存或硬件设备比如相机等取得图像数据,是个非常重要的绘图容器。它的特性是:可以在主线程之外的线程中向屏幕绘图。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。绘制的东西直接复制到显存从而显示出来,这使得显示速度会非常快,而在Surface 被销毁之前必须结束。

 

下面给个简单的例子,就是不停的绘制 ,这样按照前面说的,就可以再 上面绘制各种自己想要的效果了:

 


[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

public class SurfaceDraw    extends Activity{   

     private SurfaceView      sf;     

     private SurfaceHolder  sfh;   //surfaceView的 控制器 

       

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 

        //   TODO Auto-generated method stub 

        super.onCreate(savedInstanceState);   

        setContentView(R.layout.activity_draw);   

        sf   = (SurfaceView) this.findViewById(R.id.SurfaceView01); 

        //得到控制器 

        sfh   = sf.getHolder(); 

        //对 surfaceView 进行操作 

        sfh.addCallback(new DoThings());// 自动运行surfaceCreated以及surfaceChanged 

    } 

       

       

    private class DoThings implements SurfaceHolder.Callback{ 

        @Override 

        public void surfaceChanged(SurfaceHolder holder, int format, int width, 

                int height) { 

            //在surface的大小发生改变时激发 

            System.out.println("surfaceChanged");   

        }   

   

        @Override 

        public void surfaceCreated(SurfaceHolder holder){ 

            new Thread(){ 

                public void run() { 

                    while(true){   

                        //1.这里就是核心了, 得到画布 ,然后在你的画布上画出要显示的内容   

                        Canvas   c = sfh.lockCanvas(new Rect(0, 0, 200, 200)); 

                        //2.开画 

                        Paint    p =new Paint();   

                        p.setColor(Color.rgb(   (int)(Math.random() * 255),  

                                (int)(Math.random()   * 255) ,  (int)(Math.random() * 255))); 

                        Rect   aa  =  new Rect( (int)(Math.random() * 100) , 

                                (int)(Math.random()   * 100)  

                                ,(int)(Math.random()   * 500)  

                                ,(int)(Math.random()   * 500) ); 

                        c.drawRect(aa,   p); 

                        //3.   解锁画布     更新提交屏幕显示内容 

                        sfh.unlockCanvasAndPost(c);   

                        try

                            Thread.sleep(1000);   

                               

                        }   catch (Exception   e) { 

                        }   

                    }   

                };   

            }.start();   

               

        }   

   

        @Override 

        public void surfaceDestroyed(SurfaceHolder holder) { 

               //销毁时激发,一般在这里将画图的线程停止、释放。 

            System.out.println("surfaceDestroyed==");      

        }      

    } 

}

原文链接:http://www.apkbus.com/blog-664680-60595.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消