安卓 自定义View来开发自己的游戏或应用
2015-10-25 19:03
375 查看
案列是通过模拟一个经典游戏Pac-Man的场景 总共有Sample_8_1,MyView,MyThread三个类
(1)MyView类代码如下
(2)MyThread类开发,代码如下
(3)Activity部分的开发,Activity在本案例中相当于控制器的角色
(1)MyView类代码如下
package sa.dsa; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.view.View; public class MyView extends View{ static final int ANGLE_MAX=50;//张嘴的最大角度 static final int SPEED=4;//移动的步进 static final int SCREEN_WIDTH=480;//游戏场景宽度 static final int SCREEN_HEIGHT=320;//游戏场景高度 //四个方向常数 static final int LEFT = 2;//向右 static final int RIGHT=0;//向右 static final int UP=3;//向上 static final int DOWN=1;//向下 int angle=30;//当前张嘴总角度 int angleChange=3;//角度变化值 int radius=20;//半径 int centerX=radius;//当前位置 int centerY=radius;//当前位置 long timeStamp = System.currentTimeMillis();//记录换照片的时间 int currPhoto;//当前照片数组的索引 static int direction = RIGHT; Bitmap bmpMan; Bitmap[] bmpPhotos;//照片数组 int[] imgIds={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d}; public MyView(Context context){//MyView类的构造器 super(context); bmpMan = BitmapFactory.decodeResource(getResources(), R.drawable.man);//初始化每张图片 bmpPhotos = new Bitmap[imgIds.length];//初始化照片数组 for(int i=0;i<bmpPhotos.length;i++){ bmpPhotos[i]=BitmapFactory.decodeResource(getResources(), imgIds[i]); } } protected void onDraw(Canvas canvas){ Paint paint = new Paint();//创建画笔对象 canvas.drawColor(Color.BLACK); canvas.drawBitmap(bmpMan,centerX-radius,centerY-radius,null);//绘制英雄 paint.setColor(Color.BLACK);//设置画笔颜色 paint.setAntiAlias(true);//设置抗锯齿 RectF oval =new RectF( centerX-radius-1,centerY-radius-2, centerX-radius-1+2*radius+2,centerY-radius-2+2*radius+4 ); canvas.drawArc(oval, 360-angle+90*direction, 2*angle, true, paint);//绘制扇形实现张嘴闭嘴 if(System.currentTimeMillis()-timeStamp>5000){//如果时间间隔超过5秒 timeStamp = System.currentTimeMillis();//重新记录时间 currPhoto = (currPhoto+1) % bmpPhotos.length;//更换照片 } canvas.drawBitmap(bmpPhotos[currPhoto], 80,40,null); super.onDraw(canvas); } }
(2)MyThread类开发,代码如下
package sa.dsa; public class MyThread extends Thread{ int sleepSpan = 30;//休眠时间 MyView myView;//MyView对象的引用 public MyThread(MyView myView){ this.myView = myView; } public void run(){//线程执行方法 while(true){ myView.angle=myView.angle+myView.angleChange;//修改角度值 if(myView.angle>MyView.ANGLE_MAX){//嘴巴张到最大进入闭嘴环节 myView.angleChange=-3;//设置角度为闭嘴 } else if(myView.angle<0){ myView.angleChange=+3; } //移动英雄 switch(myView.directi 4000 on){//判断英雄方向 case MyView.RIGHT: myView.centerX=myView.centerX+MyView.SPEED; break;//向右 case MyView.UP: myView.centerY=myView.centerY+MyView.SPEED; break;//向上 case MyView.LEFT: myView.centerX=myView.centerX-MyView.SPEED; break;//向左 case MyView.DOWN: myView.centerY=myView.centerY+MyView.SPEED; break;//向下 } if(myView.centerY+myView.radius>MyView.SCREEN_HEIGHT){ myView.centerY= myView.centerY-MyView.SPEED; }//碰到了下边界 if(myView.centerY-myView.radius<0){ myView.centerY= myView.centerY+MyView.SPEED; myView.direction=myView.RIGHT; } if(myView.centerX-myView.radius<0){ myView.centerX= myView.radius; } if(myView.centerX+myView.radius>MyView.SCREEN_WIDTH){ myView.centerX= myView.centerX-MyView.SPEED; myView.direction=MyView.DOWN; } myView.postInvalidate();//重绘MyView try{Thread.sleep(sleepSpan);}//休眠一段时间 catch(Exception e){e.printStackTrace();} } } }
(3)Activity部分的开发,Activity在本案例中相当于控制器的角色
package sa.dsa; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class Sample_8_1Activity extends Activity { MyView myView;//myView对象引用 MyThread mt;//MyThread对象引用 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); //设置不显示应用程序标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 myView = new MyView(this); setContentView(myView);//设置当前屏幕 mt=new MyThread(myView);//创建MyThread对象 mt.start();//启动MyThread } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories