一、对SurfaceView 的认识:
在Android中,SurfaceView是View的子类,它内嵌了一个专门用于绘制的Surface,我们可以控制这个Surface的格式和尺寸,Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,说明它总在自己所在窗口的后面。SurfaceView提供了一个可见区域,只有在这个可见区域内的surface内容才可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面有透明控件,那么每次surface变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。SurfaceView默认使用双缓冲技术的,它支持在子线程中绘制图像,这样就不会阻塞主线程了,所以它更适合于游戏的开发。
SurfaceView使用的方式与任何View所派生的类都是完全相同的。可以像其他View那样应用动画,并把它们放到布局中。SurfaceView封装的Surface支持所有标准的Canvas方法进行绘图,同时也支持完全的OpenGL ES 库。
二、创建SurfaceView控件:
首先我们需要继承SurfaceView并实现SurfaceHolder.Callback接口,这是因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。接着我们需要实现它的3个方法:
1. surfaceCreated(SurfaceHolder holder):surface创建的时候调用,一般在该方法中启动绘图的线程。
2. surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸发生改变的时候调用,如横竖屏切换。
3. surfaceDestroyed(SurfaceHolder holder) :surface被销毁的时候调用,如退出游戏画面,一般在该方法中停止绘图线程。
同时,我们还需要获得SurfaceHolder,并添加回调函数holder.addCallback(this);,这样这三个方法才会执行。另外,在绘制时,锁定画布,画布用完后要释放holder.unlockCanvasAndPost(canvas);
Android 简单动画的代码:
MainActivity.java
package com.example.cartoon; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化SurfaceView BallSurfaceView sv = new BallSurfaceView(this); setContentView(sv); } }
BallSurfaceView.java
package com.example.cartoon; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; public class BallSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{ private SurfaceHolder holder; private boolean runFlag; private Paint paint = new Paint(); //重写构造方法 public BallSurfaceView(Context context) { this(context, null); } public BallSurfaceView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BallSurfaceView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); //获取Surface句柄对象,通过该对象获取画布 holder = this.getHolder(); //添加回调接口 holder.addCallback(this); // setFocusable(true); } //实现SurfaceHolder.Callback接口的方法 @Override//当切换横竖屏时调用 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } //当SurfaceView创建时调用 @Override public void surfaceCreated(SurfaceHolder arg0) { //创建时启动线程 runFlag = true; new Thread(this).start(); } //当SurfaceView结束时调用 @Override public void surfaceDestroyed(SurfaceHolder arg0) { //退出时结束线程 runFlag = false; } //重写run方法 @Override public void run() { int x = 0; int y = 0; int dx = 2; int dy = 3; int width = 30; int height = 30; while(runFlag){ Canvas canvas = null; try { //锁定画笔对象 canvas = holder.lockCanvas(); //设置画笔 paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.FILL); //填充背景颜色 Rect rect = new Rect(0, 0, this.getWidth(), this.getHeight()); canvas.drawRect(rect, paint); //绘制小球,设置小球颜色为红 paint.setColor(Color.RED); RectF rf = new RectF(x, y, x+width, y+height); canvas.drawOval(rf, paint); //小球移动 x += dx; y += dy; //边界判断 if(x<=0 || x>=this.getWidth()){ dx = -dx; } if(y<=0 || y>=this.getHeight()){ dy = -dy; } Thread.sleep(40); } catch (InterruptedException e) { e.printStackTrace(); }finally{ //画布用完要释放 if(canvas != null){ holder.unlockCanvasAndPost(canvas); } } } } }
相关推荐
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制...在AndroidStudy_1.1_SurfaceView这个项目中,可以找到示例代码和详细实现,帮助理解这些概念并应用到自己的项目中。
综上所述,通过结合SurfaceView、手势检测和矩阵变换,我们可以实现在Android应用中对图片的流畅缩放和滑动操作。然而,由于SurfaceView的特性,这个过程可能会比使用ImageView等其他组件更为复杂。因此,开发者需要...
本篇文章将深入探讨如何使用`SurfaceView`来实现加载GIF动画,这是一个常见的需求,特别是在游戏开发或者需要实时渲染场景的应用中。 首先,我们要理解`SurfaceView`的基本概念。`SurfaceView`是Android系统提供的...
### Android App中使用SurfaceView制作多线程动画的实例讲解 #### SurfaceView的定义与应用场景 在Android开发中,为了确保应用的流畅性和响应性,通常需要将耗时操作(如网络请求)放在非UI线程中进行。然而,...
在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在应用程序中实现高性能图形绘制的能力,常用于视频播放、游戏开发等场景。SurfaceView的特性使其能够在单独的线程中进行渲染,从而避免了...
在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得...这个示例程序提供了一个实践这些概念的起点,开发者可以通过学习和修改它来提升自己在Android动画开发方面的技能。
在Android应用开发中,我们经常会遇到需要创建流畅的动画效果,但有时使用默认的动画机制(如`ViewPropertyAnimator`、`ObjectAnimator`等)可能会出现性能问题,尤其是在处理大量图形变化或者游戏场景时。...
在安卓平台上,开发游戏或者高性能图形应用时,通常会用到SurfaceView来构建游戏框架。SurfaceView是Android系统提供...这个压缩包提供的源码是一个很好的学习资源,可以帮助你深入理解SurfaceView在游戏开发中的应用。
在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...
一个典型的SurfaceView应用可能是游戏。在游戏开发中,SurfaceView可以用来绘制游戏画面,通过`onDraw()`方法不断更新帧率,实现流畅的游戏动画。 10. **测试与调试** 使用Android Studio的模拟器或连接真实设备...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,特别是用于实现动画效果,如游戏或者视频播放等。SurfaceView拥有自己的绘图表面,与主线程分离,因此在处理复杂的...
在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们被广泛用于构建用户界面和处理图形绘制。这两个类都是Android系统提供用来显示动态内容的机制,但它们之间存在一些关键的区别。 **View组件** ...
让我们深入探讨一下`SurfaceView`的基本概念、应用场景以及如何在实际项目中进行简单应用。 ### SurfaceView 基本概念 `SurfaceView` 是 Android 视图系统的一个子类,与普通的 `View` 不同,它有自己的独立绘图...
在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们用于在屏幕上显示内容和处理用户交互。本文将详细解析View和SurfaceView的基本概念、用法以及它们之间的区别,通过实例代码来帮助理解。 **一、...
在Android开发中,SurfaceView是一个非常重要的视图组件,它为高性能的图形渲染提供了平台,如游戏、视频播放等需要频繁更新画面的应用场景。SurfaceView的特性使得它能够在单独的线程中绘制内容,避免了与UI主线程...
在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在...通过"android之surfaceview学习示例",开发者可以掌握其工作原理和实践技巧,从而在自己的应用中实现流畅的动画效果和复杂的视觉体验。
### Android游戏框架SurfaceView介绍 #### 一、SurfaceView与游戏开发 在Android平台上开发游戏时,SurfaceView是一个非常重要的组件。它提供了低延迟的显示功能,并且支持双缓冲机制,这对于实时渲染图像非常关键...
综上所述,Android中的SurfaceView动画涉及多个层面,包括SurfaceHolder回调、绘图线程、动画逻辑和性能优化。理解这些核心概念对于创建流畅且高效的图形动画至关重要。在SurfaceViewDemo项目中,你可以找到具体实现...
SurfaceView是Android系统提供的一种特殊类型的视图,它允许开发者在单独的线程中进行绘图操作,从而实现流畅的动画。Canvas则是Android图形绘制的核心工具,它提供了丰富的绘图方法,如画点、线、矩形等,开发者...
在Android开发中,SurfaceView是一个非常重要的视图组件,它为高性能、低延迟的图形绘制提供了可能,尤其适合处理视频播放、游戏等需要频繁更新画面的场景。SurfaceView的使用涉及到多个关键知识点,包括它的基本...