`
java-mans
  • 浏览: 11416556 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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


1、View


View

extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource
java.lang.Object
android.view.View
Known Direct Subclasses(直接子类,SurfaceView是View的子类)
Known Indirect Subclasses(间接子类)

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程序

/*
 * 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
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
/*		synchronized (this) {
			try {
				wait(10 * 1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.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上绘制rect
		canvas.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秒以上)就会出现如下的图。

synchronized (this) {
			try {
				wait(10 * 1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.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线程被堵塞了。

/*
* author: conowen
* e-mail: conowen@hotmail.com
* date : 2012.8.4
*/
package com.conowen.viewtestdemo;

import java.util.Timer;
import java.util.TimerTask;

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;
 private boolean isNewThread;
 private RectF rectf;
 private Paint p;
 private Timer timer;

 public MyView(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
  isNewThread = true;
  rectf = new RectF(100, 50, 400, 350);
  p = new Paint();
  timer = new Timer();
 }

 public void newThread() {

  timer.schedule(new TimerTask() {

   @Override
   public void run() {
    // TODO Auto-generated method stub
    postInvalidate();
    
   }
  }, 0, 100);

 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  if (isNewThread) {
   newThread();
   isNewThread = false;
  }
  // 设定Canvas对象的背景颜色
  canvas.drawColor(Color.YELLOW - counter);

  // 设置画笔颜色
  p.setColor(Color.RED);
  // 设置文字大小
  p.setTextSize(40);
  // 消除锯齿
  p.setFlags(Paint.ANTI_ALIAS_FLAG);

  // 在canvas上绘制rect
  canvas.drawArc(rectf, 0, counter, true, p);
  if (counter == 400) {
   counter = 0;
  }

  canvas.drawText("counter = " + (counter++), 500, 200, p);

 }

}





分享到:
评论

相关推荐

    Android中TextureView与SurfaceView用法区别总结

    SurfaceView和TextureView均继承于android.view.View 与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能。 一、SurfaceView专门提供了嵌入视图层级的绘制界面,开发者...

    android视频播放器SurfaceView

    一个播放本地视频的播放器,可供使用和学习。 实现功能: 1、搜索制定目录下的本地视频,并显示缩略图及视频名称在列表上;...3、包括进度条,播放和暂停...SurfaceView + MediaPlayer,RecycleView,FloatingActionButton

    Android Surfaceview的绘制与应用

    一.surfaceview与view的区别 Android 提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足。我们知道,view通过刷新来绘制视图。android系统通过vsync信号来进行屏幕的绘制。刷新...

    Android SurfaceView

    SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高...

    android群雄传

    第1章 Android体系与系统架构 1 1.1 Google生态系统 2 1.2 Android系统架构 2 1.2.1 Linux 3 1.2.2 Dalvik与ART 3 1.2.3 Framework 3 1.2.4 Standard libraries 4 1.2.5 Application 4 1.3 Android App组件...

    android开发揭秘PDF

    1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 Android开发准备工作 2.2 开发包及其工具的安装和 配置 2.2.1 安装...

    Android应用源码安卓源码(172个合集).zip

    Android应用源码安卓源码(172个...VIEW双缓冲与SurfaceView比较.zip weibo4andriod-2011-01-14.zip WordPress for Android zirco-browser浏览器源码.rar Zirco-browser:超越海豚的开源浏览器.rar zz-doctor中医大夫助

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    9.5 GPSGoogle地图——LocationListener与MapView实时更新 9.6 移动版GoogleMap——Geocoder反查Address对象 9.7 规划导航路径——DirectionsRoute 9.8 移动设备上的Picasa相册——GooglePicasaAPI 9.9 随身翻译机...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    9.5 GPSGoogle地图——LocationListener与MapView实时更新 9.6 移动版GoogleMap——Geocoder反查Address对象 9.7 规划导航路径——DirectionsRoute 9.8 移动设备上的Picasa相册——GooglePicasaAPI 9.9 随身翻译机...

    《Android应用开发揭秘》源码

     1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android开发环境搭建  2.1 Android开发准备工作  2.2 开发包及其工具的安装和...

    Android应用开发揭秘pdf高清版

    《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    android自定义View之气球碰撞效果

    算法步骤: 1、小球数量ballCount,可以设个最大值,在这个阈值内去随机数 2、小球圆心随机坐标(mX,mY)...6、每个一段时间计算一下小球位置并刷新一下界面,当小球到达屏幕边沿则速度设为当前相反数达到反弹的效果。

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    9.5 GPSGoogle地图——LocationListener与MapView实时更新 9.6 移动版GoogleMap——Geocoder反查Address对象 9.7 规划导航路径——DirectionsRoute 9.8 移动设备上的Picasa相册——GooglePicasaAPI 9.9 随身翻译机...

    Android中SurfaceView用法简单实例

    这里贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置 代码: Activity: package com.view; import android.app.Activity; import android.os.Bundle...

    android源码包集合3

    ImageView 图片循环跑马灯的效果.rar ...VIEW双缓冲与SurfaceView比较.zip weibo4andriod-2011-01-14.zip WIFI 扫描 Demo.zip Zirco-browser:超越海豚的开源浏览器.rar zz-doctor中医大夫助理信息系统(简化版).zip

    Android最新资料以及源码

    共3个目标文件(后台服务实现),Android 手机上用的屏幕保护程序,具备锁屏、屏蔽home、屏蔽返回、屏蔽挂机键等功能,研究新型的Android系统,是手机操作系统的又 一方向。通过这些小而实用的系统开发,帮助你对...

Global site tag (gtag.js) - Google Analytics