实例9,在j2me中是使用了图层管理和地图图层,在android并没有这些,所以我用android的只是写了用于 android的图层管理器和地图图层,不过有些东西还没有实现,只实现了一些这个例子会用到的,还有setViewWindow的实现并没有完整,算法上可能会有些问题,虽然我没有测试出,如果有谁测试出来了,请告诉我,我会改正。
下面给出这个例子的效果图和MainView的代码。
package com.wjh.demon_8;
import com.wjh.midp_me.AndroidLayerManager; import com.wjh.midp_me.AndroidSprite; import com.wjh.midp_me.AndroidTiledLayer; 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.util.Log; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; public class MainView extends SurfaceView implements Callback,Runnable{ int keyCode = 0; Thread gameThread = null; boolean isGame = true; SurfaceHolder holder = null; Paint backPaint = null; Paint forePaint = null; //具体游戏相关 public AndroidTiledLayer m_TLayer; //管理场景 public int m_aCells[][] = //存储m_TLayer中各cell的取值 {{ 2, 2, 3, 2, 2, 2, 2, 2 ,2, 2, 3, 2, 2, 2, 2, 2 }, { 2, 3, 2, 4, 3, 4, 3, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 3, 3, 3, 4, 2, 4, 2 ,2, 2, 3, 2, 2, 2, 2, 2 }, { 2, 3, 2, 3, 3, 4, 1, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 4, 3, 3, 3, 3, 4, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 3, 2, 3, 3, 4, 3, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 2, 3, 3, 4, 1, 3, 3, 2 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}, { 4, 2, 2, 4, 2, 2, 4, 4 ,2, 2, 3, 2, 2, 2, 2, 2}}; public AndroidLayerManager m_Manager; //图层管理器,管理各个图层 public int m_nX = 0; //显示区域左上角的横坐标 public int m_nY = 0; //显示区域左上角的纵坐标 public MainView(Context context) { super(context); // TODO Auto-generated constructor stub setFocusable(true); getHolder().addCallback(this); holder = this.getHolder(); backPaint = new Paint(); backPaint.setColor(Color.BLACK); forePaint = new Paint(); //具体游戏相关 Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.map); //创建TiledLayer场景 m_TLayer = new AndroidTiledLayer( 16, 16, image, 32, 32 ); //设置场景的位置 m_TLayer.setPosition( 0, 0 ); LoadMap(); //将各个图层添入m_Manager m_Manager = new AndroidLayerManager(); m_Manager.append(m_TLayer); //设置m_Manager的显示区域 m_Manager.setViewWindow( m_nX, m_nY, getWidth(), getHeight() ); } public void LoadMap(){ //设置m_TLayer中各cell的值 for( int row = 0; row < 16; row ++ ){ for( int col = 0; col < 16; col ++ ){ m_TLayer.setCell( row, col, m_aCells[row][col] ); } } } @Override public void run() { // TODO Auto-generated method stub long startTime = System.currentTimeMillis(); while(isGame) { input(); logic(); doDraw(); try { long endTime = System.currentTimeMillis(); long sleepTime = endTime - startTime; if(sleepTime<100) { Thread.sleep(sleepTime); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //开始游戏主线程 public void start() { if(gameThread == null) { gameThread = new Thread(this); gameThread.start(); } } //停止游戏主线程 public void stop() { isGame = false; if(gameThread != null) { try { gameThread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //输入判断 public void input() { switch(this.keyCode) { case KeyEvent.KEYCODE_DPAD_UP: m_nY -= 5; break; case KeyEvent.KEYCODE_DPAD_DOWN: m_nY += 5; break; case KeyEvent.KEYCODE_DPAD_LEFT: m_nX -= 5; break; case KeyEvent.KEYCODE_DPAD_RIGHT: m_nX += 5; break; } m_Manager.setViewWindow(m_nX, m_nY, getWidth(), getHeight()); this.keyCode = 0; } //逻辑判断 public void logic() { } public void doDraw() { Canvas c = null; try { c = holder.lockCanvas(); synchronized (holder) { paint(c); } }finally{ if(c != null) { holder.unlockCanvasAndPost(c); } } } //画图 public void paint(Canvas canvas) { //用黑色清屏 canvas.drawRect(0, 0, getWidth(), getHeight(), forePaint); //从屏幕的(0,0)点开始显示图像 m_Manager.paint(canvas, forePaint); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub stop(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub this.keyCode = keyCode; return true; } }
apk文件(将后缀改为apk):Demon_8.zip
源代码文件:Demon_8.rar
与Activity不同,Service 自启动,运行在后台,不能与用户交互,退出应用时,Service还能运行。如MP3播放
Service的生命周期:onCreate -> onStart -> onDestroy (其中Service在onDestroy之前,onCreate只执行一次,onStart可以执行多次)
步骤:
1)创建一个Service类继承自Service,其中有onCreate(),onStart(Intent intent, int startId),onDestroy(),onBind()四个方法可以重写,其中onBind()一定要重写
2)在AndroidManifest.xml中注册Service,其中android:name要和创建的Service完全一致
3)开始服务:startService(intent);结束服务:stopService(intent)
绑定Service和Activity
假如没有结束服务的话,Service会一直运行直至关机,所以绑定可以使Activity在onStop时同时销毁Service
绑定的Service的生命周期:onCreate -> onBind -> onUnbind -> ondestroy
在MyService类中定义了一个MyBinder类,该类实际上是为了获得MyService的对象实例的。在ServiceConnection接口onServiceConnected方法中的第2个参数是一个IBinder类型的变量,将该参数转换成MyService.MyBinder对象,并使用MyBinder类中的getService方法获得MyService对象。在获得MyService对象后,就可以在Activity中随意操作MyService类了
注意事项
1)两者请不要混用,否则容易出现Service没被Destroy的情况。
如startService后再bindService,此时退出Activity之后unbindService,不会destroy
2)确保有bindService就有unBindService(绑定的会在退出时自动unbind),有startService就有stopService
popwindow通过setAnimationStyle(int animationStyle)函数来设置动画效果
android:windowEnterAnimation表示进入窗口动画
android:windowExitAnimation表示窗口退出动画
在res/values/style.xml代码:
在res/anim/popup_exit.xml声明所需退出动画
popupWindow.setAnimationStyle(R.style.PopupAnimation);
popupWindow.showAtLocation(findViewById(R.id.parent), Gravity.CENTER
| Gravity.CENTER, 0, 0);
popupWindow.update();
调用popupWindow.dismiss();语句。popwindow消失,自动调用消失动画popup_exit.xml
activity切换动画
public void onClick(View v) {
Intent intent = new Intent(ActivityAnim.this,ActivityTwo.class);
startActivity(intent);
overridePendingTransition(R.anim.act_enter,R.anim.act_exit);
}
overridePendingTransition(int ,int)函数,第一个参数为activity显示动画,第二个参数为退出动画,两个动画的xml文件存放在anim文件夹下
或者:getWindow().setWindowAnimations(R.style.window_animation);