??xml version="1.0" encoding="utf-8" standalone="yes"?>
下蝲地址
]]>
Android手机 屏幕 大小不一Q有480x320, 640x360, 800x480.怎样才能让App自动 适应不同的屏q?呢?
其实很简单,只需要在res目录下创Z同的layout文g 夹,比如layout-640x360,layout-800x480,所有的layout文g在编?之后都会写入R.java里,而系l?会根据屏q?的大自己选择合适的layoutq行使用?/p>
二:hdpi、mdpi、ldpi
在之前的版本中,只有一个drawableQ?.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个Q这三个主要是ؓ了支持多分L率?/p>
drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图?如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分L率的囄,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的图?如QVGA (240x320)
pȝ会根据机器的分L率来分别到这几个文g多w面去扑֯应的囄?/p>
在开?E序 时ؓ了兼容不同^?不同屏幕 Q徏议各自文件夹Ҏ需求均存放不同版本囄?/p>
屏幕 方向Q?/p>
横屏竖屏自动切换Q?/p>
可以在res目录下徏立layout-port和layout-land两个目录Q里面分别放|竖屏和横屏两种布局文gQ这样在手机屏幕 方向变化的时候系l会自动调用相应的布局文gQ避免一U布局文g无法满两种屏幕 昄的问题?/p>
不切换:
以下步骤是网上流传的Q不q我自己之前是通过囑Ş化界?实现q个配置Q算是殊途同归,有空我会把图片脓上来?/p>
q要说明一点:每个activity 都有q个属性screenOrientationQ每个activity都需要设|?Q可以设|ؓ竖屏QportraitQ,也可以设|ؓ无重力感应(nosensorQ?/p>
要让E序界面保持一个方向,不随手机方向转动而变化的处理办法Q?
在AndroidManifest.xml里面配置一下就可以了。加入这一行android :screenOrientation="landscape"?br />
例如Qlandscape是横向,portrait是纵向)Q?/p>
代码 :
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ray.linkit"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".GamePlay"
android:screenOrientation="portrait"></activity>
<activity android:name=".OptionView"
android:screenOrientation="portrait"></activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ray.linkit"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".GamePlay"
android:screenOrientation="portrait"></activity>
<activity android:name=".OptionView"
android:screenOrientation="portrait"></activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
另外Qandroid中每ơ屏q?的切换动会重启ActivityQ所以应该在Activity销毁前保存当前zd的状态,在Activity再次Create的时候蝲入配|,那样Q进行中的游?׃会自动重启了Q?/p>
有的E序适合从竖屏切换到横屏Q或者反q来Q这个时候怎么办呢Q可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏L竖屏了,或者landscape横向?/p>
而有的程序是适合横竖屏切换的。如何处理呢Q首先要在配|Activity的时候进行如下的配置Qandroid:configChanges="keyboardHidden|orientation"Q另外需要重写Activity?onConfigurationChangedҎ。实现方式如下,不需要做太多的内容:
view plaincopy to clipboardprint?
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/29/6043097.aspx
最l我们测试的如下:
view plaincopy to clipboardprint?
public class TouchLayout extends RelativeLayout {
public Handler doubleTapHandler = null;
protected long lastDown = -1;
public final static long DOUBLE_TIME = 500;
public TouchLayout(Context context) {
super(context);
}
public TouchLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TouchLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public boolean onTouchEvent(MotionEvent event) {
this.handleEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
long nowDown = System.currentTimeMillis();
if (nowDown - lastDown < DOUBLE_TIME)
{
if (doubleTapHandler != null)
doubleTapHandler.sendEmptyMessage(-1);
} else {
lastDown = nowDown;
}
}
return true;
}
protected void handleEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Do sth q里处理卛_
break;
case MotionEvent.ACTION_UP:
//Do sth
break;
}
}
}
public class TouchLayout extends RelativeLayout {
public Handler doubleTapHandler = null;
protected long lastDown = -1;
public final static long DOUBLE_TIME = 500;
public TouchLayout(Context context) {
super(context);
}
public TouchLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TouchLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public boolean onTouchEvent(MotionEvent event) {
this.handleEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
long nowDown = System.currentTimeMillis();
if (nowDown - lastDown < DOUBLE_TIME)
{
if (doubleTapHandler != null)
doubleTapHandler.sendEmptyMessage(-1);
} else {
lastDown = nowDown;
}
}
return true;
}
protected void handleEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Do sth q里处理卛_
break;
case MotionEvent.ACTION_UP:
//Do sth
break;
}
}
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034698.aspx
1. SoundPool载入音乐文g使用了独立的U程Q不会阻塞UIȝE的操作。但是这里Android开发网提醒大家如果x文gq大没有载入完成Q我们调用playҎ时可能生严重的后果Q这里Android SDK提供了一个SoundPool.OnLoadCompleteListenercL帮助我们了解媒体文g是否载入完成Q我们重?onLoadComplete(SoundPool soundPool, int sampleId, int status) Ҏ卛_获得?
2. 从上面的onLoadCompleteҎ可以看出该类有很多参敎ͼ比如cMidQ是的SoundPool在load时可以处理多个媒体一ơ初始化q放入内存中Q这里效率比MediaPlayer高了很多?
3. SoundPoolcL持同时播攑֤个音效,q对于游戏来说是十分必要的,而MediaPlayercL同步执行的只能一个文件一个文件的播放?
SoundPoolcM用示例代?
view plaincopy to clipboardprint?
SoundPool sp=new SoundPool(8, /*maxStreams*/, AudioManager.STREAM_MUSIC /*streamType*/, 100 /*srcQuality*/) ;
SoundPool sp=new SoundPool(8, /*maxStreams*/, AudioManager.STREAM_MUSIC /*streamType*/, 100 /*srcQuality*/) ;
有关载入x的方法,有以下几U方?
view plaincopy to clipboardprint?
int load(Context context, int resId, int priority) //从APK资源载入
int load(FileDescriptor fd, long offset, long length, int priority) //从FileDescriptor对象载入
int load(AssetFileDescriptor afd, int priority) //从Asset对象载入
int load(String path, int priority) //从完整文件\径名载入
int load(Context context, int resId, int priority) //从APK资源载入
int load(FileDescriptor fd, long offset, long length, int priority) //从FileDescriptor对象载入
int load(AssetFileDescriptor afd, int priority) //从Asset对象载入
int load(String path, int priority) //从完整文件\径名载入
我们看到了每个load的重载版本的最后一个参Cؓ优先U,q里用于播放多个文gӞpȝ会优先处理不q目前Android123提示大家SDK提到了目前ƈ没有实现Q所以没有实际的效果?
对于播放Q可以?play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) 而停止则可以使用 pause(int streamID) ҎQ这里的streamID和soundID均在构造SoundPoolcȝW一个参C指明了L量,而id?开始?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034679.aspx
常规的我们可能只考虑QVGAQHVGAQWVGAQFWVGA和DVGAQ但是抛M手机不谈Q可能^板用类?WSVGA?024x576以及WXGA?280x768{等?/p>
QVGA = 320 * 240;
WQVGA = 320 * 480;
WQVGA2 = 400 * 240;
WQVGA3 = 432 * 240;
HVGA = 480 * 320;
VGA = 640 * 480;
WVGA = 800 * 480;
WVGA2 = 768 * 480;
FWVGA = 854 * 480;
DVGA = 960 * 640;
PAL = 576 * 520;
NTSC = 486 * 440;
SVGA = 800 * 600;
WSVGA = 1024 * 576;
XGA = 1024 * 768;
XGAPLUS = 1152 * 864;
HD720 = 1280 * 720;
WXGA = 1280 * 768;
WXGA2 = 1280 * 800;
WXGA3 = 1280 * 854;
SXGA = 1280 * 1024;
WXGA4 = 1366 * 768;
SXGAMINUS = 1280 * 960;
SXGAPLUS = 1400 * 1050;
WXGAPLUS = 1440 * 900;
HD900 = 1600 * 900;
WSXGA = 1600 * 1024;
WSXGAPLUS = 1680 * 1050;
UXGA = 1600 * 1200;
HD1080 = 1920 * 1080;
QWXGA = 2048 * 1152;
WUXGA = 1920 * 1200;
TXGA = 1920 * 1400;
QXGA = 2048 * 1536;
WQHD = 2560 * 1440;
WQXGA = 2560 * 1600;
QSXGA = 2560 * 2048;
QSXGAPLUS = 2800 * 2100;
WQSXGA = 3200 * 2048;
QUXGA = 3200 * 2400;
QFHD = 3840 * 2160;
WQUXGA = 3840 * 2400;
HD4K = 4096 * 2304;
HXGA = 4096 * 3072;
WHXGA = 5120 * 3200;
HSXGA = 5120 * 4096;
WHSXGA = 6400 * 4096;
HUXGA = 6400 * 4800;
SHV = 7680 * 4320;
WHUXGA = 7680 * 4800;
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034693.aspx
一、LinearGradientU性渐?/p>
在androidq_中提供了两种重蝲方式来实例化该类分别为,他们的不同之处ؓ参数中第一U方法可以用颜色数组Q和位置来实现更l腻的过渡效果,比如颜色采样int[] colors数组中存?0U颜Ԍ则渐变将会逐一处理。而第二种Ҏ参数仅ؓ起初颜色color0和最l颜色color1?/p>
view plaincopy to clipboardprint?
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
使用实例如下
view plaincopy to clipboardprint?
Paint p=new Paint();
LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR); //参数一为渐变v初点坐标x位置Q参C为y轴位|,参数三和四分辨对应渐变终点,最后参Cؓq铺方式Q这里设|ؓ镜像
Paint p=new Paint();
LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR); //参数一为渐变v初点坐标x位置Q参C为y轴位|,参数三和四分辨对应渐变终点,最后参Cؓq铺方式Q这里设|ؓ镜像
刚才Android开发网已经讲到Gradient是基于Shaderc,所以我们通过Paint的setShaderҎ来设|这个渐变,代码如下:
view plaincopy to clipboardprint?
p.setShader(lg);
canvas.drawCicle(0,0,200,p); //参数3为画圆的半径Q类型ؓfloat型?nbsp;
p.setShader(lg);
canvas.drawCicle(0,0,200,p); //参数3为画圆的半径Q类型ؓfloat型?
二?RadialGradient镜像渐变
有了上面的基Q我们一h了解下径向渐变。和上面参数唯一不同的是Q径向渐变第三个参数是半径,其他的和U性渐变相同?/p>
view plaincopy to clipboardprint?
RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)
RadialGradient(float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile)
RadialGradient(float x, float y, float radius, int color0, int color1, Shader.TileMode tile)
三?SweepGradient角度渐变
对于一?D立体效果的渐变可以尝试用角度渐变来完成一个圆锥ŞQ相Ҏ说比上面更简单,前两个参Cؓ中心点,然后通过载入的颜色来q_的渐变渲染?/p>
view plaincopy to clipboardprint?
SweepGradient(float cx, float cy, int[] colors, float[] positions) //对于最后一个参数SDK上的描述为May be NULL. The relative position of each corresponding color in the colors array, beginning with 0 and ending with 1.0. If the values are not monotonic, the drawing may produce unexpected results. If positions is NULL, then the colors are automatically spaced evenly.Q所以Android123使用下面的重载方法,本方法一般ؓNULL卛_?nbsp;
SweepGradient(float cx, float cy, int color0, int color1)
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034673.aspx
view plaincopy to clipboardprint?
import android.content.Context;
import android.net.Uri;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
import java.io.IOException;
import java.lang.IllegalStateException;
import java.util.LinkedList;
public class AsyncPlayer {
private static final int PLAY = 1;
private static final int STOP = 2;
private static final boolean mDebug = false;
private static final class Command {
int code;
Context context;
Uri uri;
boolean looping;
int stream;
long requestTime;
public String toString() {
return "{ code=" + code + " looping=" + looping + " stream=" + stream
+ " uri=" + uri + " }";
}
}
private LinkedList<Command> mCmdQueue = new LinkedList(); //用一个链表保存播攑֏数队?nbsp;
private void startSound(Command cmd) {
try {
MediaPlayer player = new MediaPlayer();
player.setAudioStreamType(cmd.stream);
player.setDataSource(cmd.context, cmd.uri); //讄媒体源,q里Android123提示大家本类的public void play (Context context, Uri uri, boolean looping, int stream) cȝ二个参数Uri为媒体位|?nbsp;
player.setLooping(cmd.looping);
player.prepare();
player.start();
if (mPlayer != null) {
mPlayer.release();
}
mPlayer = player;
}
catch (IOException e) {
Log.w(mTag, "error loading sound for " + cmd.uri, e);
} catch (IllegalStateException e) {
Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);
}
}
private final class Thread extends java.lang.Thread { //通过多线E方式不d调用?nbsp;
Thread() {
super("AsyncPlayer-" + mTag);
}
public void run() {
while (true) {
Command cmd = null;
synchronized (mCmdQueue) { //同步方式执行
cmd = mCmdQueue.removeFirst();
}
switch (cmd.code) {
case PLAY:
startSound(cmd);
break;
case STOP:
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
} else {
Log.w(mTag, "STOP command without a player");
}
break;
}
synchronized (mCmdQueue) {
if (mCmdQueue.size() == 0) {
mThread = null;
releaseWakeLock();
return;
}
}
}
}
}
private String mTag;
private Thread mThread;
private MediaPlayer mPlayer;
private PowerManager.WakeLock mWakeLock;
private int mState = STOP;
public AsyncPlayer(String tag) {
if (tag != null) {
mTag = tag;
} else {
mTag = "AsyncPlayer";
}
}
public void play(Context context, Uri uri, boolean looping, int stream) {
Command cmd = new Command();
cmd.requestTime = SystemClock.uptimeMillis(); //q里Z试性能Q传递了开始执行前的系ltickcount计时器?nbsp;
cmd.code = PLAY;
cmd.context = context;
cmd.uri = uri;
cmd.looping = looping;
cmd.stream = stream;
synchronized (mCmdQueue) {
enqueueLocked(cmd);
mState = PLAY;
}
}
public void stop() {
synchronized (mCmdQueue) {
if (mState != STOP) {
Command cmd = new Command();
cmd.requestTime = SystemClock.uptimeMillis();
cmd.code = STOP;
enqueueLocked(cmd);
mState = STOP;
}
}
}
private void enqueueLocked(Command cmd) {
mCmdQueue.add(cmd);
if (mThread == null) {
acquireWakeLock();
mThread = new Thread();
mThread.start();
}
}
import android.content.Context;
import android.net.Uri;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
import java.io.IOException;
import java.lang.IllegalStateException;
import java.util.LinkedList;
public class AsyncPlayer {
private static final int PLAY = 1;
private static final int STOP = 2;
private static final boolean mDebug = false;
private static final class Command {
int code;
Context context;
Uri uri;
boolean looping;
int stream;
long requestTime;
public String toString() {
return "{ code=" + code + " looping=" + looping + " stream=" + stream
+ " uri=" + uri + " }";
}
}
private LinkedList<Command> mCmdQueue = new LinkedList(); //用一个链表保存播攑֏数队?br />
private void startSound(Command cmd) {
try {
MediaPlayer player = new MediaPlayer();
player.setAudioStreamType(cmd.stream);
player.setDataSource(cmd.context, cmd.uri); //讄媒体源,q里Android123提示大家本类的public void play (Context context, Uri uri, boolean looping, int stream) cȝ二个参数Uri为媒体位|?br />
player.setLooping(cmd.looping);
player.prepare();
player.start();
if (mPlayer != null) {
mPlayer.release();
}
mPlayer = player;
}
catch (IOException e) {
Log.w(mTag, "error loading sound for " + cmd.uri, e);
} catch (IllegalStateException e) {
Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);
}
}
private final class Thread extends java.lang.Thread { //通过多线E方式不d调用?br />
Thread() {
super("AsyncPlayer-" + mTag);
}
public void run() {
while (true) {
Command cmd = null;
synchronized (mCmdQueue) { //同步方式执行
cmd = mCmdQueue.removeFirst();
}
switch (cmd.code) {
case PLAY:
startSound(cmd);
break;
case STOP:
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
} else {
Log.w(mTag, "STOP command without a player");
}
break;
}
synchronized (mCmdQueue) {
if (mCmdQueue.size() == 0) {
mThread = null;
releaseWakeLock();
return;
}
}
}
}
}
private String mTag;
private Thread mThread;
private MediaPlayer mPlayer;
private PowerManager.WakeLock mWakeLock;
private int mState = STOP;
public AsyncPlayer(String tag) {
if (tag != null) {
mTag = tag;
} else {
mTag = "AsyncPlayer";
}
}
public void play(Context context, Uri uri, boolean looping, int stream) {
Command cmd = new Command();
cmd.requestTime = SystemClock.uptimeMillis(); //q里Z试性能Q传递了开始执行前的系ltickcount计时器?br />
cmd.code = PLAY;
cmd.context = context;
cmd.uri = uri;
cmd.looping = looping;
cmd.stream = stream;
synchronized (mCmdQueue) {
enqueueLocked(cmd);
mState = PLAY;
}
}
public void stop() {
synchronized (mCmdQueue) {
if (mState != STOP) {
Command cmd = new Command();
cmd.requestTime = SystemClock.uptimeMillis();
cmd.code = STOP;
enqueueLocked(cmd);
mState = STOP;
}
}
}
private void enqueueLocked(Command cmd) {
mCmdQueue.add(cmd);
if (mThread == null) {
acquireWakeLock();
mThread = new Thread();
mThread.start();
}
}
一般对于Android游戏而言下面的代码不用考虑Q一般用户都在交互操作,不会出现屏幕锁问?/p>
view plaincopy to clipboardprint?
public void setUsesWakeLock(Context context) { //甉|理wakelock处理
if (mWakeLock != null || mThread != null) {
throw new RuntimeException("assertion failed mWakeLock=" + mWakeLock
+ " mThread=" + mThread);
}
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mTag);
}
private void acquireWakeLock() { //加锁
if (mWakeLock != null) {
mWakeLock.acquire();
}
}
private void releaseWakeLock() { //解锁
if (mWakeLock != null) {
mWakeLock.release();
}
}
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034662.aspx
一、游戏地囄辑器Q在J2ME时代我们可能都是用GIF分割多或BMP上放|多个图片通过减少文g头来压羃体积Q但是在Androidq_上开发游戏我们不需要那么节省,不过资源的释放仍然很重要Q否则会出现OutOfMemoryErrorq样的悲剧发生。一般简单的2Dq面游戏地图都是使用二维数组来标记的。我们可以想象矩阵中的每个元素对应每个图片资源。详l的存储Ҏ我们在下次具体讲到?/p>
二、控制方式,׃横版q关cL戏不适合重力感应操作Q我们这里选择屏幕下方加设一个区域,攄上、下、左、右按键Q同时右侧给出常用的d、蟩跃按钮,而游戏的暂停可以通过触控实现l箋或暂停?/p>
三、音效处理,常规的一般在d比如出拳、发子弹的q程中有xQ或Ҏ自己中弹Q当然对于Android囑Ş开发来说就是碰撞检)时发出音效,跌、过兛_会需要一些声音素材文Ӟ一般的游戏q需要背景音乐配合烘托游戏气氛?/p>
四、游戏逻辑Q这是主要的地方Q我们将通过实例代码让大家了解游戏开发中是如何的卯u、h物的跌、攻L效判断即撞,电脑{算法问题?/p>
五、细节处理,比如计分Q等U,游戏计时Q关卡档案的存档Q读取以及开计,兛_q渡的过场动d理?/p>
q里Android开发网提示大家Q目前很多J2ME的游戏可以轻杄UL到Androidq_Q主要的l节只要了解Google Androidq_的图形相关问题即可,主要是Bitmap、Drawable和ViewU程处理问题?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034645.aspx
view plaincopy to clipboardprint?
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
switch (event.getKeyCode())
{
case KeyEvent.KEYCODE_VOLUME_UP: //音量?
case KeyEvent.KEYCODE_VOLUME_DOWN: //音量?
case KeyEvent.KEYCODE_CAMERA: //拍照?nbsp;
case KeyEvent.KEYCODE_FOCUS: //拍照键半按的对焦状?nbsp;
// event.getAction() == KeyEvent.ACTION_UP //Android123提示如果按键按下后弹h触发
}
return true; //q些标记为处理过Q则不在往内部传?nbsp;
default:
break;
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
switch (event.getKeyCode())
{
case KeyEvent.KEYCODE_VOLUME_UP: //音量?
case KeyEvent.KEYCODE_VOLUME_DOWN: //音量?
case KeyEvent.KEYCODE_CAMERA: //拍照?br />
case KeyEvent.KEYCODE_FOCUS: //拍照键半按的对焦状?br />
// event.getAction() == KeyEvent.ACTION_UP //Android123提示如果按键按下后弹h触发
}
return true; //q些标记为处理过Q则不在往内部传?br />
default:
break;
}
return super.dispatchKeyEvent(event);
}
对于游戏H然来电话我们一般采取通过PhoneStateListenercL供的public void onCallStateChanged (int state, String incomingNumber) 回调Ҏ可以获取电话的状态,比如常规I闲时CALL_STATE_IDLE、来甉|
CALL_STATE_RINGING?CALL_STATE_OFFHOOK 摘机通话中,有关处理的细节网友可以查看Android Git目中的MusicQ在Android开源项目中pȝ自带的音乐播攑֙可以很好的处理,比如在通话l束后恢复音乐播放,而我们游戏需要做的就是记住当前的游戏状态尽量数据持久化处理Q不能因为长旉的通话Q游戏的Activity被清理了Q这里我们一般通过onSaveInstanceState来保存当前窗口的一些记录,通过Intent标记来让pȝ理好我们游戏的生命周期?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034653.aspx
view plaincopy to clipboardprint?
public static final int CWJ_UP = 0;
public static final int CWJ_DOWN = 1;
public static final int CWJ_LEFT = 2;
public static final int CWJ_RIGHT = 4;
public static final int CWJ_FORWARD = 8; //向前
public static final int CWJ_BACKWARD = 16; //向后
public static final int CWJ_UP = 0;
public static final int CWJ_DOWN = 1;
public static final int CWJ_LEFT = 2;
public static final int CWJ_RIGHT = 4;
public static final int CWJ_FORWARD = 8; //向前
public static final int CWJ_BACKWARD = 16; //向后
下面我们做精的角度旋{修正值定义,我们用到yaw、pitch和rollQ相信学q?D开发的|友不会对这些陌生的Q我们就把他们对应ؓly、x、z 轴的角度好了Q如果你们没有学q?D相关的知识这里Android开发网推荐大家可以通过Cube例子 自定义Render来观察这三个值对应立方体的旋转角度?br /> Yaw?0,0,0)中, 以xOz的坐标^面中围绕y轴旋转,如果是负角则我们定义为CWJ_YAW_LEFT 卛_左边倾斜Q同理我们定义如?
view plaincopy to clipboardprint?
public static final int CWJ_YAW_LEFT = 0;
public static final int CWJ_YAW_RIGHT = 1;
public static final int CWJ_PITCH_UP = 2;
public static final int CWJ_PITCH_DOWN = 4;
public static final int CWJ_ROLL_LEFT = 8;
public static final int CWJ_ROLL_RIGHT = 16;
public static final int CWJ_YAW_LEFT = 0;
public static final int CWJ_YAW_RIGHT = 1;
public static final int CWJ_PITCH_UP = 2;
public static final int CWJ_PITCH_DOWN = 4;
public static final int CWJ_ROLL_LEFT = 8;
public static final int CWJ_ROLL_RIGHT = 16;
我们通过加速感应器可以获得SensorEvent的四个|今天Android123l大家一个简单示例,不考虑其他因素Q在public int accuracy 、public Sensor sensor 、public long timestamp ?nbsp; public final float[] values 中,我们获取values的QҎl来判断方向?/p>
view plaincopy to clipboardprint?
int nAndroid123=CWJ_UP //向上
float ax = values[0];
float ay = values[1];
float az = values[2];
float absx = Math.abs(ax);
float absy = Math.abs(ay);
float absz = Math.abs(az);
if (absx > absy && absx > absz) {
if (ax > 0) {
nAndroid123 = CWJ_RIGHT;
} else {
nAndroid123 = CWJ_LEFT;
}
} else if (absy > absx && absy > absz) {
if (ay > 0) {
nAndroid123= CWJ_FORWARD;
} else {
nAndroid123= CWJ_BACKWARD;
}
} else if (absz > absx && absz > absy) {
if (az > 0) {
nAndroid123 = CWJ_UP;
} else {
nAndroid123 = CWJ_DOWN;
}
} else {
nAndroid123 = CWJ_UNKNOWN;
}
int nAndroid123=CWJ_UP //向上
float ax = values[0];
float ay = values[1];
float az = values[2];
float absx = Math.abs(ax);
float absy = Math.abs(ay);
float absz = Math.abs(az);
if (absx > absy && absx > absz) {
if (ax > 0) {
nAndroid123 = CWJ_RIGHT;
} else {
nAndroid123 = CWJ_LEFT;
}
} else if (absy > absx && absy > absz) {
if (ay > 0) {
nAndroid123= CWJ_FORWARD;
} else {
nAndroid123= CWJ_BACKWARD;
}
} else if (absz > absx && absz > absy) {
if (az > 0) {
nAndroid123 = CWJ_UP;
} else {
nAndroid123 = CWJ_DOWN;
}
} else {
nAndroid123 = CWJ_UNKNOWN;
}
有关偏向角度问题Q我们将在下一ơ详l讲qͼ对于一般的2D游戏Q我们可以参考本文来实现重力控制Q所以M来说Android游戏开发比较简单易懂,Androidq_使用的Java 语言q是很适合做游戏的。在逻辑表达上更清晰?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034640.aspx