Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 713|回复: 0

[实例教程]Android SurfaceView简单例子

[复制链接]

该用户从未签到

发表于 2011-10-22 14:02:28 | 显示全部楼层 |阅读模式
实现
       Activity中很简单,代码中需要注意的地方与知识点都已经给了注释,代码如下:

java代码: package eoe.demo;





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);

}

}
接下来介绍球类:

java代码:
package eoe.demo;





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类:


java代码:
package eoe.demo;



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();

}

}

}



}



}
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:02:33 | 显示全部楼层

Re:[实例教程]Android

学习!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-18 23:20 , Processed in 0.431139 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表