实例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);