- 浏览: 329247 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jnssvh:
楼主,还发代码吗?jnssvh@aliyun.com
SurfaceView简单例子 -
hou_anne:
讲解的非常详细
Android TabActivity实现多页显示效果 -
小鱼小鹰:
现在还能吗。。。296252344@qq.com
自定义控件(SurfaceView与view结合) -
flyar:
你好!我按照你的代码实现多点广播,但是在一台机子休眠,另一台手 ...
UDP广播与多播简单实现 -
herber2010:
图有错误~~
java实现快速排序
SurfaceView简单例子
作者:Legend
QQ:158067568
上一节讨论了SurfaceView的初步知识,这一节将通过一个简单的例子来进一步学习SurfaceView。
本节将学习一个例子来对上一节内容做个总结,该例子讲演示一个篮球上下运动的动画。java eye的blog贴图还需要将图片上传到其他网站在转帖,我实在觉得有些麻烦,所以就不贴图了。大家下载之后再机子上运行一下就ok了。
实现
Activity中很简单,代码中需要注意的地方与知识点都已经给了注释,代码如下:
package cn.edu.heut.zcl; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Window; import android.view.WindowManager; public class SportActivity extends Activity { public int screenWidth ; public int screenHeight ; BallSurfaceView bsv ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bsv = new BallSurfaceView(this); //获得屏幕尺寸 DisplayMetrics dm = new DisplayMetrics(); dm = this.getApplicationContext().getResources().getDisplayMetrics(); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; //下两句为设置全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(bsv); } }
接下来介绍球类:
package cn.edu.heut.zcl;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.DisplayMetrics;
/**
* 球类
* @author zcl
*
*/
public class Ball {
/**
* 球的高
*/
public static final int HEIGHT = 93;
/**
* 球的宽
*/
public static final int WIDTH = 93;
private static final int STEPLENGTH = 10;//每次运动的间距
private static final float REDUCEPERCENTAGE = 0.35F;//递减系数
private int stepReduce ;//每次反向运动的缩短的距离
private float runX ;//球的位置
private float runY ;//球的位置
private BallSurfaceView bsv ;
private boolean upDirection = false;//if true,up direction,or is down direction
private float maxHeight ;//当前运动最高的高度
private Paint paint ;
Bitmap ballBitmap ;//球的图片
SportActivity sa ;
public Ball(float initX , float initY , BallSurfaceView bsv){
this.runX = initX;
this.runY = initY ;
maxHeight = initY;
this.bsv = bsv;
ballBitmap = BitmapFactory.decodeResource(bsv.getResources(), R.drawable.ball);//加载图片
paint = new Paint();
sa = bsv.sportActivity;
}
public void onDraw(Canvas canvas) {
int c = paint.getColor();//保存颜色,之后还原为之前颜色
boundaryTest();
if(canvas != null) canvas.drawBitmap(ballBitmap,runX,runY,paint);
paint.setColor(c);
move();
}
/**
* 运动
*/
private void move() {
if(maxHeight >= (sa.screenHeight - HEIGHT)) {
return;
}
if(upDirection){//向上
runY = runY + STEPLENGTH ;
}else{
runY = runY - STEPLENGTH ;
}
}
/**
* 边界检测,使球不会飞出边界
*/
private void boundaryTest(){
if(runY > sa.screenHeight - HEIGHT){//向下运动到头
upDirection = !upDirection;//方向置反
runY = sa.screenHeight - HEIGHT;
stepReduce = (int) (maxHeight * REDUCEPERCENTAGE);
maxHeight = maxHeight + stepReduce ;//最大高度递减
}
if(runY < maxHeight ){//向上运动到头
upDirection = !upDirection;//方向置反
if(maxHeight >= (sa.screenHeight - HEIGHT)) return;
runY = maxHeight ;
}
}
}
SurfaceView类:
package cn.edu.heut.zcl;
import android.R.color;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class BallSurfaceView extends SurfaceView
implements SurfaceHolder.Callback{
SportActivity sportActivity ;//调用该SurfaceView的上下文引用
private Ball ball ;//小球
SurfaceHolder holder ;
public BallSurfaceView(Context context) {
super(context);
this.sportActivity = (SportActivity)context ;
ball = new Ball(100, 100, this);
holder = this.getHolder();
holder.addCallback(this);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(canvas == null) canvas = holder.lockCanvas();//锁定画布
Paint p = new Paint();
int c = p.getColor();
p.setColor(Color.WHITE);//设置背景白色
if(canvas != null)
canvas.drawRect(0, 0, sportActivity.screenWidth, sportActivity.screenHeight, p);
p.setColor(c);
ball.onDraw(canvas);
holder.unlockCanvasAndPost(canvas);//释放锁
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
new RefreshThread().start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
private class RefreshThread extends Thread{
@Override
public void run() {
while(true){
Canvas canvas = null;
try{
onDraw(canvas);
}catch(Exception e){
e.printStackTrace();
}
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
代码中的注释已经很清楚了,具体原理参考上一节的内容。如需代码,留下邮箱。
评论
jnssvh@aliyun.com
Canvas canvas = null;
try{
onDraw(canvas);
}catch(Exception e){
e.printStackTrace();
}
这段代码 里canvas一直是 Null? 那直接写成 onDraw(null)不就行了?
谢谢分享!
运行了一下,基本明白了。 谢谢!
发表评论
-
eclipse 快捷键 for macbook (自用备份)
2011-11-06 19:31 1767产看方法被谁调用: cmd + shift + g -
android去除状态栏和下面视图之前的黑线
2011-08-30 11:13 3534<style name=" ... -
sqlite3 常用命令 for android
2011-08-16 10:59 14011)创建数据库文件: ... -
解决Window系统adb shell后中文显示乱码
2011-08-16 10:52 6119Android中使用的是UTF-8字符,而CMD默认字符集 ... -
(转)Eclipse xml formatter setting for android
2011-08-16 10:03 1734Android里使用很多xml 定义layout,我们 ... -
Android TabActivity实现多页显示效果
2011-03-05 01:28 29523TabActivity实现多页显示 ... -
ListView进阶系列之一 内容顺序淡淡显示
2011-03-04 10:06 5959ListView进阶系列之一 内容顺序淡淡显示 listVi ... -
Android Animation 高手必读 之一 Tweened Animations 代码实现
2011-02-27 23:55 9343半小时搞定Android Animation 之一 作者:L ... -
android布局文件中的include
2011-02-27 00:46 8994居然没有发现,在xml文件中可以使用include,我晕 一 ... -
【收集】Android 面试题
2011-02-25 23:42 9871这个是我自己整理的一些面试题,都是在网上找的,非原创。面试前可 ... -
handler异步控制Runnable
2011-02-20 11:03 91971 关于改变Activity中TextView的方法 ... -
Android消息机制入门一
2011-02-19 19:54 2106Android消息机制入门 ... -
自定义控件(SurfaceView与view结合)
2011-02-14 15:59 16186自定义控件(SurfaceView与view结合) 作 ... -
SurfaceView概述
2011-02-13 21:20 16400SurfaceView概述 作者 ... -
Surface概述
2011-02-13 16:18 3281Surface概述 作者:L ... -
Activity之间的相互调用与传递参数
2011-01-05 19:08 12004Activity之间的相互调用与传递参数 作 ... -
SharedPreferenced
2010-12-25 21:49 1991SharedPreferenced ... -
Android中进行单元测试
2010-12-23 13:35 1644Android中进行单元测试 作者:LEGEND ... -
Android 与 MVC
2010-12-23 12:30 3767Android & MVC 作者:LEGEND ... -
android中文件IO
2010-12-23 01:31 3256Android中文件的读写 ...
相关推荐
在这个名为"SurfaceView小例子"的项目中,开发者通过一个“丢西瓜”的简单应用,帮助我们深入理解SurfaceView的工作原理及其与Surface、SurfaceHolder和SurfaceHolder.Callback的关系。 首先,Surface是SurfaceView...
下面是一个简单的SurfaceView使用例子: 首先,创建一个继承自SurfaceView的类,并实现SurfaceHolder.Callback接口: ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback...
这个例子展示了如何结合`SurfaceView`和其下的视图,生成一张完整的截图。记住,实际应用中可能需要根据具体的布局和需求进行调整。 总结来说,截取`SurfaceView`的内容需要绕过默认的截图机制,通过直接操作`...
压缩包中的"GameSurfaceView"可能是一个实现简单游戏的SurfaceView子类,包含游戏逻辑和绘图代码。开发者可以通过查看这个例子学习如何结合SurfaceView和游戏逻辑来构建自己的游戏框架。 通过理解和熟练运用...
这个例子可以帮助开发者调试和测试自定义SurfaceView的交互功能。 总结起来,实现Android圆形相机预览窗口需要对SurfaceView有深入的理解,包括如何自定义视图、绘制路径以及与相机的交互。通过这个过程,开发者...
7. **Demo实践**:"SurfaceView入门Demo"可能包含了一个简单的例子,如在一个空白的Surface上绘制动画或者播放视频。通过分析这个Demo,你可以看到如何创建和管理绘图线程,以及如何在Surface上进行基本的绘图操作。...
在这个例子中,CustomTextureView继承自TextureView,并实现了一个简单的旋转圆盘动画。通过startRotation()方法启动动画,每次帧回调时更新角度并重新绘制。 总结来说,解决SurfaceView透明覆盖问题的关键在于使用...
本篇文章将详细解析利用SurfaceView构建的推箱子游戏源代码,帮助开发者深入了解如何在Android平台上构建一款简单的2D游戏。 推箱子游戏,又称 Sokoban,是一款经典的逻辑解谜游戏,玩家需操作角色推动箱子到指定...
以下是一个简单的示例代码片段,展示了如何在Android应用中使用MediaPlayer和SurfaceView: ```java public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback { private ...
例如,以下是一个简单的`SurfaceView`示例: ```java public class SurfaceTest extends Activity { private SurfaceView surfaceView; private SurfaceHolder holder; private Thread drawingThread; @...
这个例子展示了SurfaceView的基本用法,包括如何创建、绘图、处理输入事件以及管理绘图线程。在实际项目中,SurfaceView可以作为游戏引擎的基础,或者用于处理其他复杂的视觉效果。记住,SurfaceView的设计目的是...
在这个例子中,我们创建了一个`FrameLayout`,并将SurfaceView和一个LinearLayout都添加到了这个布局中。通过设置`layout_gravity`属性,我们让LinearLayout居中并位于屏幕底部,从而确保它不会被SurfaceView遮挡。 ...
本篇博客旨在介绍如何利用SurfaceView来实现一个简单的计时器。 首先,我们要理解SurfaceView的基本原理。SurfaceView在Android系统中创建了一个独立的窗口,它有自己的绘图表面,这个表面可以在应用程序主线程之外...
在"GrayProces"这个例子中,开发者可能创建了一个SurfaceView来显示相机预览,并在接收到预览帧时调用OpenCV的灰度化函数。同时,也可能提供了选择本地图片并进行处理的功能,这通常涉及到`ImageView`和`Bitmap`对象...
这个"Android OpenGL的一个简单的例子.zip"文件包含了一个基本的Android OpenGL应用实例,帮助开发者了解如何在Android设备上使用OpenGL ES。 首先,我们需要了解OpenGL ES的基本概念。OpenGL ES是OpenGL的精简版,...
在Android开发中,摄像头(Camera)预览方向是开发者经常遇到的一个重要问题。尤其是在移动设备上,由于..."Camera预览方向例子"这个demo虽然简单,但足以让你对这个问题有深入的理解,并能快速应用到自己的项目中。
下面是一个简单的使用SurfaceView的例子: ```java public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { // ... public GameSurfaceView(Context context) { ...