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

企鹅博客
企鹅博客
企鹅博客
29824
文章
0
评论
2020年9月15日14:44:16 评论 14 views 3428字阅读11分25秒

1、View

View

extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource

java.lang.Object
   ↳Android.view.View
Android显示系统之View与SurfaceView更新屏幕的区别Known Direct Subclasses(直接子类,SurfaceView是View的子类) AnalogClock, ImageView, KeyboardView, MediaRouteButton, ProgressBar, Space, SurfaceView, TextView, TextureView, ViewGroup, ViewStub
Android显示系统之View与SurfaceView更新屏幕的区别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://www.linuxidc.com/Linux/2012-08/67619.htm

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

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

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

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

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

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

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

4、Demo程序

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

效果图:

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

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

  1. synchronized (this) {  
  2.             try {  
  3.                 wait(10 * 1000);  
  4.             } catch (InterruptedException e) {  
  5.                 // TODO Auto-generated catch block   
  6.                 e.printStackTrace();  
  7.             }  
  8.         }  
继续阅读
weinxin
欢迎加入中国站长博客之家
本站的所有资源都会上传分享到博客之家,希望大家互相学习交流进步。
Struts处理自定义异常 Linux编程

Struts处理自定义异常

很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指...
使用JPA和Hibernate进行批量处理的最佳方式 Linux编程

使用JPA和Hibernate进行批量处理的最佳方式

在本文中,你将了解什么是批处理,为什么要使用它,以及如何在JPA和Hibernate中正确使用它。 批处理 在编写企业应用程序时,通常将工作分配在服务于典型OLTP(在线事务处理)传输的前端系统,和一...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: