android 之 SurfaceView使用(桌面弹球)
整个项目一共3个类:MyConstant,MainActivity,MySurfaceView
效果截图:



注意; 由于手机屏幕分辨的差异,在运行程序时应把AndroidManifest.xml中的
删掉
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; //图片垂直移动速度
}
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
转载于:https://my.oschina.net/u/2393951/blog/488305
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
