前面说到了画图,其实更好的就是使用 surfaceView了。

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

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

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

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

  1. public class SurfaceDraw  extends Activity{
  2. private SurfaceView    sf;
  3. private SurfaceHolder  sfh;   //surfaceView的 控制器
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. // TODO Auto-generated method stub
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_draw);
  9. sf = (SurfaceView) this.findViewById(R.id.SurfaceView01);
  10. //得到控制器
  11. sfh = sf.getHolder();
  12. //对 surfaceView 进行操作
  13. sfh.addCallback(new DoThings());// 自动运行surfaceCreated以及surfaceChanged
  14. }
  15. private class DoThings implements SurfaceHolder.Callback{
  16. @Override
  17. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  18. int height) {
  19. //在surface的大小发生改变时激发
  20. System.out.println("surfaceChanged");
  21. }
  22. @Override
  23. public void surfaceCreated(SurfaceHolder holder){
  24. new Thread(){
  25. public void run() {
  26. while(true){
  27. //1.这里就是核心了, 得到画布 ,然后在你的画布上画出要显示的内容
  28. Canvas c = sfh.lockCanvas(new Rect(0, 0, 200, 200));
  29. //2.开画
  30. Paint  p =new Paint();
  31. p.setColor(Color.rgb( (int)(Math.random() * 255),
  32. (int)(Math.random() * 255) ,  (int)(Math.random() * 255)));
  33. Rect aa  =  new Rect( (int)(Math.random() * 100) ,
  34. (int)(Math.random() * 100)
  35. ,(int)(Math.random() * 500)
  36. ,(int)(Math.random() * 500) );
  37. c.drawRect(aa, p);
  38. //3. 解锁画布   更新提交屏幕显示内容
  39. sfh.unlockCanvasAndPost(c);
  40. try {
  41. Thread.sleep(1000);
  42. } catch (Exception e) {
  43. }
  44. }
  45. };
  46. }.start();
  47. }
  48. @Override
  49. public void surfaceDestroyed(SurfaceHolder holder) {
  50. //销毁时激发,一般在这里将画图的线程停止、释放。
  51. System.out.println("surfaceDestroyed==");
  52. }
  53. }
  54. }

// 实现拖拽效果,也就是动态的绘制

  1. public class Drag extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. DragImage view=new DragImage(this);
  6. setContentView(view);
  7. }
  8. private class DragImage extends SurfaceView implements SurfaceHolder.Callback,Runnable,OnTouchListener{
  9. private Context context;
  10. private SurfaceHolder holder;
  11. private Bitmap icon;
  12. private Paint paint;
  13. private boolean running=true;
  14. public DragImage(Context context) {
  15. super(context);
  16. this.context=context;
  17. holder = this.getHolder();//获取holder
  18. holder.addCallback(this);
  19. this.setOnTouchListener(this);
  20. }
  21. @Override
  22. public void surfaceCreated(SurfaceHolder holder) {
  23. icon = BitmapFactory.decodeResource(context.getResources(),R.drawable.wuranl_1);
  24. paint=new Paint();
  25. running=true;
  26. new Thread(this).start();
  27. }
  28. @Override
  29. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  30. int height) {
  31. }
  32. @Override
  33. public void surfaceDestroyed(SurfaceHolder holder) {
  34. running=false;
  35. }
  36. @Override
  37. public void run() {
  38. int SLEEP_TIME=100;
  39. while (running) {
  40. //开始画的时间    long start=System.currentTimeMillis();
  41. Canvas canvas = holder.lockCanvas();//获取画布
  42. canvas.drawColor(Color.BLACK);
  43. canvas.drawBitmap(icon, rect.left,rect.top,null);
  44. holder.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
  45. //结束的时间   long end=System.currentTimeMillis();
  46. }
  47. }
  48. //      Region region=new Region();
  49. private Point point=new Point();//点击点
  50. private Rect rect;//图片的rect
  51. private boolean canDrag=false;//判断是否点击在图片上,否则拖动无效
  52. private int offsetX=0,offsetY=0;//点击点离图片左上角的距离
  53. @Override
  54. public boolean onTouch(View v, MotionEvent event) {
  55. // TODO Auto-generated method stub
  56. switch (event.getAction()) {
  57. //手按下的时候
  58. case MotionEvent.ACTION_DOWN:
  59. point.x=(int)event.getX();
  60. point.y=(int)event.getY();
  61. if(rect.contains(point.x, point.y)){
  62. canDrag=true;
  63. offsetX=point.x-rect.left;
  64. offsetY=point.y-rect.top;
  65. }
  66. break;
  67. //移动的时候
  68. case MotionEvent.ACTION_MOVE:
  69. if(canDrag){
  70. rect.left=(int)event.getX()-offsetX;
  71. rect.top=(int)event.getY()-offsetY;
  72. rect.right=rect.left+icon.getWidth();
  73. rect.bottom=rect.top+icon.getHeight();
  74. if (rect.left < 0) {
  75. rect.left = 0;
  76. rect.right =  rect.left+icon.getWidth();
  77. }
  78. if (rect.right >  getMeasuredWidth()) {
  79. rect.right =  getMeasuredWidth();
  80. rect.left = rect.right-icon.getWidth();
  81. }
  82. if (rect.top < 0) {
  83. rect.top = 0;
  84. rect.bottom = rect.top+icon.getHeight();
  85. }
  86. if (rect.bottom > getMeasuredHeight()) {
  87. rect.bottom = getMeasuredHeight();
  88. rect.top = rect.bottom-icon.getHeight();
  89. }
  90. }
  91. break;
  92. case MotionEvent.ACTION_UP:
  93. canDrag=false;
  94. break;
  95. default:
  96. break;
  97. }
  98. return true;
  99. }
  100. }
  101. }

还有前面在 View上面绘制的动态折线图,在surfaceView上效果也更好呢

android surfaceView 的简单使用 画图,拖动效果的更多相关文章

  1. js实现一个可以兼容PC端和移动端的div拖动效果

    前段时间写了一个简单的div拖动效果,不料昨天项目上正好需要一个相差不多的需求,就正好用上了,但是在移动端的时候却碰到了问题,拖动时候用到的三个事件:mousedown.mousemove.mouse ...

  2. Android使用SurfaceView实现墨迹天气的风车效果

    SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...

  3. Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...

  4. Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源代码

    在android学习中,动作交互是软件中重要的一部分.当中的Scroller就是提供了拖动效果的类,在网上.比方说一些Launcher实现滑屏都能够通过这个类去实现.以下要说的就是上次Scroller ...

  5. 使用jquery实现简单的拖动效果,分享源码

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkEAAAERCAIAAADzAOSQAAALRklEQVR4nO3dW5LaaAKEUfa/NkfMGu

  6. 使用jQuery实现简单的拖动效果

    转自:http://www.muzilei.com/archives/136 如何实现拖动效果? 浏览DEMO 首先分析下拖动效果原理: 1.当鼠标在被拖动对象上按下鼠标(触发onmousedown事 ...

  7. Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法

    http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 Surfa ...

  8. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  9. Android SurfaceView实战 带你玩转flabby bird (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...

随机推荐

  1. 微信小程序 - loading(组件)

    更新日期: 2019/3/8:首次发布 2019/3/12:增加loadOpacity透明度控制,默认0.5. 以及修改居中方式 Loading 参数: 1. type:loading(必需参数) 2 ...

  2. Go语言中使用MySql数据库

    Go语言中使用MySql数据库 1.MySQL驱动 Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种: http ...

  3. MySQL源代码解读

    第一步: 下载bison-2.4.1-setup.exe链接地址 第二步: 下载cmake-2.8.6-win32-x86.exe链接地址 第三步: 下载MySQL链接地址 G:\Mlearn\mys ...

  4. Linux文件权限与目录

    1:文件操作者的身份 owner:创建文件.拥有文件的登录用户. group:同一群组内的用户. others:其他登录用户. [系统账户与密码信息保存在/etc/passwd:个人账户与密码信息保存 ...

  5. Python学习笔记二:函数式编程

    1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...

  6. Ubuntu中的Gif动画录制工具

    为了在随笔中插入gif动态图Windows系统上可以使用ScreenToGif这个非常好用的小软件,在Ubuntu系统中选择也很多(可以参考最下面的链接),下面介绍两款ubuntu系统中的录屏软件: ...

  7. Tomcat默认界面可导致版本信息泄露+管理后台爆破

    由于配置的Tomcat时,管理页面未进行删除或者权限角色配置,攻击者可以通过暴力猜解进入到管理后台,从而上传获取shell. Tomcat的默认工具manager配置,在很多的生产环境中由于基本用不到 ...

  8. vmware安装找不到虚拟网卡解决方案

    前一段实际,win7升级到win10发现vmware12没有虚拟网卡vnet1/vnet8.这不坑爹吗,没网卡能通信吗? 在网上搜寻一下发现可以重置网络,即可再次安装虚拟网卡...算是对问题的记录学习 ...

  9. Ubuntu18.04下编译安装Guitarix 0.37.3

    准备工作 源文件下载 https://sourceforge.net/projects/guitarix/files/guitarix/ 安装依赖. 参考 https://sourceforge.ne ...

  10. Qt5中表格处理大数据量

    在Qt中如果是普通项目,GUI处理展现的数据量不大,一般用QTableWidget,QTreeWidget这样的控件就满足了,但是如果数据量行数达到了几万行,那么Widget的展示性能就偏差了. Qt ...