`
158067568
  • 浏览: 329032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SurfaceView简单例子

阅读更多

SurfaceView简单例子

作者:Legend

QQ158067568

上一节讨论了SurfaceView的初步知识,这一节将通过一个简单的例子来进一步学习SurfaceView

本节将学习一个例子来对上一节内容做个总结,该例子讲演示一个篮球上下运动的动画。java eyeblog贴图还需要将图片上传到其他网站在转帖,我实在觉得有些麻烦,所以就不贴图了。大家下载之后再机子上运行一下就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();
                                     }
                            }
                   }
                  
         }
 
}
 

代码中的注释已经很清楚了,具体原理参考上一节的内容。如需代码,留下邮箱。

 

 

 

分享到:
评论
8 楼 jnssvh 2015-08-08  
楼主,还发代码吗?
jnssvh@aliyun.com
7 楼 linchuan02 2013-08-30  
linth0920@126.com 谢谢!
6 楼 maoqianqian99 2013-08-15  
楼主这个RefreshThread线程写的好像有点问题哦。
Canvas canvas = null; 
                                     try{ 
                                               onDraw(canvas); 
                                     }catch(Exception e){ 
                                               e.printStackTrace(); 
                                     } 
                                     
这段代码 里canvas一直是 Null? 那直接写成 onDraw(null)不就行了?
5 楼 huxingnong 2013-05-15  
楼主给我一份代码哈。邮箱1534143789@qq.com
4 楼 hezhiyi 2011-08-20  
       博主威武!!!感动中国
3 楼 zxflb 2011-02-21  
效果 不错
2 楼 15921310063 2011-02-18  
运行了下,觉得不错。
谢谢分享!
1 楼 qianlei007 2011-02-17  
回复是一种美德。
    运行了一下,基本明白了。 谢谢!

相关推荐

    SurfaceView小例子

    在这个名为"SurfaceView小例子"的项目中,开发者通过一个“丢西瓜”的简单应用,帮助我们深入理解SurfaceView的工作原理及其与Surface、SurfaceHolder和SurfaceHolder.Callback的关系。 首先,Surface是SurfaceView...

    surfaceView用法例子

    下面是一个简单的SurfaceView使用例子: 首先,创建一个继承自SurfaceView的类,并实现SurfaceHolder.Callback接口: ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback...

    Android中SurfaceView截屏

    这个例子展示了如何结合`SurfaceView`和其下的视图,生成一张完整的截图。记住,实际应用中可能需要根据具体的布局和需求进行调整。 总结来说,截取`SurfaceView`的内容需要绕过默认的截图机制,通过直接操作`...

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

    这个例子可以帮助开发者调试和测试自定义SurfaceView的交互功能。 总结起来,实现Android圆形相机预览窗口需要对SurfaceView有深入的理解,包括如何自定义视图、绘制路径以及与相机的交互。通过这个过程,开发者...

    android SurfaceView游戏框架

    压缩包中的"GameSurfaceView"可能是一个实现简单游戏的SurfaceView子类,包含游戏逻辑和绘图代码。开发者可以通过查看这个例子学习如何结合SurfaceView和游戏逻辑来构建自己的游戏框架。 通过理解和熟练运用...

    SurfaceView入门Demo

    7. **Demo实践**:"SurfaceView入门Demo"可能包含了一个简单的例子,如在一个空白的Surface上绘制动画或者播放视频。通过分析这个Demo,你可以看到如何创建和管理绘图线程,以及如何在Surface上进行基本的绘图操作。...

    解决SurfaceView设置透明造成覆盖其他组件的替代方案

    在这个例子中,CustomTextureView继承自TextureView,并实现了一个简单的旋转圆盘动画。通过startRotation()方法启动动画,每次帧回调时更新角度并重新绘制。 总结来说,解决SurfaceView透明覆盖问题的关键在于使用...

    SurfaceView做的推箱子源代码

    本篇文章将详细解析利用SurfaceView构建的推箱子游戏源代码,帮助开发者深入了解如何在Android平台上构建一款简单的2D游戏。 推箱子游戏,又称 Sokoban,是一款经典的逻辑解谜游戏,玩家需操作角色推动箱子到指定...

    Android MediaPlayer和SurfaceView的简单应用

    以下是一个简单的示例代码片段,展示了如何在Android应用中使用MediaPlayer和SurfaceView: ```java public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback { private ...

    为何SurfaceView能够在非UI线程中刷新界面(内容为代码的demo而并非文档)

    例如,以下是一个简单的`SurfaceView`示例: ```java public class SurfaceTest extends Activity { private SurfaceView surfaceView; private SurfaceHolder holder; private Thread drawingThread; @...

    Android中SurfaceView用法简单实例

    这个例子展示了SurfaceView的基本用法,包括如何创建、绘图、处理输入事件以及管理绘图线程。在实际项目中,SurfaceView可以作为游戏引擎的基础,或者用于处理其他复杂的视觉效果。记住,SurfaceView的设计目的是...

    Android SurfaceView添加组件view不被组件覆盖.rar

    在这个例子中,我们创建了一个`FrameLayout`,并将SurfaceView和一个LinearLayout都添加到了这个布局中。通过设置`layout_gravity`属性,我们让LinearLayout居中并位于屏幕底部,从而确保它不会被SurfaceView遮挡。 ...

    Android利用SurfaceView实现简单计时器

    本篇博客旨在介绍如何利用SurfaceView来实现一个简单的计时器。 首先,我们要理解SurfaceView的基本原理。SurfaceView在Android系统中创建了一个独立的窗口,它有自己的绘图表面,这个表面可以在应用程序主线程之外...

    GrayProces android for opencv 简单的小例子

    在"GrayProces"这个例子中,开发者可能创建了一个SurfaceView来显示相机预览,并在接收到预览帧时调用OpenCV的灰度化函数。同时,也可能提供了选择本地图片并进行处理的功能,这通常涉及到`ImageView`和`Bitmap`对象...

    Android OpenGL的一个简单的例子.zip

    这个"Android OpenGL的一个简单的例子.zip"文件包含了一个基本的Android OpenGL应用实例,帮助开发者了解如何在Android设备上使用OpenGL ES。 首先,我们需要了解OpenGL ES的基本概念。OpenGL ES是OpenGL的精简版,...

    Camera预览方向例子

    在Android开发中,摄像头(Camera)预览方向是开发者经常遇到的一个重要问题。尤其是在移动设备上,由于..."Camera预览方向例子"这个demo虽然简单,但足以让你对这个问题有深入的理解,并能快速应用到自己的项目中。

    Android编程之SurfaceView学习示例详解

    下面是一个简单的使用SurfaceView的例子: ```java public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { // ... public GameSurfaceView(Context context) { ...

Global site tag (gtag.js) - Google Analytics