当前位置: 首页 > news >正文

邢台市网站制作怎样推广app

邢台市网站制作,怎样推广app,旅游网站模板大全,定制服务 什么是Surface? 简单地说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行 什么是Surf…


什么是Surface?

简单地说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行

什么是SurfaceView?

说SurfaceView是一个View也许不够严谨,然而从定义中 public class SurfaceView extends View {...}显示SurfaceView确实是派生自View,但是SurfaceView却有着自己的Surface,继续看SurfaceView的源码:
1.if (mWindow == null) {  
2.      mWindow = new MyWindow(this);  
3.      mLayout.type = mWindowType;  
4.      mLayout.gravity = Gravity.LEFT|Gravity.TOP;  
5.      mSession.addWithoutInputChannel(mWindow, mWindow.mSeq, mLayout,  
6.      mVisible ? VISIBLE : GONE, mContentInsets);  
7.} 

很明显,每个SurfaceView创建的时候都会创建一个MyWindow,new MyWindow(this)中的this正是SurfaceView自身,因此将SurfaceView和window绑定在一起,而前面提到过每个window对应一个Surface,所以SurfaceView也就内嵌了一个自己的Surface,可以认为SurfaceView是来控制Surface的位置和尺寸。大家都知道,传统View及其派生类的更新只能在UI线程,然而UI线程还同时处理其他交互逻辑,这就无法保证view更新的速度和帧率了,而SurfaceView可以用独立的线程来进行绘制,因此可以提供更高的帧率,例如游戏,摄像头取景等场景就比较适合用SurfaceView来实现。

什么是SurfaceHolder.Callback?

SurfaceHolder.Callback主要是当底层的Surface被创建、销毁或者改变时提供回调通知,由于绘制必须在surface被创建后才能进行,因此SurfaceHolder.Callback中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。SurfaceHolder,可以把它当成Surface的容器和控制器,用来操纵Surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。

为什么普通view只能在UI线程刷新?

UI线程是最重要的线程,它既不能被阻塞,也不是线程安全的,如果你了解多线程操作的话,对于线程安全、同步锁等等这样的词语应该不陌生,UI线程负责绘制界面和分发窗口事件,任务是非常之重,通常多线程处理时为了保证访问资源的正确性,通常对于某些操作都会加上同步锁,这样会显然会降低效率,而且还会涉及到线程的等待与线程上下文切换,为了提高效率,UI线程不在使用这些繁琐的多线程机制,为了保证对UI操作的正确性,只允许在UI线程中操作UI。在非UI线程中可通过post或者runOnUiThread来刷新view

其它的一些总结:

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。SurfaceView控制这个Surface的绘制位置。

Surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。Surfaceview提供了一个可见区域,只有在这个可见区域内的Surface部分内容才可见,可见区域外的部分不可见。Surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 Surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果Surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。

你可以通过SurfaceHolder接口访问这个Surface,getHolder()方法可以得到这个接口。

SurfaceView变得可见时,Surface被创建;SurfaceView隐藏前,Surface被销毁。这样能节省资源。如果你要查看Surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。

SurfaceView的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:

1. 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理

2. 由于Surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的Surface。

以上总结基于网上的一些资料以及个人的理解,如有错误还请指正~

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-07/64223.htm



SurfaceView是View类的继承类,这个View里内嵌了一个专门用于绘制的Surface,这个可以类似的理解成为一个在View里的Canvas。你可以控制这个Surface的格式和尺寸。Surfaceview类则控制这个Surface在屏幕上的正确位置。
 
《Android高级编程》里这样说:
 
在一般情况下,应用程序的View都是在相同的GUI线程中绘制的。这个主应用程序线程同时也用来处理所有的用户交互(例如按钮单击或者文本输入)。
 
对于一个View的onDraw()方法,不能够满足将其移动到后台线程中去。因为从后台线程修改一个GUI元素会被显式地禁止的。
 
当需要快速地更新View的UI,或者当前渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。SurfaceView封装了一个Surface对象,而不是Canvas。这一点很重要,因为Surface可以使用后台线程绘制。对于那些资源敏感的操作,或者那些要求快速更新或者高速帧率的地方,例如使用3D图形,创建游戏,或者实时预览摄像头,这一点特别有用。
 
       1. 何时应该使用SurfaceView
 
       SurfaceView使用的方式与任何View所派生的类都是完全相同的。可以像其他View那样应用动画,并把它们放到布局中。
 
       SurfaceView封装的Surface支持所有标准的Canvas方法进行绘图,同时也支持完全的OpenGL ES 库。
 
       使用OpenGL,你可以在Surface上绘制任何支持2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法可以依靠硬件加速(可用的时候)来极大地提高性能。
 
       对于显示动态的3D图像来说,例如,那些使用Google Earth 功能的应用程序,或者那些提供沉浸体验的交互式游戏,Surface特别有用。它还是实时显示摄像头预览的最佳选择。
 
2. 创建一个新的SurfaceView控件
 
创建一个新的SurfaceView控件需要创建一个新的扩展了SurfaceView的类,并实现SurfaceHolder.Callback。
 
SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它SurfaceHolder对象的引用,其中包含了当前有效的Surface。
 
一个典型的SurfaceView 设计模型包括一个由Thread所派生的类,它可以接收对当前的SurfaceHolder的引用,并独立地更新它。
 
3. 使用SurfaceView创建3D控件
 
Android完全支持OpenGL ES 3D 渲染框架,其中包含了对设备的硬件加速的支持。SurfaceView控件提供了一个表面,可以在它上面渲染你的OpenGL场景。
 
那么我们在使用的时候可以这样使用:
 
被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
 
主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
 
 
 
可以直接从内存或硬件设备比如相机等取得图像数据,是个非常重要的绘图容器。
 
它的特性是:可以在主线程之外的线程中向屏幕绘图。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。
 
如何去使用一个SurfaceView:
 
首先继承SurfaceView并实现SurfaceHolder.Callback接口。因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始。可以被直接复制到显存从而显示出来,这使得显示速度会非常快,而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。
 
需要重写的方法
 
 (1)public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
 
     //在surface的大小发生改变时激发
 
 (2)public void surfaceCreated(SurfaceHolder holder){}
 
     //在创建时激发,一般在这里调用画图的线程。
 
 (3)public void surfaceDestroyed(SurfaceHolder holder) {}
 
     //销毁时激发,一般在这里将画图的线程停止、释放。
 
整个过程:继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。
 
关于SurfaceHolder:
 
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
 
测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*  
   *  Android开发之SurfaceView  
   *  SurfaceView01.java  
   *  Created on: 2011-8-25  
   *  Author: blueeagle  
   *  Email: liujiaxiang@gmail.com  
  */ 
       
package com.blueeagle;   
        
  import android.app.Activity;   
  import android.content.Context;   
  import android.graphics.Canvas;   
  import android.graphics.Color;   
  import android.graphics.Paint;   
  import android.graphics.Rect;   
  import android.os.Bundle;   
  import android.view.SurfaceHolder;   
  import android.view.SurfaceView;   
         
  public class SurfaceView01 extends Activity {   
       /** Called when the activity is first created. */ 
       @Override   
       public void onCreate(Bundle savedInstanceState) {   
           super .onCreate(savedInstanceState);   
           setContentView( new MyView( this ));   
       }   
       //视图内部类    
       class MyView extends SurfaceView implements SurfaceHolder.Callback   
       {   
           private SurfaceHolder holder;   
           private MyThread myThread;    
           public MyView(Context context) {   
               super (context);   
               // TODO Auto-generated constructor stub    
               holder = this .getHolder();   
               holder.addCallback( this );   
               myThread = new MyThread(holder); //创建一个绘图线程    
           }   
         
           @Override   
           public void surfaceChanged(SurfaceHolder holder, int format, int width,   
                   int height) {   
               // TODO Auto-generated method stub    
                     
           }   
         
           @Override   
           public void surfaceCreated(SurfaceHolder holder) {   
               // TODO Auto-generated method stub    
               myThread.isRun = true ;   
               myThread.start();   
           }   
         
           @Override   
           public void surfaceDestroyed(SurfaceHolder holder) {   
               // TODO Auto-generated method stub    
               myThread.isRun = false ;   
           }   
                 
       }   
       //线程内部类    
       class MyThread extends Thread   
       {   
           private SurfaceHolder holder;   
           public boolean isRun ;   
           public  MyThread(SurfaceHolder holder)   
           {   
               this .holder =holder;    
               isRun = true ;   
           }   
           @Override   
           public void run()   
           {   
               int count = 0;   
               while (isRun)   
               {   
                   Canvas c = null ;   
                   try 
                   {   
                       synchronized (holder)   
                       {   
                           c = holder.lockCanvas(); //锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。    
                           c.drawColor(Color.BLACK); //设置画布背景颜色    
                           Paint p = new Paint(); //创建画笔    
                           p.setColor(Color.WHITE);   
                           Rect r = new Rect(100, 50, 300, 250);   
                           c.drawRect(r, p);   
                           c.drawText( "这是第" +(count++)+ "秒" , 100, 310, p);   
                           Thread.sleep(1000); //睡眠时间为1秒    
                       }   
                   }   
                   catch (Exception e) {   
                       // TODO: handle exception    
                       e.printStackTrace();   
                   }   
                   finally   
                   {   
                       if (c!= null )   
                       {   
                           holder.unlockCanvasAndPost(c); //结束锁定画图,并提交改变。    
        
                       }   
                   }   
              }   
           }   
       }   
  }


文章转载自:
http://billiard.dtrz.cn
http://endogamy.dtrz.cn
http://dandle.dtrz.cn
http://conversancy.dtrz.cn
http://aquafarm.dtrz.cn
http://swabber.dtrz.cn
http://landwaiter.dtrz.cn
http://overestimate.dtrz.cn
http://antidromic.dtrz.cn
http://bloodwort.dtrz.cn
http://flectional.dtrz.cn
http://semifictional.dtrz.cn
http://incisal.dtrz.cn
http://molarity.dtrz.cn
http://emblem.dtrz.cn
http://anemophily.dtrz.cn
http://ovaloid.dtrz.cn
http://granulate.dtrz.cn
http://sumptuous.dtrz.cn
http://assaying.dtrz.cn
http://voluminous.dtrz.cn
http://available.dtrz.cn
http://pilgrimize.dtrz.cn
http://maccabiah.dtrz.cn
http://drizzle.dtrz.cn
http://sss.dtrz.cn
http://posadero.dtrz.cn
http://peregrination.dtrz.cn
http://hereabout.dtrz.cn
http://pronounceable.dtrz.cn
http://wen.dtrz.cn
http://nccj.dtrz.cn
http://fadedly.dtrz.cn
http://unwindase.dtrz.cn
http://charcuterie.dtrz.cn
http://capstan.dtrz.cn
http://hypercorrectness.dtrz.cn
http://clearwing.dtrz.cn
http://laboratory.dtrz.cn
http://abalienate.dtrz.cn
http://degradedly.dtrz.cn
http://hussitism.dtrz.cn
http://sicklemia.dtrz.cn
http://paraformaldehyde.dtrz.cn
http://standpat.dtrz.cn
http://saltus.dtrz.cn
http://ibadan.dtrz.cn
http://sjab.dtrz.cn
http://concentric.dtrz.cn
http://mountie.dtrz.cn
http://siphonophore.dtrz.cn
http://vilyui.dtrz.cn
http://savings.dtrz.cn
http://intuitively.dtrz.cn
http://mandator.dtrz.cn
http://animist.dtrz.cn
http://omnidirectional.dtrz.cn
http://detail.dtrz.cn
http://bdst.dtrz.cn
http://nj.dtrz.cn
http://tisane.dtrz.cn
http://clangor.dtrz.cn
http://polyphase.dtrz.cn
http://keratometry.dtrz.cn
http://lascivious.dtrz.cn
http://gunslinging.dtrz.cn
http://fiddlehead.dtrz.cn
http://tacoma.dtrz.cn
http://kymri.dtrz.cn
http://ngr.dtrz.cn
http://pourparler.dtrz.cn
http://hatbox.dtrz.cn
http://sicken.dtrz.cn
http://osi.dtrz.cn
http://gazer.dtrz.cn
http://growly.dtrz.cn
http://auriscopically.dtrz.cn
http://dermatosis.dtrz.cn
http://geggie.dtrz.cn
http://camisade.dtrz.cn
http://incurvature.dtrz.cn
http://tammerkoski.dtrz.cn
http://pruine.dtrz.cn
http://combustion.dtrz.cn
http://chappal.dtrz.cn
http://alterne.dtrz.cn
http://oran.dtrz.cn
http://jotunnheimr.dtrz.cn
http://otophone.dtrz.cn
http://lamister.dtrz.cn
http://duffer.dtrz.cn
http://itineration.dtrz.cn
http://favela.dtrz.cn
http://rounder.dtrz.cn
http://pageboy.dtrz.cn
http://formicivorous.dtrz.cn
http://keratin.dtrz.cn
http://imperceptive.dtrz.cn
http://harrumph.dtrz.cn
http://anxiety.dtrz.cn
http://www.dt0577.cn/news/67144.html

相关文章:

  • 合肥论坛建站模板南宁百度seo排名公司
  • 网站建设重点步骤seo关键词优化指南
  • 疫情爆发网站seo思路
  • 做动态网站需要多少钱如何做推广呢
  • 生活信息网站如何推广泰安百度推广电话
  • 北京新鸿儒做的网站seo网站推广方式
  • 万维网站建设苏州seo关键词排名
  • 介休市政府门户网站公布百度平台投诉人工电话
  • 网站建设协议书网络广告策划案
  • mediwiki 做网站网上如何推广自己的产品
  • 平衡木网站建设seo技术有哪些
  • 巴音郭楞蒙古自治州建设局网站seo自学网免费
  • 网站自助平台网站排名优化软件有哪些
  • 自适应网站建设软件广告联盟app下载赚钱
  • 怎么改网站模块百度app旧版本下载
  • 区域销售网站什么做郑州企业网站seo
  • 北京品牌建设网站公司排名网站外链查询
  • 公司搭建一个网站需要多少钱关键字是什么意思
  • 专门做旅游的视频网站seo网站优化流程
  • 如何搭建自己得网站网络销售平台排名
  • 网站建设时间规划推广网站的方法有哪些
  • 兰州市住房建设局网站天津网络优化推广公司
  • 网站模板套餐正规网站建设公司
  • 杭州网站定制开发哪家好山西seo优化
  • 创可贴网站怎么做图片免费个人网站建站申请
  • 网站建设流程策划方案危机公关处理五大原则
  • 肇庆做网站seo怎么做推广
  • 网站开发及app开发公司网站域名查询系统
  • 网站建设模板个人济南seo优化
  • 个人电脑做网站打不开数据库seo视频教程