Android Surfaceview的绘制与应用

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的重写本站很多资料大家可以按需要查询,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例

    本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法.分享给大家供大家参考,具体如下: 定义三角形 OpenGL 允许我们使用三维坐标来定义物体.在绘制三角形前,我们需要定义它各个点的坐标.我们一般使用数组来存储各个顶点的坐标. OpenGL ES 默认 [0,0,0] (X,Y,Z) 在GLSurfaceView的中心,[1,1,0]在右上角,[-1,-1,0]在左下角. 绘制三角形 在绘制三角形之前,我们必须告诉OpenGL我们正在使用

  • 解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

    本文分享了解决SurfaceView触摸轨迹闪烁问题的方法,供大家参考,具体内容如下 第一种解决SurfaceView触摸轨迹闪烁问题的方法: 由于SurfaceView使用双缓存机制,两张画布轮流显示到屏幕上.那么,要存储触摸轨迹并避免两张画布内容不一致造成的闪烁问题,完全可以利用保存绘制过程并不断重新绘制的方法解决闪烁,而且这样还顺带解决了多次试验中偶尔出现的因为moveTo()函数不能读取到参数执行默认设置(参数设为上次的触摸点)而出现的断线连接闪烁问题,详细代码如下: package c

  • android图像绘制(四)自定义一个SurfaceView控件

    自定义控件(类似按钮等)的使用,自定义一个SurfaceView. 如某一块的动态图(自定义相应),或者类似UC浏览器下面的工具栏. 如下图示例:  自定义类代码: 复制代码 代码如下: public class ImageSurfaceView extends SurfaceView implements Callback{ //用于控制SurfaceView private SurfaceHolder sfh; private Handler handler = new Handler();

  • Android Surfaceview的绘制与应用

    Android  Surfaceview的绘制与应用 一.surfaceview与view的区别 Android 提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足.我们知道,view通过刷新来绘制视图.android系统通过vsync信号来进行屏幕的绘制.刷新的时间间隔为16毫秒.如果在16毫秒内完成了索要刷新的绘制操作,那么在视觉效果上就不会产生卡顿的感觉.如果逻辑操作过多,频繁刷新就会造成界面的卡顿. 对于这一问题,Android提供了surfacevi

  • Android  Surfaceview的绘制与应用

    Android  Surfaceview的绘制与应用 一.surfaceview与view的区别 Android 提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足.我们知道,view通过刷新来绘制视图.android系统通过vsync信号来进行屏幕的绘制.刷新的时间间隔为16毫秒.如果在16毫秒内完成了索要刷新的绘制操作,那么在视觉效果上就不会产生卡顿的感觉.如果逻辑操作过多,频繁刷新就会造成界面的卡顿. 对于这一问题,Android提供了surfacevi

  • Android SurfaceView基础用法详解

    Android 游戏开发框架核心组件 核心组件介绍 SurfaceView 介绍 SurfaceView 介绍 SurfaceView 就是带 Surface 的 view,它是一个 View,是 View 的子类,所以和其他 View 一样,可以在屏幕上展示东西接收用户输入,具有 View 的生命周期回调函数,如 onMeasure.onLayout.onDraw.onTouchEvent 等 SurfaceView 带有独立的 Surface(独立与 window 的 surface),这可

  • Android View如何绘制

    上文说道了Android如何测量,但是一个漂亮的控件我只知道您长到哪儿,这当然不行.只需要简单重写OnDraw方法,并在Canvas(画布)对象上调用那根五颜六色的画笔就能够画出这控件"性感"的外表.那么View又是如何进行绘制了? 要了解View如何绘制,就需要了解canvas(画布)是什么?paint(画笔)能够做什么. Ⅰ.canvas就是表示一块画布,你可以在上面画你所朝思暮想的东西.当我们重写onDraw方法的时候,就能够拿到一个Canvas对象,这个就是你的舞台,画你所思所

  • Android开发之绘制平面上的多边形功能分析

    本文实例讲述了Android开发之绘制平面上的多边形功能.分享给大家供大家参考,具体如下: 计算机里的3D图形其实是由很多个平面组合而成的.所谓"绘制3D"图形,其实是通过多个平面图形形成的.调用GL10图形绘制2D图形的步骤如下: i. 调用GL10的glEnableClientState(GL10.GL_VERTEX_ARRAY);方法启用顶点坐标数组. ii. 调用GL10的glEnableClientState(GL10.GL_COLOR_ARRAY);方法启用顶点颜色数组.

  • Android编程之绘制文本(FontMetrics)实现方法

    本文实例讲述了Android编程之绘制文本(FontMetrics)实现方法.分享给大家供大家参考,具体如下: Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标. 它的思路和java.awt.FontMetrics的基本相同. FontMetrics对象 它以四个基本坐标为基准,分别为: FontMetrics.top FontMetrics.ascent FontMetrics.descent FontMetrics.bottom 该图片将如下 代码如下: Pain

  • Android SurfaceView运行机制剖析--处理切换到后台再重新进入程序时的异常

    有不少朋友都遇到过这种问题,程序执行时切换到后台,然后再重新进入会报异常,本文就这种问题全面讲解下SurfaceView的运行机制,了解了这些原理你就能自己解决这些问题了. 我们通常会通过单击HOME按键或返回按键等操作切换到后台,之后可能会再次进入程序,这个时候就有可能报异常.这里SurfaceView可能报的异常主要有两点,如下: 一.提交画布异常.如下图(模拟器错误提示,以及Logcat Detail) Java代码 public void draw() { try { canvas =

  • Android基于ImageView绘制的开关按钮效果示例

    本文实例讲述了Android基于ImageView绘制的开关按钮效果.分享给大家供大家参考,具体如下: 今天弄了一下用图片绘制开关按钮. 效果图: 还有我两张start图片和stop图片就是上面的图片,到时候大家可以按照自己的图片调用.. Main.xml文件 在xml进入这段代码就ok了. <ImageView Android:id="@+id/start" android:layout_width="150.px" android:layout_heigh

  • Android开发实现绘制淘宝收益图折线效果示例

    本文实例讲述了Android开发实现绘制淘宝收益图折线效果.分享给大家供大家参考,具体如下: 实现的效果我一会贴上,我先说下原理,我们知道要实现在canvas上画线,不就是要搞一个paint嘛,然后首先肯定要设置下paint的属性,那么画文字呢,不就是Textpaint吗,对,就是这么简单,接下来怎么画,折线图主要分为X轴和y轴,x轴表示日期,y表示收益,好,说道这里,大家应该知道怎么去做了,下面直接贴代码 这个方法是,画x,y坐标系的,以及上面的日期和收益了 private void draw

  • Android中View绘制流程详细介绍

    创建Window Window即窗口,这个概念在AndroidFramework中的实现为android.view.Window这个抽象类,这个抽象类是对Android系统中的窗口的抽象.在介绍这个类之前,我们先来看看究竟什么是窗口呢? 实际上,窗口是一个宏观的思想,它是屏幕上用于绘制各种UI元素及响应用户输入事件的一个矩形区域.通常具备以下两个特点: 独立绘制,不与其它界面相互影响: 不会触发其它界面的输入事件: 在Android系统中,窗口是独占一个Surface实例的显示区域,每个窗口的S

随机推荐