View,SurfaceView,SurfaceHolder

View:对于绘画来说,最重要的步骤是重载 onDraw方法并且修改画布Canvas。

SurfaceView:1,You can control the format of this surface and, if you like, its size;

                    2,One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen.

SurfaceView 和 View 的主要区别:

1,SurfaceView 可以在主线程和非主线程中更新UI显示,也就是SurfaceView直接控制最顶层屏幕中可见的Canvas.

   所以SurfaceView适用于系统自动计算的被动更新,而View适用于需要用户互动的主动更新。

  SurfaceHolder 是对SurfaceView对象的控制。比如修改大小,屏幕改变事件等,需要设置SurfaceHolder.Callback接口

 

2,SurfaceView 更新画面的速度较View快,因为SurfaceView的“画布”surface比View的画布canvas更底层。

下面是两个视图的代码对比:

  1 public class MainActivity extends Activity {
  2 
  3     
  4    private Thread mThread =null;
  5    private MogulView mView=null;
  6    private MogulSurfaceView mSurfaceView=null;
  7    private final int MSG_REFRESH_VIEW =0;
  8     @Override
  9     protected void onCreate(Bundle savedInstanceState) {
 10         super.onCreate(savedInstanceState);
 11         //使用surfaceView可以直接在非主线程中更新canvas;
 12         // setContentView(new MogulSurfaceView(this));
 13         
 14         //在非主线程中更新View的时候需要调用到hanler 协助更新View视图
 15         mView =new MogulView(this);
 16         setContentView(mView);
 17         startViewRender();
 18         
 19     }
 20     
 21     //用于协助其他线程更新View中的Canvas
 22     private Handler mHandler =new Handler(){
 23 
 24         @Override
 25         public void handleMessage(Message msg) {
 26             if(msg.what ==MSG_REFRESH_VIEW){
 27                 //to refresh view 
 28                 if(mView !=null)
 29                     mView.invalidate();
 30             }
 31         }
 32         
 33     };
 34     
 35     public void startViewRender(){
 37         mThread =new Thread(new Runnable()
 38         {
 39 
 40             @Override
 41             public void run() {
 42                 while(true){
 43                     try{
 44                         //
 45                         Thread.sleep(1000);
 46                     }
 47                     catch(Exception e){
 48                         
 49                     }
 50                     finally{
 51                         mHandler.sendEmptyMessage(MSG_REFRESH_VIEW);
 52                     }
 53                 }
 54                
 55             }
 56         });
 57         mThread.start();
 58     }
 59     
 60     
 61     class MogulView extends View{
 62         int r =10;
 63         public MogulView(Context context) {
 64             super(context);
 65             // TODO Auto-generated constructor stub
 66         }
 67 
 68         //重载View中的canvas
 69         @Override
 70         protected void onDraw(Canvas canvas) {
 71             super.onDraw(canvas);
 72             if(r<=100)
 73                 r+=10;
 74             else
 75                 r =10;
 76             Paint paint =new Paint();
 77             paint.setColor(Color.RED);
 78             canvas.drawCircle(150, 150, r, paint);
 79         }
 80         
 81         
 82     }
 83     
 84     
 85     class MogulSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
 86 
 87         private SurfaceHolder mSurfaceHolder =null; 
 88         private MogulThread mThread =null;
 89         public MogulSurfaceView(Context context) {
 90             super(context);
 91             mSurfaceHolder =this.getHolder();
 92             mSurfaceHolder.addCallback(this);
 93             mThread =new MogulThread(mSurfaceHolder);
 94           
 95         }
 96 
 97         @Override
 98         public void surfaceCreated(SurfaceHolder holder) {
 99             // TODO Auto-generated method stub
100             mThread.isRun=true;
101             mThread.start();
102         }
103 
104         @Override
105         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
106             // TODO Auto-generated method stub
107             
108         }
109 
110         @Override
111         public void surfaceDestroyed(SurfaceHolder holder) {
112             mThread.isRun=false;
113             mThread.stop();
114         }
115         
116     }
117     class MogulThread extends Thread{
118         private SurfaceHolder mSurfaceHolder =null; 
119         private boolean isRun =false;
120         MogulThread( SurfaceHolder holder){
121             this.mSurfaceHolder=holder;
122             isRun =true;
123         }
124         //直接在非主线程中更新Canvas
125         @Override
126         public void run() {
127             Canvas canvas=null;
128             int count =0;
129             while(true){
130                 try{
131                     
132                     synchronized (mSurfaceHolder) {
133                         canvas =mSurfaceHolder.lockCanvas();
134                         canvas.drawColor(Color.BLACK);
135                         Paint paint=new Paint();
136                         paint.setColor(Color.RED);
137                         Rect rect =new Rect(500,200,250,300);
138                         canvas.drawRect(rect, paint);
139                         canvas.drawText("程序已经运行了:"+count+"秒", 100, 100, paint);
140                         Thread.sleep(1000);
141                         count++;
142                         
143                     }
144                 }
145                 catch(Exception e){
146                     e.printStackTrace();
147                 }
148                 finally{
149                     if(canvas!=null){
150                         mSurfaceHolder.unlockCanvasAndPost(canvas);
151                     }
152                 }
153             }
154         }
155         
156         
157     }
158     
159    
160     
161     
162     
163     
164 }

 

转载于:https://www.cnblogs.com/mogul/archive/2013/03/25/2980670.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xcode 的正确打开方式——Debugging

2019独角兽企业重金招聘Python工程师标准>>> 程序员日常开发中有大量时间都会花费在 debug 上&#xff0c;从事 iOS 开发不可避免地需要使用 Xcode。这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式。 “If debugging is the process of removing…

VS Code 调试 PHP有关配置

一、安装VS CODE 、 WampServer 二、用VS Code 打开php项目后&#xff0c;提示 "Cannot validate since no PHP executable is set. Use the setting php.validate.executablePath to configure the PHP executable." 解决方法如下&#xff1a; 在“文件”-“首选项”…

MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B

目录硬知识比较器B介绍比较器 B 的特点比较器 B 的结构模拟输入部分比较部分基准电压部分低通滤波部分比较器和普通运放的区别比较器B测量电阻原理利用比较器B实现电容触摸按键原理比较器B控制寄存器COMP_B API (机翻)介绍处理初始化和输出的函数参数处理中断的函数参数处理COM…

深入解析kubernetes controller-runtime

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

数据结构练习 00-自测3. 数组元素循环右移问题 (20)

一个数组A中存有N&#xff08;N>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0A1……AN-1&#xff09;变换为&#xff08;AN-M …… AN-1…

MSP432P401R TI Drivers 库函数学习笔记(一)导入工程模板

目录从Resource Explorer中导入从SDK导入测试平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) 从Resource Explorer中导入 本文所用编程平台为Code Composer Studio 10.4.0 启动软件后在Help中打开…

关于SQL Server 数据 出现(可疑)不可用状态的解决办法

当数据库发生这种操作故障时&#xff0c;可以按如下操作步骤可解决此方法&#xff0c;打开数据库里的Sql 查询编辑器窗口&#xff0c;运行以下的命令(注意&#xff1a;dafa为对应可疑的数据库名称&#xff0c;执行时&#xff0c;请改为你的可疑的数据库名称)。 1、修改数据库为…

多核运算

在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch)&#xff0c; GCD的使用非常简单。它把任务分派到不同的queue队列来处理。开发者把任务代码装到一个个block里面&#xff0c;操作系统把这些任务代码分派到不同的资源里去处理&#xff0c;一个简单的例子来说&…

ThreadLocal的简单理解

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

新手学MVC----MVC3.0错误 HTTP 404

MVC3.0框架开发项目&#xff1a; 运行程序的时候遇到的错误&#xff1a;MVC 3.0错误 HTTP 404您正在查找的资源(或者它的一个依赖项)可能已被移除&#xff0c;或 其名称已更改&#xff0c;或暂时不可用。请检查以下 URL 并确保其拼写正确。 错误的原因&#xff1a;路由不正确。…

JMS 在 SpringBoot 中的使用

当前环境 Mac OS 10.11.xdocker 1.12.1JDK 1.8SpringBoot 1.5前言 基于之前一篇“一个故事告诉你什么是消息队列”&#xff0c;了解了消息队列的使用场景以及相关的特性。本文主要讲述消息服务在 JAVA 中的使用。 市面上的有关消息队列的技术选型非常多&#xff0c;如果我们的代…

MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)

目录简介TI-RTOSFreeRTOSPOSIX运行时对象查看器 (Runtime Object Viewer)TI-POSIX 介绍在源代码中使用 POSIXTI-POSIX支持的函数摘要线程函数调用的前后关系线程管理线程属性线程同步障碍属性条件变量条件变量属性互斥锁互斥属性读写锁定读写锁属性辅助函数调用的前后关系时钟消…

arcgis创建postgre企业级数据库

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

[floyd+路径输出]HDU1385 Minimum Transport Cost

题目链接 题目翻译: 有N个城市&#xff0c;然后直接给出这些城市之间的邻接矩阵&#xff0c;矩阵中-1代表那两个城市无道路相连&#xff0c;其他值代表路径长度。 如果一辆汽车经过某个城市&#xff0c;必须要交一定的钱(可能是过路费)。 现在要从a城到b城&#xff0c;花费为路…

MSP432P401R TI Drivers 库函数学习笔记(三)认识任务的创建及图形化配置

目录任务的简单创建图形化配置上手简简单单点个灯配置引脚建立任务实验结果整体代码main.cmyTask.cmyTask.h平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) 任务的简单创建 根据上篇机翻的函数作用…

JavaScript实现自适应宽度的瀑布流

摘要: 主要介绍瀑布流的一种实现方法&#xff1a;绝对定位(css)javascriptajaxjson。简单一点如果不做滚动加载的话就是绝对定位(css)javascript了&#xff0c;ajax和json是滚动加载更多内容的时候用到的。 这样的布局并不陌生&#xff0c;从2011年Pinterest创立以来&#xff0…

.net web 开发平台- 表单设计器 一(web版)

如今为了适应需求的不断变化&#xff0c;动态表单设计器应运而生。它主要是为了满足界面的不断变化和提高开发速度。比如&#xff1a;一些页面客户可能也无法确定页面的终于布局&#xff0c;控件的位置&#xff0c;在哪种情况下显示或不显示等可能须要随时改动。为了应对这些需…

.NET程序配置文件操作(ini,cfg,config)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP432P401R TI Drivers 库函数学习笔记(四)GPIO

目录API头文件函数 (机翻)宏GPIO驱动程序api返回的通用状态代码GPIO_PinConfig输出引脚配置宏GPIO_PinConfig输入引脚配置宏GPIO_PinConfig中断配置宏特殊的GPIO_PinConfig配置宏类型别名示例配置引脚示例配置外部中断示例上机实战配置引脚main.cmyTask.cmyTask.h实验结果平台&…

数据结构 - 红黑树

#!/usr/bin/env python3.3 # -*- coding:utf-8 -*- # Copyright 2013 满足如下红黑性质的二叉查找树&#xff1a; 1&#xff09;节点是红色或黑色 2&#xff09;根是黑色 3&#xff09;所有叶子都是黑色&#xff08;叶子是NIL节点&#xff09; 4&#xff09;每个红色节点的两个…