SurfaceView部分译

SurfaceView


一、简述

The SurfaceView is a special subclass of View that
offers a dedicated drawing surface within the View hierarchy. The aim is to
offer this drawing surface to an application‘s secondary thread, so that the
application isn‘t required to wait until the system‘s View hierarchy is ready to
draw. Instead, a secondary thread that has reference to a SurfaceView can draw
to its own Canvas at its own pace.

二、使用步骤


准备工作:

1.定义一个类继承SurfaceView,并实现SurfaceHolder.CallBack接口。

2.通过SurfaceHolder来操作SurfaceView。这个holder可以通过在SurfaceView初始化时的getHolder()方法获得。

3.为SurfaceHolder添加回调接口实现类的对象。addCallBack()。

在SurfaceView的状态(当underlying surface is create ,changed ,or
destroyed)改变时,SurfaceHolder会通过CallBack的实现类的方法进行操作。

画图:

1.获得在次线程画画的Canvas。可通过surfaceHolder.lockCanvas()获得。(holder给予你这个画布)

2.在canvas上画画。可以调用canvas自带的一些画画方法

3.解除画布锁定并提交画布,这时候系统才真正实施画画。surfaceHolder.unlockCanvasAndPost(canvas)。

说明:a.每一次画画都是surfaceHolder.lockCanvas和unlockCanvasAndPost(canvas)成对出现。中间画画的内容是缓冲起来的,知道最后才提交画画。

    
b.每次画画都是在原先的canvas的基础上画画。不会自动清除canvas。适当时候,可以通过填充canvas颜色drawColor()或者设置背景图片drawBitmap()的方式clear
清除canvas内容(覆盖)

更多画画内容,参照http://developer.android.com/guide/topics/graphics/2d-graphics.html

下面是官方文档英文解释(中文部分是个人翻译的)

Class Overview



Provides a dedicated drawing surface embedded
inside of a view hierarchy. You can control the format of this surface and, if
you like, its size; the SurfaceView takes care of placing the surface at the
correct location on the screen

提供一个在view的层级下专注于画画的的surface(Handle
onto a raw buffer that is being managed by the screen compositor屏幕排版器所管理的”原生缓存“
的操作“句柄”)。你可以控制这个surface的格式,包括它的大小。SurfaceView负责将surface放在屏幕上正确的位置上。

The surface is Z ordered so that it is behind
the window holding its SurfaceView; the SurfaceView punches a hole in its window
to allow its surface to be displayed. The view hierarchy will take care of
correctly compositing with the Surface any siblings of the SurfaceView that
would normally appear on top of it. This can be used to place overlays such as
buttons on top of the Surface, though note however that it can have an impact on
performance since a full alpha-blended composite will be performed each time the
Surface changes.

这个surface在Z方向上有空间顺序(请详见数学三位坐标系),它位于hold它的SurfaceView的window后面。这个SurfaceView从hold住它的window中打了个洞,以至于它的surface内容得以显示。这个view的层级制将会负责正确的合成surface。任何SurfaceView的兄弟姐妹(组件)通常将会显示在它的上方。这个特性可以用来放置表面上层的覆盖层,例如Surface上面的button。值得注意的是,每一次这个Surface的改变都会执行alpha混合的合成操作。

The transparent region that makes the surface
visible is based on the layout positions in the view hierarchy. If the
post-layout transform properties are used to draw a sibling view on top of the
SurfaceView, the view may not be properly composited with the surface.

让这个surface可见的透明区域根据layout的层级位置而定。如果后面一层的变化属性被用来在改SurfaceView上方画一个兄弟view,这个view或许不会用这个surface来一起合理的合成。

Access to the underlying surface is provided
via the SurfaceHolder interface, which can be retrieved by calling getHolder().

对下层的surface的操作是通过SurfaceHolder的接口来实现的。SurfaceHolder可以通过getHolder()方法来得到。

The Surface will be created for you while the
SurfaceView‘s window is visible; you should implement surfaceCreated(SurfaceHolder) andsurfaceDestroyed(SurfaceHolder) to discover when the Surface is
created and destroyed as the window is shown and hidden.

当hold
该SurfaceView的window可见的时候,这个Surface将会被创建。你应该通过实现surfaceCreate(SurfaceHolder)和surfaceDestroyed(SurfaceHolder)方法去发现,随着窗口显示和隐藏,这个Surface被create和destroyed。

One of the purposes of this class is to provide
a surface in which a secondary thread can render into the screen. If you are
going to use it this way, you need to be aware of some threading semantics:

这个SurfaceView类的一个目的是提供一个surface。通过这个surface,使用次要的线程去操作屏幕。如果你打算用这个方式使用它,你需要知道一些线程的语义。

  • All SurfaceView and SurfaceHolder.Callback methods will be called from the
    thread running the SurfaceView‘s window (typically the main thread of the
    application). They thus need to correctly synchronize with any state that is
    also touched by the drawing thread.

  • 所有的SurfaceView和SurfaceHolder.Callback方法将会被运行该Surfaceview‘的window的线程调用。

  • You must ensure that the drawing thread only
    touches the underlying Surface while it is valid -- between SurfaceHolder.Callback.surfaceCreated() andSurfaceHolder.Callback.surfaceDestroyed().

  • 你必须保证drawing线程仅当下层的Surface有效时才接触那个surface,也即Surface在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()这两个方法间操作Surface.

时间: 2024-10-29 00:35:50

SurfaceView部分译的相关文章

基于android平台的模拟血压计实现(surfaceView的熟练使用)

这个是我根据上一篇文章的温度计改的血压计,因为客户对温度计还有血压计的需求是一样的,所以,我就选择了偷懒,直接用温度计的代码改了一概,就成了血压计的了 1 package com.example.test; 2 3 4 5 import android.content.Context; 6 import android.graphics.Bitmap; 7 import android.graphics.Canvas; 8 import android.graphics.Color; 9 imp

能够在子线程绘画的View SurfaceView

转载请注明出处:王亟亟的大牛之路 近期两天都没有写文章,一方面是自己在看书.一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好Gradle我也是无语了(FQ也没用).准备今天背着笔记本 回家搞.真是服了.. 抱怨的话不说了,来看下这一篇要讲的主角 SurfaceView,关于SurfaceView的文章事实上在别的一些网站上也有,由于我之前没写过,所以也就一直没整这部分的内容(别人写的好坏反正找好的点自己吸收吧,嘿嘿) 问题:Surf

译:SOS_SCHEDULER_YIELD类型等待在虚拟机环境中的增多

原文出处:Increased SOS_SCHEDULER_YIELD waits on virtual machines 注: 原文的用词是Increased,想译作增强(增长),或者加强,这么译起来是褒义词,而原文要表达的Increased并没有褒义的含义,最起码是一个中性的含义,想来想起用一个“滋长”偏编译的含义还是比较合适的,感觉还是有点过于贬义了,还是用最通俗的增多吧.个人英语水平有限,另外就是对于文中提到的“rdtsc周期”也不是非常清楚,翻译的也不是很清楚,权当是自娱自乐.总是原文的

《100种过度医疗大公开》:转译自日文版,日文版依据的是美国的“Choosing Wisely”项目。三星推荐

本书转译自日文,日文版则是在美国的“Choosing Wisely”项目中选择了100个相对常见的过度医疗项目做解说.Choosing Wisely项目,是由美国多个专业医学组织发起的列出过度医疗项目的活动. 日文作者是兽医专业的新闻记者,中文译者不是医学专业人员,个别专业词语翻译有误,“随机对照试验”翻译成“随机比较试验”了,有些句子翻译的也比较别扭.基于以上两点,这本书的权威性可信度我认为都不算太高,只能给三星.感兴趣的话还是应该直接上网看英文原版. 以下是书中部分信息的摘抄: 1:以美国内

Android自定义组件系列【12】——非UI线程绘图SurfaceView

一.SurfaceView的介绍 在前面我们已经会自定义View,使用canvas绘图,但是View的绘图机制存在一些缺陷. 1.View缺乏双缓冲机制. 2.程序必须重绘整个View上显示的图片,比较耗资源. 3.非UI线程无法更新View组件,所以会占用主线程资源,当需要在主线程中处理逻辑的时候会很慢. 在Android中为我们提供了一个SurfaceView来替代View实现绘制图形,一般在游戏绘图方面应用较广,所以如果是比较复杂的绘图建议使用SurfaceView. 二.SurfaceV

博译有道——关于外文书籍的翻译

有人说,中国古代曾经被人津津乐道的诸如木流牛马之类的工匠发明和创造之所以没有被后人所重现,是因为创作者只知其术,不懂传道.在门户之见成风,传道授艺大多通过手把手教.口口相传的古代,可想而知像<本草纲目>这样的著作的重要性.同样在今天,无论是原创,还是转载,通过互联网广泛传播碎片化知识的同时,作为系统性的.汇总性的书籍显得颇为难能可贵,即便是将一本国外早已出版的书籍引入到国内出版. 经过长达六个月的付出和守候,由IDF实验室成员翻译.机械工业出版社出版的<Hacking with Kali

[email&#160;protected]一个高效的配置管理工具--Ansible configure management--翻译(六)

无书面许可请勿转载 高级playbook Finding files with variables All modules can take variables as part of their arguments by dereferencing them with {{ and }} . You can use this to load a particular file based on a variable. For example, you might want to select a

Android中使用SurfaceView+MediaPlayer+自定义的MediaController实现自定义的视屏播放器

效果图如下: (PS本来是要给大家穿gif动态图的,无奈太大了,没法上传) 功能实现:暂停,播放,快进,快退,全屏,退出全屏,等基本功能 实现的思路: 在主布局中放置一个SurfaceView,在SurfaceView中放置一个MediaPlayer ,在其下方自定义一个MediaController,不过也不能称之为MediaController,使用的是PupupWindow来实现的,在PupupWindow布局中放置几个textView,Button,最重要的使我们的SeekBar控件,创

SurfaceView的基本使用

一.引入: Android提供了View来进行绘图处理,在大部分情况下,View都能满足绘图需求.大家都知道View是通过刷新来重绘视图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新的间隔时间为16ms.如果在16ms内View完成了你所需要执行的所有操作,那么用户在视觉上,就不会产生卡顿的感觉:反之,如果操作的逻辑过多时,就会掉帧从而使得用户感觉到卡顿.特别的需要频繁刷新的界面上,如游戏(60FPS以上),就会不断阻塞主线程,从而导致界面卡顿.而Android提供了Surfa