/********************************************************************************************
* author:conowen@大钟                                                                                                                         
* E-mail:conowen@hotmail.com                                                                                                            
* http://blog.csdn.net/conowen                                                                                                             
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。

http://blog.csdn.net/conowen/article/details/7843487

********************************************************************************************/

1、View

View

extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource

java.lang.Object
   ↳ android.view.View
Known Direct Subclasses(直接子类,SurfaceView是View的子类)

AnalogClock,ImageView,KeyboardView,MediaRouteButton,ProgressBar,Space,SurfaceView,TextView,TextureView,ViewGroup,ViewStub
Known Indirect Subclasses(间接子类)

AbsListView,AbsSeekBar,AbsSpinner,AbsoluteLayout,AdapterView<T extends Adapter>,AdapterViewAnimator,AdapterViewFlipper,AppWidgetHostView,AutoCompleteTextView,Button,CalendarView, CheckBox, CheckedTextView, Chronometer, and 53 others.

Class Overview


This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class forwidgets, which are used to create interactive UI components (buttons, text fields, etc.). TheViewGroup subclass is the base class forlayouts, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.

View类为用户界面提供了最基础的组件,View类组件负责更换屏幕与处理事件。同时,View类也是widgets类的基础类,widgets类可以创建基础的UI组件,如Bottons、Textview等等。View类的其中一个直接子类ViewGroup是layous的基础类,layous是用来装载View或者其他的ViewGrous的,并且可以定义这些装载内容的特性。

2、

从上述的Overview可知,SurfaceView是继承于View类的,(GLSurfaceView是继承于SurfaceView的)。关于SurfaceView的详细可以参看之前的博文

http://blog.csdn.net/conowen/article/details/7821409

Android更新屏幕主要有两种方式,继承SurfaceView实现SurfaceHolder.callback接口来实现屏幕的更新。

或者直接继承View类,复写OnDraw方法实现更新屏幕。

事实上,两种是用本质的区别的。

3、View与SurfaceView更新屏幕的区别

对于SurfaceView更新屏幕,是在非UI线程(主线程)中更新的。而对于View,则是在UI的主线程中更新画面。
那在UI的主线程中更新画面很容易造成主线程的堵塞,造成程序的长时间无响应,当主UI线程超过5秒钟没有响应用户的操作,Android系统会提示是否关闭应用程序。

当使用SurfaceView 来更新画面的话,就不必担心堵塞主UI线程这个问题了。但是这也带来了另外一个问题,线程的同步性。

所以当更新操作说花的时间较长,而且数据量较大的话,一般采用SurfaceView方式更新屏幕,而少用View。

4、Demo程序

[java] view plaincopyprint?
  1. /*
  2. * author: conowen
  3. * e-mail: conowen@hotmail.com
  4. * date  :  2012.8.8
  5. */
  6. package com.conowen.viewtestdemo;
  7. import android.content.Context;
  8. import android.graphics.Canvas;
  9. import android.graphics.Color;
  10. import android.graphics.Paint;
  11. import android.graphics.RectF;
  12. import android.view.View;
  13. public class MyView extends View {
  14. private int counter;
  15. public MyView(Context context) {
  16. super(context);
  17. // TODO Auto-generated constructor stub
  18. }
  19. @Override
  20. protected void onDraw(Canvas canvas) {
  21. // TODO Auto-generated method stub
  22. super.onDraw(canvas);
  23. /*      synchronized (this) {
  24. try {
  25. wait(10 * 1000);
  26. } catch (InterruptedException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31. */
  32. // 设定Canvas对象的背景颜色
  33. canvas.drawColor(Color.YELLOW - counter);
  34. // 创建画笔
  35. Paint p = new Paint();
  36. // 设置画笔颜色
  37. p.setColor(Color.RED);
  38. // 设置文字大小
  39. p.setTextSize(40);
  40. // 消除锯齿
  41. p.setFlags(Paint.ANTI_ALIAS_FLAG);
  42. // 在canvas上绘制rect
  43. canvas.drawArc(new RectF(100, 50, 400, 350), 0, counter, true, p);
  44. if (counter == 400) {
  45. counter = 0;
  46. }
  47. canvas.drawText("counter = " + (counter++), 500, 200, p);
  48. // 重绘, 再一次执行onDraw 程序
  49. invalidate();
  50. }
  51. }
/** author: conowen* e-mail: conowen@hotmail.com* date  :  2012.8.8*/
package com.conowen.viewtestdemo;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;public class MyView extends View {private int counter;public MyView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);
/*      synchronized (this) {try {wait(10 * 1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
*/// 设定Canvas对象的背景颜色canvas.drawColor(Color.YELLOW - counter);// 创建画笔Paint p = new Paint();// 设置画笔颜色p.setColor(Color.RED);// 设置文字大小p.setTextSize(40);// 消除锯齿p.setFlags(Paint.ANTI_ALIAS_FLAG);// 在canvas上绘制rectcanvas.drawArc(new RectF(100, 50, 400, 350), 0, counter, true, p);if (counter == 400) {counter = 0;}canvas.drawText("counter = " + (counter++), 500, 200, p);// 重绘, 再一次执行onDraw 程序invalidate();}}

效果图:

打开下面的代码,测试堵塞主UI线程(长按屏幕5秒以上)就会出现如下的图。

[java] view plaincopyprint?
  1. synchronized (this) {
  2. try {
  3. wait(10 * 1000);
  4. } catch (InterruptedException e) {
  5. // TODO Auto-generated catch block
  6. e.printStackTrace();
  7. }
  8. }
synchronized (this) {try {wait(10 * 1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

注意:

onDraw方法是运行于主UI线程中的,如果你在onDraw中执行invalidate()方法去更新屏幕,是可以的。但是你既要继承View而且要不希望堵塞主UI线程的话,可以另外新建线程,然后在线程中执行postInvalidate()方法去更新屏幕。也就是说invalidate()方法只能在主UI线程中被调用,postInvalidate()方法只能在非主UI线程中被调用。否则会出现如下error

08-08 15:33:34.587: E/AndroidRuntime(4995): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

这两个方法只是再次调用onDraw方法而已。

Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().

如下面的代码所示。这样的话,就不必担心主UI线程被堵塞了。

[java] view plaincopyprint?
  1. /*
  2. * author: conowen
  3. * e-mail: conowen@hotmail.com
  4. * date  :  2012.8.4
  5. */
  6. package com.conowen.viewtestdemo;
  7. import java.util.Timer;
  8. import java.util.TimerTask;
  9. import android.content.Context;
  10. import android.graphics.Canvas;
  11. import android.graphics.Color;
  12. import android.graphics.Paint;
  13. import android.graphics.RectF;
  14. import android.view.View;
  15. public class MyView extends View {
  16. private int counter;
  17. private boolean isNewThread;
  18. private RectF rectf;
  19. private Paint p;
  20. private Timer timer;
  21. public MyView(Context context) {
  22. super(context);
  23. // TODO Auto-generated constructor stub
  24. isNewThread = true;
  25. rectf = new RectF(100, 50, 400, 350);
  26. p = new Paint();
  27. timer = new Timer();
  28. }
  29. public void newThread() {
  30. timer.schedule(new TimerTask() {
  31. @Override
  32. public void run() {
  33. // TODO Auto-generated method stub
  34. postInvalidate();
  35. }
  36. }, 0, 100);
  37. }
  38. @Override
  39. protected void onDraw(Canvas canvas) {
  40. // TODO Auto-generated method stub
  41. super.onDraw(canvas);
  42. if (isNewThread) {
  43. newThread();
  44. isNewThread = false;
  45. }
  46. // 设定Canvas对象的背景颜色
  47. canvas.drawColor(Color.YELLOW - counter);
  48. // 设置画笔颜色
  49. p.setColor(Color.RED);
  50. // 设置文字大小
  51. p.setTextSize(40);
  52. // 消除锯齿
  53. p.setFlags(Paint.ANTI_ALIAS_FLAG);
  54. // 在canvas上绘制rect
  55. canvas.drawArc(rectf, 0, counter, true, p);
  56. if (counter == 400) {
  57. counter = 0;
  58. }
  59. canvas.drawText("counter = " + (counter++), 500, 200, p);
  60. }
  61. }
  62. http://blog.csdn.net/conowen/article/details/7843487

Android显示系统之View与SurfaceView更新屏幕的区别相关推荐

  1. Android显示系统详解

    一.显示系统的分类: 我们来思考一个问题:从普通用户角度来说,某个APP页面(例如购物APP首页)是怎么被显示到屏幕的? 首先看到的是物理屏幕,然后是屏幕中软件工程师编写的APP页面,也就是手机屏幕驱 ...

  2. 【Android显示系统初探】surface初相识

    Android显示系统非常复杂,从早期版本演化至今有很大的变化和改进,所以从当前的版本直接去查看会很困难. 初学者看到繁多的概念和类会感到无从下手. 这里我们将从实践应用的方式来展开这一系列,试图对A ...

  3. android视频显示,好消息,今天发布1节Android显示系统视频

    原标题:好消息,今天发布1节Android显示系统视频 今天发布1节显示系统视频 第003课第01节_最简单的Surface测试程序 主要内容: 使用C语言编写Surface应用程序,忽略java复杂 ...

  4. android vsync,Android 显示系统:Vsync机制

    一.Vsync简介: 屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),从上到下(屏幕刷新,垂直刷新,Vertical Scanning).当整个屏幕刷新完毕 ...

  5. 【Android 应用开发】View 与 SurfaceView 区别

    文章目录 组件刷新所在线程 性能 资源 操作 主动更新与被动更新 View , SurfaceView , GLSurfaceView 组件刷新所在线程 1. View 主线程刷新 UI : View ...

  6. Android显示系统键盘的方法,Android 显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...

  7. imx6q android jni,Android 显示系统:飞思卡尔平台图形界面与GPU硬件加速

    图形是Android平台中的一个大主题,包含java/jni图形框架和2d/3d图形引擎(skia.OpenGL-ES.renderscript). 本文档描述了飞思卡尔设备上的一般Android图形 ...

  8. hwc android,11.2 Android显示系统框架_android源码禁用hwc和GPU

    2. 修改tiny4412_Android源码禁用hwc和gpu(厂家不会提供hwc和gpu的源代码,没有源代码就没法分析了,因此在这里禁用该功能并用软件库实现) 最终源码: git clone ht ...

  9. 【Android显示系统初探】多屏显示Presentation的使用

    Presentation通过指定displayID来决定显示在哪个屏幕上,这样就实现了多屏幕的显示(如果手机有多个显示设备), 也就让不同的屏幕可以显示不同的画面, 在只有一个显示设备的情况下,我们可 ...

最新文章

  1. 用备份控制文件做不完全恢复下的完全恢复(数据文件备份旧--新建表空间--控制文件备份次新--日志归档文件新)...
  2. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)
  3. Maven-学习笔记06【基础-Maven工程servlet实例】
  4. MAC下MongoDB的安装启动及停止
  5. python地板除与除法的区别_“地板除”还是“取整除”?地板除和天花板除floor division和ceil devision...
  6. go oracle编程,go基础编程(一):第一个go程序-hello word
  7. 8 SD配置-企业结构-分配-给公司代码分配销售组织
  8. 漫谈 Gentoo 中文社区的建设
  9. 【推荐】Zeal 离线API文档浏览器
  10. Java基础学习总结(136)——有关流资源关闭(try-with-resources与AutoCloseable)的使用总结
  11. 计算机网络技术-----==一些东西
  12. C语言学生信息管理系统源代码
  13. 卓有成效的管理者(笔记)——有效的决策
  14. 自己做的一个漫画下载器
  15. 前端框架(混合开发框架)
  16. handler机制,成功跳槽百度工资从15K涨到28K,挥泪整理面经
  17. 大话设计模式 第二十三章 命令模式 考羊肉串
  18. 第一期:【python爬虫】豆瓣电影top250
  19. GIS开发:mapbox gl几种底图的加载
  20. vue/cli4 单元测试与覆盖率体系搭建

热门文章

  1. 修改CentOS 7.2系统的主机名
  2. 毕加索发布轻量化转化引擎及BIMSOP协作云平台
  3. Linux和Windows路由配置
  4. Eclipse svn代码提交冲突
  5. shell 排序函数
  6. UA MATH563 概率论的数学基础 中心极限定理24 随机变量的特征函数
  7. UA MATH523A 实分析3 积分理论例题 一个测度与积分的综合计算题
  8. javascript 窗口加载事件相关问题
  9. MFC最小程序(不使用应用程序向导)
  10. Oracle Dump 分析学习总结