- 浏览: 326958 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1696产看方法被谁调用: cmd + shift + g -
android去除状态栏和下面视图之前的黑线
2011-08-30 11:13 3497<style name=" ... -
sqlite3 常用命令 for android
2011-08-16 10:59 13341)创建数据库文件: ... -
解决Window系统adb shell后中文显示乱码
2011-08-16 10:52 6069Android中使用的是UTF-8字符,而CMD默认字符集 ... -
(转)Eclipse xml formatter setting for android
2011-08-16 10:03 1691Android里使用很多xml 定义layout,我们 ... -
Android TabActivity实现多页显示效果
2011-03-05 01:28 29447TabActivity实现多页显示 ... -
ListView进阶系列之一 内容顺序淡淡显示
2011-03-04 10:06 5900ListView进阶系列之一 内容顺序淡淡显示 listVi ... -
Android Animation 高手必读 之一 Tweened Animations 代码实现
2011-02-27 23:55 9296半小时搞定Android Animation 之一 作者:L ... -
android布局文件中的include
2011-02-27 00:46 8961居然没有发现,在xml文件中可以使用include,我晕 一 ... -
【收集】Android 面试题
2011-02-25 23:42 9811这个是我自己整理的一些面试题,都是在网上找的,非原创。面试前可 ... -
handler异步控制Runnable
2011-02-20 11:03 91641 关于改变Activity中TextView的方法 ... -
Android消息机制入门一
2011-02-19 19:54 2063Android消息机制入门 ... -
自定义控件(SurfaceView与view结合)
2011-02-14 15:59 16105自定义控件(SurfaceView与view结合) 作 ... -
SurfaceView概述
2011-02-13 21:20 16354SurfaceView概述 作者 ... -
Surface概述
2011-02-13 16:18 3233Surface概述 作者:L ... -
Activity之间的相互调用与传递参数
2011-01-05 19:08 11957Activity之间的相互调用与传递参数 作 ... -
SharedPreferenced
2010-12-25 21:49 1948SharedPreferenced ... -
Android中进行单元测试
2010-12-23 13:35 1613Android中进行单元测试 作者:LEGEND ... -
Android 与 MVC
2010-12-23 12:30 3723Android & MVC 作者:LEGEND ... -
android中文件IO
2010-12-23 01:31 3221Android中文件的读写 ...
相关推荐
一个丢西瓜的例子,可以对surfaceSurface、SurfaceHolder及SurfaceHolder.Callback有所理解
surfaceView用法的简单例子。帮助初学者理解surfaceview的使用方式。
android使用双缓冲辨析及surfaceview使用例子
小例子 教你SurfaceView的生命特征
一个有关android游戏的SurfaceView简单框架例子,有兴趣的友友们可以参考下!
该示例介绍如何使用SurfaceView的上述模版代码实现一个绘图板。
SurfaceView 简单动画场景的绘制
Android游戏开发, SurfaceView!
利用SurfaceView实现简单的计时器
android surfaceview使用例子
实现用surfaceview制作简单动画效果,其方法可以直接调用
surfaceView 网页surfaceView 网页surfaceView 网页surfaceView 网页surfaceView 网页surfaceView 网页
这是在上网收集的,能够截取当前Activity中surfaceView中图片。本人亲测可以通过。
使用SurfaceView开发的一个简易示波器,属于SurfaceView绘制的入门基础。
android surfaceview例程,一个安卓平台上使用surfaceview组件的小例子。
最简单的surfaceview画图和截图,点击“点击加图”会在surfaceview上增加一个bitmat,点击“点击保存”会将最新的surfaceview图片保存在手机上。
这个是我改进了SurfaceView一个例子做的,参考了前人的作品,更适合我的项目使用了,如果对大家有帮助可以试试看