在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View。
ImageView
1 | mImageView.setBackgroundResource(R.mipmap.taylor); |
SurfaceView
提供一个专注于绘制的,内嵌于view层的 surface。你可以控制这个surface的格式、尺寸。 SurfaceView 关心 surface是否显示在屏幕上的正确位置。
surface 在 Z轴是有序的,所以它是在拥有 SurfaceView的后面;就像是 SurfaceView在它的窗口上面一拳打了个洞,从而使 surface显示出来。视图层次结构将负责正确地合成Surface的通常出现在其上的任何同胞兄弟。这可用于在Surface上放置诸如按钮之类的叠加层,但请注意,它可能会影响性能,因为每次Surface变化时都会执行完整的alpha混合组合。
使 surface显示的透明区域是基于在视图层的布局位置。如果使用布局后转换属性在SurfaceView顶部绘制同级视图,则视图可能无法与表面正确合成。
通过SurfaceHolder接口提供对底层 surface的访问,可以通过调用 getHolder()
来得到SurfaceHolder。
当SurfaceView的窗口可见时,将为您创建Surface ; 您应该实现 surfaceCreated(SurfaceHolder)
和 surfaceDestroyed(SurfaceHolder)
来发现当窗口被显示和隐藏时Surface何时被创建和销毁。
这个类的目的之一是提供一个在辅助线程可以渲染到屏幕中的 surface。如果你要这样使用它,你需要知道一些线程语义:
- 所有SurfaceView和
SurfaceHolder.Callback
方法都将从运行SurfaceView窗口的线程(通常是应用程序的主线程)中调用。因此它们需要与绘图线程所触及的任何状态正确同步。 - 您必须确保绘图线程只在有效时触及底层Surface - 介于
SurfaceHolder.Callback.surfaceCreated()
和SurfaceHolder.Callback.surfaceDestroyed()
之间。
注意:从平台版本开N开始,SurfaceView的窗口位置将与其他视图渲染同步更新。这意味着在屏幕上平移和缩放SurfaceView不会导致渲染失真。当其窗口异步定位时,此类问题可能会出现在以前版本的平台上。
1 | mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { |
自定义 View
1 | public class CustomView extends View { |
demo在github上的地址
Thanks