`
Dewing
  • 浏览: 6179 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论
  • MNTMs: 这是饼,还不是球,java中自带有一个画圆的方法,是可以设置颜 ...
    线程游戏

Android 简单动画中SurfaceView 的应用

阅读更多

 一、对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);
				}
			}			
		}		
	}
}




 

 

  • 大小: 10.1 KB
分享到:
评论

相关推荐

    Android SurfaceView实现动画效果

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制...在AndroidStudy_1.1_SurfaceView这个项目中,可以找到示例代码和详细实现,帮助理解这些概念并应用到自己的项目中。

    Android SurfaceView 实现图片缩放 滑动

    综上所述,通过结合SurfaceView、手势检测和矩阵变换,我们可以实现在Android应用中对图片的流畅缩放和滑动操作。然而,由于SurfaceView的特性,这个过程可能会比使用ImageView等其他组件更为复杂。因此,开发者需要...

    Android SurfaceView实现加载GIF动画

    本篇文章将深入探讨如何使用`SurfaceView`来实现加载GIF动画,这是一个常见的需求,特别是在游戏开发或者需要实时渲染场景的应用中。 首先,我们要理解`SurfaceView`的基本概念。`SurfaceView`是Android系统提供的...

    AndroidApp中使用SurfaceView制作多线程动画的实例讲解.docx

    ### Android App中使用SurfaceView制作多线程动画的实例讲解 #### SurfaceView的定义与应用场景 在Android开发中,为了确保应用的流畅性和响应性,通常需要将耗时操作(如网络请求)放在非UI线程中进行。然而,...

    Android中SurfaceView的使用

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在应用程序中实现高性能图形绘制的能力,常用于视频播放、游戏开发等场景。SurfaceView的特性使其能够在单独的线程中进行渲染,从而避免了...

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得...这个示例程序提供了一个实践这些概念的起点,开发者可以通过学习和修改它来提升自己在Android动画开发方面的技能。

    使用android自带的动画机制很卡时可以考虑使用SurfaceView来实现动画

    在Android应用开发中,我们经常会遇到需要创建流畅的动画效果,但有时使用默认的动画机制(如`ViewPropertyAnimator`、`ObjectAnimator`等)可能会出现性能问题,尤其是在处理大量图形变化或者游戏场景时。...

    安卓Android源码——(SurfaceView游戏框架).zip

    在安卓平台上,开发游戏或者高性能图形应用时,通常会用到SurfaceView来构建游戏框架。SurfaceView是Android系统提供...这个压缩包提供的源码是一个很好的学习资源,可以帮助你深入理解SurfaceView在游戏开发中的应用。

    Android圆形相机预览窗口,圆形SurfaceView

    在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...

    基于android studio的SurfaceView应用设计

    一个典型的SurfaceView应用可能是游戏。在游戏开发中,SurfaceView可以用来绘制游戏画面,通过`onDraw()`方法不断更新帧率,实现流畅的游戏动画。 10. **测试与调试** 使用Android Studio的模拟器或连接真实设备...

    Android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,特别是用于实现动画效果,如游戏或者视频播放等。SurfaceView拥有自己的绘图表面,与主线程分离,因此在处理复杂的...

    android View、SurfaceView Demo

    在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们被广泛用于构建用户界面和处理图形绘制。这两个类都是Android系统提供用来显示动态内容的机制,但它们之间存在一些关键的区别。 **View组件** ...

    SurfaceView的简单应用

    让我们深入探讨一下`SurfaceView`的基本概念、应用场景以及如何在实际项目中进行简单应用。 ### SurfaceView 基本概念 `SurfaceView` 是 Android 视图系统的一个子类,与普通的 `View` 不同,它有自己的独立绘图...

    android之view和surfaceview用法示例汇总

    在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们用于在屏幕上显示内容和处理用户交互。本文将详细解析View和SurfaceView的基本概念、用法以及它们之间的区别,通过实例代码来帮助理解。 **一、...

    android中surfaceview控件的使用范例

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为高性能的图形渲染提供了平台,如游戏、视频播放等需要频繁更新画面的应用场景。SurfaceView的特性使得它能够在单独的线程中绘制内容,避免了与UI主线程...

    android之surfaceview学习示例

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在...通过"android之surfaceview学习示例",开发者可以掌握其工作原理和实践技巧,从而在自己的应用中实现流畅的动画效果和复杂的视觉体验。

    Android游戏框架SurfaceView介绍

    ### Android游戏框架SurfaceView介绍 #### 一、SurfaceView与游戏开发 在Android平台上开发游戏时,SurfaceView是一个非常重要的组件。它提供了低延迟的显示功能,并且支持双缓冲机制,这对于实时渲染图像非常关键...

    Android---SurfaceView

    综上所述,Android中的SurfaceView动画涉及多个层面,包括SurfaceHolder回调、绘图线程、动画逻辑和性能优化。理解这些核心概念对于创建流畅且高效的图形动画至关重要。在SurfaceViewDemo项目中,你可以找到具体实现...

    安卓动画效果相关-SurfaceView与Canvas结合使用实现动画效果.rar

    SurfaceView是Android系统提供的一种特殊类型的视图,它允许开发者在单独的线程中进行绘图操作,从而实现流畅的动画。Canvas则是Android图形绘制的核心工具,它提供了丰富的绘图方法,如画点、线、矩形等,开发者...

    在android中surfaceView的使用

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为高性能、低延迟的图形绘制提供了可能,尤其适合处理视频播放、游戏等需要频繁更新画面的场景。SurfaceView的使用涉及到多个关键知识点,包括它的基本...

Global site tag (gtag.js) - Google Analytics