整个项目一共3个类:MyConstant,MainActivity,MySurfaceView

效果截图:

注意; 由于手机屏幕分辨的差异,在运行程序时应把AndroidManifest.xml中的

<uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" />


删掉

1,MyConstant 用于存放动画中所用的常量

package com.example.sl.desktoppinball;/** * 动画中用到的常量 * @author songliang * */public class MyConstant {public static int SCREENWIDTH=320;//屏幕宽//580*320public static int SCREENHEIGHT=490;//屏幕高public static int PICWIDTH=64;//图片宽public static int PICHEIGHT=64;//图片高public static float PICXSPEED=4.5f;//图片水平移动速度public static float PICYSPEED=2;//图片垂直移动速度}


2,MainActivity 显示SurfaceView


package com.example.sl.desktoppinball;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.view.WindowManager;public class MainActivity extends Activity {private MySurfaceView sfv = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sfv = new MySurfaceView(MainActivity.this);requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置屏幕显示没有title栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); // 设置全屏setContentView(sfv);}}


3, MySurfaceView


package com.example.sl.desktoppinball;import com.example.sl.deskball.R;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MySurfaceView extends SurfaceView implementsSurfaceHolder.Callback, Runnable {private SurfaceHolder sh;private MainActivity ma;private float[][] d = new float[2][2];// 用于记录小球一次位移的起始坐标private Canvas cv;private Paint paint;// 画笔private float picX = 0; // 图片x坐标private float picY = 0; // 图片y坐标private Boolean compX = null;// 判断起始坐标x的大小private Boolean compY = null;// 判断起始坐标y的大小private int flag = 0;// 标记,用于控制显示不同的小球int flag2 = 0;// 标记,用于控制小球的运动方向private Boolean isRunning = true;// 判断线程是否正在运行public MySurfaceView(Context context) {super(context);ma = (MainActivity) context;sh = this.getHolder();sh.addCallback(this);paint = new Paint();}public float getPicX() {return picX;}public void setPicX(float picX) {this.picX = picX;}public float getPicY() {return picY;}public void setPicY(float picY) {this.picY = picY;}public void setFlag(int flag) {this.flag = flag;}// 用于绘制图像,图形等public void doDrawView() {if (sh != null) {cv = sh.lockCanvas();// 锁定画布if (cv != null) {Bitmap bitmapBackGround = null;Bitmap bitmapDuke = null;switch (flag) {// 根据flag的值绘制不同的图片(此处为不同颜色的小球)case 1:bitmapBackGround = BitmapFactory.decodeResource(ma.getResources(), R.drawable.fp_1);cv.drawBitmap(bitmapBackGround, 0, 0, paint);bitmapDuke = BitmapFactory.decodeResource(ma.getResources(), R.drawable.w1);cv.drawBitmap(bitmapDuke, picX, picY, paint);break;case 2:bitmapBackGround = BitmapFactory.decodeResource(ma.getResources(), R.drawable.fp_2);cv.drawBitmap(bitmapBackGround, 0, 0, paint);bitmapDuke = BitmapFactory.decodeResource(ma.getResources(), R.drawable.w2);cv.drawBitmap(bitmapDuke, picX, picY, paint);break;case 3:bitmapBackGround = BitmapFactory.decodeResource(ma.getResources(), R.drawable.fp_3);cv.drawBitmap(bitmapBackGround, 0, 0, paint);bitmapDuke = BitmapFactory.decodeResource(ma.getResources(), R.drawable.w3);cv.drawBitmap(bitmapDuke, picX, picY, paint);break;default:bitmapBackGround = BitmapFactory.decodeResource(ma.getResources(), R.drawable.fp_2);cv.drawBitmap(bitmapBackGround, 0, 0, paint);bitmapDuke = BitmapFactory.decodeResource(ma.getResources(), R.drawable.w4);cv.drawBitmap(bitmapDuke, picX, picY, paint);break;}sh.unlockCanvasAndPost(cv);}}}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}@Overridepublic void surfaceCreated(SurfaceHolder arg0) {// 当surfaceView创建完成后启动画图线程new Thread(this).start();}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {isRunning = false;try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 记录前后两次位移的坐标private void storageXY(float x, float y) {d[0][0] = d[1][0];d[0][1] = d[1][1];d[1][0] = x;d[1][1] = y;}// 比较前后坐标x,y的大小,用以确定小球当前运动的方向private void compXY() {if ((d[1][0] - d[0][0]) > 0) {compX = true;} else if ((d[1][0] - d[0][0]) < 0)compX = false;if ((d[1][1] - d[0][1]) > 0) {compY = true;} else if ((d[1][1] - d[0][1]) < 0)compY = false;}// 画图线程@Overridepublic void run() {while (isRunning) {while (true) {flag2 = 1; // 小球移动方向:1-->右上,2-->右下,3-->左上,4-->左下int flag1 = 0;// 控制不同小球的切换picX = 0;picY = MyConstant.SCREENHEIGHT - MyConstant.PICHEIGHT;while (flag2 < 5) {this.setPicX(picX);// 设置x坐标this.setPicY(picY);// 设置y坐标this.setFlag(flag1);// 设置flag1的值storageXY(picX, picY);// 记录前后两次位移的坐标doDrawView();// 通过坐标绘制图像switch (flag2) {case 1:// 右上picY = picY - MyConstant.PICYSPEED;picX = picX + MyConstant.PICXSPEED;flag1 = 1;break;case 2:// 右下picY = picY + MyConstant.PICYSPEED;picX = picX + MyConstant.PICXSPEED;flag1 = 2;break;case 3:// 左上picY = picY - MyConstant.PICYSPEED;picX = picX - MyConstant.PICXSPEED;flag1 = 3;break;case 4:// 左下picY = picY + MyConstant.PICYSPEED;picX = picX - MyConstant.PICXSPEED;flag1 = 4;break;}compXY();// 比较小球运动过程中其实位置的x,yif (picY <= 0) { // 到达屏幕上沿if (compX == true && compY == false) {flag2 = 2;}if (compX == false && compY == false) {flag2 = 4;}}if (picY >= MyConstant.SCREENHEIGHT - MyConstant.PICHEIGHT) {// 到达屏幕下沿if (compX == true && compY == true) {flag2 = 1;}if (compX == false && compY == true) {flag2 = 3;}}if (picX >= MyConstant.SCREENWIDTH - MyConstant.PICWIDTH) {// 到达屏幕右沿if (compX == true && compY == false) {flag2 = 3;}if (compX == true && compY == true) {flag2 = 4;}}if (picX <= 0) {// 到达屏幕左沿if (compX == false && compY == false) {flag2 = 1;}if (compX == false && compY == true) {flag2 = 2;}}}}}}}


SurfaceHolder.Callback, Runnable


更多相关文章

  1. Android(安卓)OpenGL ES(十):绘制三角形Triangle
  2. [置顶] 我的Android进阶之旅------>Android常用计量单位(Dimensio
  3. android 平滑切换屏幕的几种方法总结
  4. Android(安卓)动态控制控件的位置
  5. Android(安卓)OpenGL教程-第六课
  6. android中viewPager实现的屏幕左右切换(入门篇)
  7. Android无视屏幕解锁保护界面
  8. android游戏引擎andengine学习系列二:简单的例子
  9. [Android-Demo]Android(安卓)View的拖动

随机推荐

  1. android 插件总结
  2. Android官方Toolbar自定义高度最靠谱的解
  3. Android(安卓)Framework中的线程Thread及
  4. Android(安卓)终极屏幕适配方案
  5. 从0开始认识android(十五):点击链接启动APP
  6. Android(安卓)studio无法连接识别检测各
  7. (转)android底部菜单应用
  8. Android:用Handler实现异步处理功能
  9. Android安全机制--操作系统安全机制-进程
  10. android布局文件详解