锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓嬭澆鍦板潃
]]>
Android鎵嬫満 灞忓箷 澶у皬涓嶄竴錛屾湁480x320, 640x360, 800x480.鎬庢牱鎵嶈兘璁〢pp鑷姩 閫傚簲涓嶅悓鐨勫睆騫?鍛紵
鍏跺疄寰堢畝鍗曪紝鍙渶瑕佸湪res鐩綍涓嬪垱寤轟笉鍚岀殑layout鏂囦歡 澶癸紝姣斿layout-640x360,layout-800x480,鎵鏈夌殑layout鏂囦歡鍦ㄧ紪璇?涔嬪悗閮戒細鍐欏叆R.java閲岋紝鑰岀郴緇?浼氭牴鎹睆騫?鐨勫ぇ灝忚嚜宸遍夋嫨鍚堥傜殑layout榪涜浣跨敤銆?/p>
浜岋細hdpi銆乵dpi銆乴dpi
鍦ㄤ箣鍓嶇殑鐗堟湰涓紝鍙湁涓涓猟rawable錛岃?.1鐗堟湰涓湁drawable-mdpi銆乨rawable-ldpi銆乨rawable-hdpi涓変釜錛岃繖涓変釜涓昏鏄負浜嗘敮鎸佸鍒嗚鯨鐜囥?/p>
銆銆drawable- hdpi銆乨rawable- mdpi銆乨rawable-ldpi鐨勫尯鍒細
銆銆(1)drawable-hdpi閲岄潰瀛樻斁楂樺垎杈ㄧ巼鐨勫浘鐗?濡俉VGA (480x800),FWVGA (480x854)
銆銆(2)drawable-mdpi閲岄潰瀛樻斁涓瓑鍒嗚鯨鐜囩殑鍥劇墖,濡侶VGA (320x480)
銆銆(3)drawable-ldpi閲岄潰瀛樻斁浣庡垎杈ㄧ巼鐨勫浘鐗?濡俀VGA (240x320)
銆銆緋葷粺浼氭牴鎹満鍣ㄧ殑鍒嗚鯨鐜囨潵鍒嗗埆鍒拌繖鍑犱釜鏂囦歡澶歸噷闈㈠幓鎵懼搴旂殑鍥劇墖銆?/p>
銆銆鍦ㄥ紑鍙?紼嬪簭 鏃朵負浜嗗吋瀹逛笉鍚屽鉤鍙?涓嶅悓灞忓箷 錛屽緩璁悇鑷枃浠跺す鏍規嵁闇姹傚潎瀛樻斁涓嶅悓鐗堟湰鍥劇墖銆?/p>
灞忓箷 鏂瑰悜錛?/p>
妯睆绔栧睆鑷姩鍒囨崲錛?/p>
鍙互鍦╮es鐩綍涓嬪緩绔媗ayout-port鍜宭ayout-land涓や釜鐩綍錛岄噷闈㈠垎鍒斁緗珫灞忓拰妯睆涓ょ甯冨眬鏂囦歡錛岃繖鏍峰湪鎵嬫満灞忓箷 鏂瑰悜鍙樺寲鐨勬椂鍊欑郴緇熶細鑷姩璋冪敤鐩稿簲鐨勫竷灞鏂囦歡錛岄伩鍏嶄竴縐嶅竷灞鏂囦歡鏃犳硶婊¤凍涓ょ灞忓箷 鏄劇ず鐨勯棶棰樸?/p>
涓嶅垏鎹細
浠ヤ笅姝ラ鏄綉涓婃祦浼犵殑錛屼笉榪囨垜鑷繁涔嬪墠鏄氳繃鍥懼艦鍖栫晫闈?瀹炵幇榪欎釜閰嶇疆錛岀畻鏄畩閫斿悓褰掞紝鏈夌┖鎴戜細鎶婂浘鐗囪創涓婃潵銆?/p>
榪樿璇存槑涓鐐癸細姣忎釜activity 閮芥湁榪欎釜灞炴creenOrientation錛屾瘡涓猘ctivity閮介渶瑕佽緗?錛屽彲浠ヨ緗負绔栧睆錛坧ortrait錛夛紝涔熷彲浠ヨ緗負鏃犻噸鍔涙劅搴旓紙nosensor錛夈?/p>
瑕佽紼嬪簭鐣岄潰淇濇寔涓涓柟鍚戯紝涓嶉殢鎵嬫満鏂瑰悜杞姩鑰屽彉鍖栫殑澶勭悊鍔炴硶錛?
鍦ˋndroidManifest.xml閲岄潰閰嶇疆涓涓嬪氨鍙互浜嗐傚姞鍏ヨ繖涓琛宎ndroid :screenOrientation="landscape"銆?br />
渚嬪錛坙andscape鏄í鍚戯紝portrait鏄旱鍚戯級錛?/p>
浠g爜 :
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>
鍙﹀錛宎ndroid涓瘡嬈″睆騫?鐨勫垏鎹㈠姩浼氶噸鍚疉ctivity錛屾墍浠ュ簲璇ュ湪Activity閿姣佸墠淇濆瓨褰撳墠媧誨姩鐨勭姸鎬侊紝鍦ˋctivity鍐嶆Create鐨勬椂鍊欒澆鍏ラ厤緗紝閭f牱錛岃繘琛屼腑鐨勬父鎴?灝變笉浼氳嚜鍔ㄩ噸鍚簡錛?/p>
鏈夌殑紼嬪簭閫傚悎浠庣珫灞忓垏鎹㈠埌妯睆錛屾垨鑰呭弽榪囨潵錛岃繖涓椂鍊欐庝箞鍔炲憿錛熷彲浠ュ湪閰嶇疆Activity鐨勫湴鏂硅繘琛屽涓嬬殑閰嶇疆android:screenOrientation="portrait"銆傝繖鏍峰氨鍙互淇濊瘉鏄珫灞忔繪槸绔栧睆浜嗭紝鎴栬卨andscape妯悜銆?/p>
鑰屾湁鐨勭▼搴忔槸閫傚悎妯珫灞忓垏鎹㈢殑銆傚浣曞鐞嗗憿錛熼鍏堣鍦ㄩ厤緗瓵ctivity鐨勬椂鍊欒繘琛屽涓嬬殑閰嶇疆錛歛ndroid:configChanges="keyboardHidden|orientation"錛屽彟澶栭渶瑕侀噸鍐橝ctivity鐨?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鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/JavaTiger427/archive/2010/11/29/6043097.aspx
鏈緇堟垜浠祴璇曠殑濡備笅:
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 榪欓噷澶勭悊鍗沖彲
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 榪欓噷澶勭悊鍗沖彲
break;
case MotionEvent.ACTION_UP:
//Do sth
break;
}
}
}
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034698.aspx
1. SoundPool杞藉叆闊充箰鏂囦歡浣跨敤浜嗙嫭绔嬬殑綰跨▼錛屼笉浼氶樆濉濽I涓葷嚎紼嬬殑鎿嶄綔銆備絾鏄繖閲孉ndroid寮鍙戠綉鎻愰啋澶у濡傛灉闊蟲晥鏂囦歡榪囧ぇ娌℃湁杞藉叆瀹屾垚錛屾垜浠皟鐢╬lay鏂規硶鏃跺彲鑳戒駭鐢熶弗閲嶇殑鍚庢灉錛岃繖閲孉ndroid SDK鎻愪緵浜嗕竴涓猄oundPool.OnLoadCompleteListener綾繪潵甯姪鎴戜滑浜嗚В濯掍綋鏂囦歡鏄惁杞藉叆瀹屾垚錛屾垜浠噸杞?onLoadComplete(SoundPool soundPool, int sampleId, int status) 鏂規硶鍗沖彲鑾峰緱銆?
2. 浠庝笂闈㈢殑onLoadComplete鏂規硶鍙互鐪嬪嚭璇ョ被鏈夊緢澶氬弬鏁幫紝姣斿綾諱技id錛屾槸鐨凷oundPool鍦╨oad鏃跺彲浠ュ鐞嗗涓獟浣撲竴嬈″垵濮嬪寲騫舵斁鍏ュ唴瀛樹腑錛岃繖閲屾晥鐜囨瘮MediaPlayer楂樹簡寰堝銆?
3. SoundPool綾繪敮鎸佸悓鏃舵挱鏀懼涓煶鏁堬紝榪欏浜庢父鎴忔潵璇存槸鍗佸垎蹇呰鐨勶紝鑰孧ediaPlayer綾繪槸鍚屾鎵ц鐨勫彧鑳戒竴涓枃浠朵竴涓枃浠剁殑鎾斁銆?
SoundPool綾諱嬌鐢ㄧず渚嬩唬鐮?
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*/) ;
鏈夊叧杞藉叆闊蟲晥鐨勬柟娉曪紝鏈変互涓嬪嚑縐嶆柟娉?
view plaincopy to clipboardprint?
int load(Context context, int resId, int priority) //浠嶢PK璧勬簮杞藉叆
int load(FileDescriptor fd, long offset, long length, int priority) //浠嶧ileDescriptor瀵硅薄杞藉叆
int load(AssetFileDescriptor afd, int priority) //浠嶢sset瀵硅薄杞藉叆
int load(String path, int priority) //浠庡畬鏁存枃浠惰礬寰勫悕杞藉叆
int load(Context context, int resId, int priority) //浠嶢PK璧勬簮杞藉叆
int load(FileDescriptor fd, long offset, long length, int priority) //浠嶧ileDescriptor瀵硅薄杞藉叆
int load(AssetFileDescriptor afd, int priority) //浠嶢sset瀵硅薄杞藉叆
int load(String path, int priority) //浠庡畬鏁存枃浠惰礬寰勫悕杞藉叆
鎴戜滑鐪嬪埌浜嗘瘡涓猯oad鐨勯噸杞界増鏈殑鏈鍚庝竴涓弬鏁頒負浼樺厛綰э紝榪欓噷鐢ㄤ簬鎾斁澶氫釜鏂囦歡鏃訛紝緋葷粺浼氫紭鍏堝鐞嗕笉榪囩洰鍓岮ndroid123鎻愮ず澶уSDK鎻愬埌浜嗙洰鍓嶅茍娌℃湁瀹炵幇錛屾墍浠ユ病鏈夊疄闄呯殑鏁堟灉銆?
瀵逛簬鎾斁錛屽彲浠ヤ嬌鐢?play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) 鑰屽仠姝㈠垯鍙互浣跨敤 pause(int streamID) 鏂規硶錛岃繖閲岀殑streamID鍜宻oundID鍧囧湪鏋勯燬oundPool綾葷殑絎竴涓弬鏁頒腑鎸囨槑浜嗘繪暟閲忥紝鑰宨d浠?寮濮嬨?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034679.aspx
甯歌鐨勬垜浠彲鑳藉彧鑰冭檻QVGA錛孒VGA錛學VGA錛孎WVGA鍜孌VGA錛屼絾鏄姏鍘諱簡鎵嬫満涓嶈皥錛屽彲鑳藉鉤鏉夸嬌鐢ㄧ被浼?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鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034693.aspx
涓銆丩inearGradient綰挎ф笎鍙?/p>
鍦╝ndroid騫沖彴涓彁渚涗簡涓ょ閲嶈澆鏂瑰紡鏉ュ疄渚嬪寲璇ョ被鍒嗗埆涓猴紝浠栦滑鐨勪笉鍚屼箣澶勪負鍙傛暟涓涓縐嶆柟娉曞彲浠ョ敤棰滆壊鏁扮粍錛屽拰浣嶇疆鏉ュ疄鐜版洿緇嗚吇鐨勮繃娓℃晥鏋滐紝姣斿棰滆壊閲囨牱int[] colors鏁扮粍涓瓨鏀?0縐嶉鑹詫紝鍒欐笎鍙樺皢浼氶愪竴澶勭悊銆傝岀浜岀鏂規硶鍙傛暟浠呬負璧峰垵棰滆壊color0鍜屾渶緇堥鑹瞔olor1銆?/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); //鍙傛暟涓涓烘笎鍙樿搗鍒濈偣鍧愭爣x浣嶇疆錛屽弬鏁頒簩涓簓杞翠綅緗紝鍙傛暟涓夊拰鍥涘垎杈ㄥ搴旀笎鍙樼粓鐐癸紝鏈鍚庡弬鏁頒負騫抽摵鏂瑰紡錛岃繖閲岃緗負闀滃儚
Paint p=new Paint();
LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE,Shader.TileMode.MIRROR); //鍙傛暟涓涓烘笎鍙樿搗鍒濈偣鍧愭爣x浣嶇疆錛屽弬鏁頒簩涓簓杞翠綅緗紝鍙傛暟涓夊拰鍥涘垎杈ㄥ搴旀笎鍙樼粓鐐癸紝鏈鍚庡弬鏁頒負騫抽摵鏂瑰紡錛岃繖閲岃緗負闀滃儚
鍒氭墠Android寮鍙戠綉宸茬粡璁插埌Gradient鏄熀浜嶴hader綾伙紝鎵浠ユ垜浠氳繃Paint鐨剆etShader鏂規硶鏉ヨ緗繖涓笎鍙橈紝浠g爜濡備笅:
view plaincopy to clipboardprint?
p.setShader(lg);
canvas.drawCicle(0,0,200,p); //鍙傛暟3涓虹敾鍦嗙殑鍗婂緞錛岀被鍨嬩負float鍨嬨?nbsp;
p.setShader(lg);
canvas.drawCicle(0,0,200,p); //鍙傛暟3涓虹敾鍦嗙殑鍗婂緞錛岀被鍨嬩負float鍨嬨?
浜屻?RadialGradient闀滃儚娓愬彉
鏈変簡涓婇潰鐨勫熀紜錛屾垜浠竴璧鋒潵浜嗚В涓嬪緞鍚戞笎鍙樸傚拰涓婇潰鍙傛暟鍞竴涓嶅悓鐨勬槸錛屽緞鍚戞笎鍙樼涓変釜鍙傛暟鏄崐寰勶紝鍏朵粬鐨勫拰綰挎ф笎鍙樼浉鍚屻?/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绔嬩綋鏁堟灉鐨勬笎鍙樺彲浠ュ皾璇曠敤瑙掑害娓愬彉鏉ュ畬鎴愪竴涓渾閿ュ艦錛岀浉瀵規潵璇存瘮涓婇潰鏇寸畝鍗曪紝鍓嶄袱涓弬鏁頒負涓績鐐癸紝鐒跺悗閫氳繃杞藉叆鐨勯鑹叉潵騫沖潎鐨勬笎鍙樻覆鏌撱?/p>
view plaincopy to clipboardprint?
SweepGradient(float cx, float cy, int[] colors, float[] positions) //瀵逛簬鏈鍚庝竴涓弬鏁癝DK涓婄殑鎻忚堪涓篗ay 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.錛屾墍浠ndroid123寤鴻浣跨敤涓嬮潰鐨勯噸杞芥柟娉曪紝鏈柟娉曚竴鑸負NULL鍗沖彲銆?nbsp;
SweepGradient(float cx, float cy, int color0, int color1)
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://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); //璁劇疆濯掍綋婧愶紝榪欓噷Android123鎻愮ず澶у鏈被鐨刾ublic void play (Context context, Uri uri, boolean looping, int stream) 綾葷浜屼釜鍙傛暟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 { //閫氳繃澶氱嚎紼嬫柟寮忎笉闃誨璋冪敤鑰?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(); //榪欓噷涓轟簡嫻嬭瘯鎬ц兘錛屼紶閫掍簡寮濮嬫墽琛屽墠鐨勭郴緇焧ickcount璁℃椂鍣ㄥ?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); //璁劇疆濯掍綋婧愶紝榪欓噷Android123鎻愮ず澶у鏈被鐨刾ublic void play (Context context, Uri uri, boolean looping, int stream) 綾葷浜屼釜鍙傛暟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 { //閫氳繃澶氱嚎紼嬫柟寮忎笉闃誨璋冪敤鑰?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(); //榪欓噷涓轟簡嫻嬭瘯鎬ц兘錛屼紶閫掍簡寮濮嬫墽琛屽墠鐨勭郴緇焧ickcount璁℃椂鍣ㄥ?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();
}
}
涓鑸浜嶢ndroid娓告垙鑰岃█涓嬮潰鐨勪唬鐮佷笉鐢ㄨ冭檻錛屼竴鑸敤鎴烽兘鍦ㄤ氦浜掓搷浣滐紝涓嶄細鍑虹幇灞忓箷閿侀棶棰?/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() { //瑙i攣
if (mWakeLock != null) {
mWakeLock.release();
}
}
}
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034662.aspx
涓銆佹父鎴忓湴鍥劇紪杈戝櫒錛屽湪J2ME鏃朵唬鎴戜滑鍙兘閮芥槸鐢℅IF鍒嗗壊澶氬撫鎴朆MP涓婃斁緗涓浘鐗囬氳繃鍑忓皯鏂囦歡澶存潵鍘嬬緝浣撶Н錛屼絾鏄湪Android騫沖彴涓婂紑鍙戞父鎴忔垜浠笉闇瑕侀偅涔堣妭鐪侊紝涓嶈繃璧勬簮鐨勯噴鏀句粛鐒跺緢閲嶈錛屽惁鍒欎細鍑虹幇OutOfMemoryError榪欐牱鐨勬偛鍓у彂鐢熴備竴鑸畝鍗曠殑2D騫抽潰娓告垙鍦板浘閮芥槸浣跨敤浜岀淮鏁扮粍鏉ユ爣璁扮殑銆傛垜浠彲浠ユ兂璞$煩闃典腑鐨勬瘡涓厓绱犲搴旀瘡涓浘鐗囪祫婧愩傝緇嗙殑瀛樺偍鏂規硶鎴戜滑灝嗗湪涓嬫鍏蜂綋璁插埌銆?/p>
浜屻佹帶鍒舵柟寮忥紝鐢變簬妯増榪囧叧綾繪父鎴忎笉閫傚悎閲嶅姏鎰熷簲鎿嶄綔錛屾垜浠繖閲岄夋嫨灞忓箷涓嬫柟鍔犺涓涓尯鍩燂紝鏀劇疆涓娿佷笅銆佸乏銆佸彸鎸夐敭錛屽悓鏃跺彸渚х粰鍑哄父鐢ㄧ殑鏀誨嚮銆佽煩璺冩寜閽紝鑰屾父鎴忕殑鏆傚仠鍙互閫氳繃瑙︽帶瀹炵幇緇х畫鎴栨殏鍋溿?/p>
涓夈侀煶鏁堝鐞嗭紝甯歌鐨勪竴鑸湪鏀誨嚮姣斿鍑烘嫵銆佸彂灝勫瓙寮圭殑榪囩▼涓湁闊蟲晥錛屾垨瀵規墜鑷繁涓脊錛堝綋鐒跺浜嶢ndroid鍥懼艦寮鍙戞潵璇村氨鏄鎾炴嫻嬶級鏃跺彂鍑洪煶鏁堬紝璺寵穬銆佽繃鍏沖潎浼氶渶瑕佷竴浜涘0闊崇礌鏉愭枃浠訛紝涓鑸殑娓告垙榪橀渶瑕佽儗鏅煶涔愰厤鍚堢儤鎵樻父鎴忔皵姘涖?/p>
鍥涖佹父鎴忛昏緫錛岃繖鏄富瑕佺殑鍦版柟錛屾垜浠皢閫氳繃瀹炰緥浠g爜璁╁ぇ瀹朵簡瑙f父鎴忓紑鍙戜腑鏄浣曠殑鍗瘋醬銆佷漢鐗╃殑璺寵穬銆佹敾鍑繪湁鏁堝垽鏂嵆紕版挒媯嫻嬶紝鐢佃剳鏅鴻兘絳夌畻娉曢棶棰樸?/p>
浜斻佺粏鑺傚鐞嗭紝姣斿璁″垎錛岀瓑綰э紝娓告垙璁℃椂錛屽叧鍗℃。妗堢殑瀛樻。錛岃鍙栦互鍙婂紑鍦鴻璁★紝鍏沖崱榪囨浮鐨勮繃鍦哄姩鐢誨鐞嗐?/p>
榪欓噷Android寮鍙戠綉鎻愮ず澶у錛岀洰鍓嶅緢澶欽2ME鐨勬父鎴忓彲浠ヨ交鏉劇殑縐繪鍒癆ndroid騫沖彴錛屼富瑕佺殑緇嗚妭鍙浜嗚ВGoogle Android騫沖彴鐨勫浘褰㈢浉鍏抽棶棰樺嵆鍙紝涓昏鏄疊itmap銆丏rawable鍜孷iew綰跨▼澶勭悊闂銆?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://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鎻愮ず濡傛灉鎸夐敭鎸変笅鍚庡脊璧鋒椂瑙﹀彂
}
return true; //榪欎簺鏍囪涓哄鐞嗚繃錛屽垯涓嶅湪寰鍐呴儴浼犻?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鎻愮ず濡傛灉鎸夐敭鎸変笅鍚庡脊璧鋒椂瑙﹀彂
}
return true; //榪欎簺鏍囪涓哄鐞嗚繃錛屽垯涓嶅湪寰鍐呴儴浼犻?br />
default:
break;
}
return super.dispatchKeyEvent(event);
}
瀵逛簬娓告垙紿佺劧鏉ョ數璇濇垜浠竴鑸噰鍙栭氳繃PhoneStateListener綾繪彁渚涚殑public void onCallStateChanged (int state, String incomingNumber) 鍥炶皟鏂規硶鍙互鑾峰彇鐢佃瘽鐨勭姸鎬侊紝姣斿甯歌絀洪棽鏃禖ALL_STATE_IDLE銆佹潵鐢墊椂
CALL_STATE_RINGING鍜?CALL_STATE_OFFHOOK 鎽樻満閫氳瘽涓紝鏈夊叧澶勭悊鐨勭粏鑺傜綉鍙嬪彲浠ユ煡鐪婣ndroid Git欏圭洰涓殑Music錛屽湪Android寮婧愰」鐩腑緋葷粺鑷甫鐨勯煶涔愭挱鏀懼櫒鍙互寰堝ソ鐨勫鐞嗭紝姣斿鍦ㄩ氳瘽緇撴潫鍚庢仮澶嶉煶涔愭挱鏀撅紝鑰屾垜浠父鎴忛渶瑕佸仛鐨勫氨鏄浣忓綋鍓嶇殑娓告垙鐘舵佸敖閲忔暟鎹寔涔呭寲澶勭悊錛屼笉鑳藉洜涓洪暱鏃墮棿鐨勯氳瘽錛屾父鎴忕殑Activity琚竻鐞嗕簡錛岃繖閲屾垜浠竴鑸氳繃onSaveInstanceState鏉ヤ繚瀛樺綋鍓嶇獥鍙g殑涓浜涜褰曪紝閫氳繃Intent鏍囪鏉ヨ緋葷粺綆$悊濂芥垜浠父鎴忕殑鐢熷懡鍛ㄦ湡銆?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://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銆乸itch鍜宺oll錛岀浉淇″榪?D寮鍙戠殑緗戝弸涓嶄細瀵硅繖浜涢檶鐢熺殑錛屾垜浠氨鎶婁粬浠搴斾負緇晊銆亁銆亃 杞寸殑瑙掑害濂戒簡錛屽鏋滀綘浠病鏈夊榪?D鐩稿叧鐨勭煡璇嗚繖閲孉ndroid寮鍙戠綉鎺ㄨ崘澶у鍙互閫氳繃Cube渚嬪瓙 鑷畾涔塕ender鏉ヨ瀵熻繖涓変釜鍊煎搴旂珛鏂逛綋鐨勬棆杞搴︺?br /> Yaw鍦?0,0,0)涓紝 浠Oz鐨勫潗鏍囧鉤闈腑鍥寸粫y杞存棆杞紝濡傛灉鏄礋瑙掑垯鎴戜滑瀹氫箟涓篊WJ_YAW_LEFT 鍗沖線宸﹁竟鍊炬枩錛屽悓鐞嗘垜浠畾涔夊涓?
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鐨勫洓涓鹼紝浠婂ぉAndroid123緇欏ぇ瀹朵竴涓畝鍗曠ず渚嬶紝涓嶈冭檻鍏朵粬鍥犵礌錛屽湪public int accuracy 銆乸ublic Sensor sensor 銆乸ublic long timestamp 鍜?nbsp; public final float[] values 涓紝鎴戜滑鑾峰彇values鐨勬誕鐐規暟緇勬潵鍒ゆ柇鏂瑰悜銆?/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;
}
鏈夊叧鍋忓悜瑙掑害闂錛屾垜浠皢鍦ㄤ笅涓嬈¤緇嗚榪幫紝瀵逛簬涓鑸殑2D娓告垙錛屾垜浠彲浠ュ弬鑰冩湰鏂囨潵瀹炵幇閲嶅姏鎺у埗錛屾墍浠ユ諱綋鏉ヨAndroid娓告垙寮鍙戞瘮杈冪畝鍗曟槗鎳傦紝Android騫沖彴浣跨敤鐨凧ava 璇█榪樻槸寰堥傚悎鍋氭父鎴忕殑銆傚湪閫昏緫琛ㄨ揪涓婃洿娓呮櫚銆?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034640.aspx