Android Surfaceview的绘制与应用
一.surfaceview与view的区别
Android 提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足。我们知道,view通过刷新来绘制视图。android系统通过vsync信号来进行屏幕的绘制。刷新的时间间隔为16毫秒。如果在16毫秒内完成了索要刷新的绘制操作,那么在视觉效果上就不会产生卡顿的感觉。如果逻辑操作过多,频繁刷新就会造成界面的卡顿。
对于这一问题,Android提供了surfaceview来解决。它可以说是view的孪生兄弟,但他与view还是不同的,他与view的区别主要在一下几点:
view 主要是用于主动更新的情况下,而surfaceview主要是用于被动更新的情况下,列如频繁的刷新。
view主要是通过主线程对界面进行刷新,而surfaceview主要是通过子线程对view进行刷新。
view在绘制时没有使用双缓冲机制,而surfaceview的底层是使用了双缓冲机制。
二.surfaceview的使用
surfaceview虽然使用比较复杂,但是他有一套使用的模板,这就使得他使用起来比较简单了,通常情况下,我们将会使用如下的方法步骤来实现surfaceview的创建:
创建自定义的surfaceview,继承自surfaceview 。并实现连个接口surfaceholder.Callback和Runnable接口。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable
看如下方法,分别对应了surfaceview的创建改变和销毁。
@Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { }
我们来看看他的模板:
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { private SurfaceHolder mHolder; private Canvas mCanvs; private Boolean mIsDrawing; public MySurfaceView(Context context) { this(context, null); } public MySurfaceView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { mHolder = getHolder(); mHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); } @Override public void surfaceCreated(SurfaceHolder holder) { mIsDrawing = true; new Thread(this).start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsDrawing = false; } @Override public void run() { while (mIsDrawing) { draw(); } } public void draw() { try { mCanvs = mHolder.lockCanvas(); } catch (Exception e) { } finally { mHolder.unlockCanvasAndPost(mCanvs); } } }
以上的模板基本满足大部分surfaceview的绘图需求,唯一要注意的是,要把
mHolder.unlockCanvasAndPost(mCanvs);
放到finally中以保证每次都能提交修改。
只要我们在run方法中不断的绘制就可以实现view的及时刷新,当然我们也可以在run方法中sleep减少资源的消耗。这个值一般在50到100毫秒之间。
以上就是Android Surfaceview的绘制与应用的详细介绍,关于Android View的重写本站很多资料大家可以按需要查询,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
问题内容: 我正在尝试将一些 非常简单的 图形绘制成a,但是我无法使其正常工作。没有例外,但我也看不到任何结果。 更确切地说,我正在尝试创建一个并用单一颜色填充它。 这是我的代码: 不出所料,我得到了 Drawing … 输出两次。 有人可以建议为什么我可能无法提取吗? 问题答案: 我删除了代理类,并将其全部移至我的活动中。现在正在工作。固定代码如下:
本文向大家介绍解决Android SurfaceView绘制触摸轨迹闪烁问题的方法,包括了解决Android SurfaceView绘制触摸轨迹闪烁问题的方法的使用技巧和注意事项,需要的朋友参考一下 本文分享了解决SurfaceView触摸轨迹闪烁问题的方法,供大家参考,具体内容如下 第一种解决SurfaceView触摸轨迹闪烁问题的方法: 由于SurfaceView使用双缓存机制,两张画布轮流显
我希望在相机顶部放置一个openGL模型(通过GLSurfaceView),它有自己的SurfaceView。当然这一定是可能的,像Layar这样的应用程序可以做到这一点。 以下是我正在尝试的: 现在:只有相机出现了。我在网上读到过关于GLSurfaceView的setzordermeDiagoverlay属性的文章;在上面的代码中设置为TRUE,3D立方体显示为黑色背景(即不显示相机预览)。 参
本文向大家介绍Android View 绘制机制的详解,包括了Android View 绘制机制的详解的使用技巧和注意事项,需要的朋友参考一下 View 绘制机制一、 View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树的绘图流程在V
下面的问题有人给我提示吗? 我想画一个填充的路径(画布),其中有一个洞。在SVG中,路径定义如下:
我为不同的密度创建了res可绘制目录,但应用程序总是使用最低密度。我创建了可绘制的mdpi、可绘制的hdpi、可绘制的xhdpi和可绘制的xxhdpi,但在我的手机中使用了使用mdpi的xxhdpi应用程序,如果我删除了mdpi,则使用hdpi等删除应用程序。