Android 飛機大戰詳解與感悟
一.飛機大戰的整體思路:
飛機大戰的主要使用的方法大綱:
1.概略:
Android的飛機大戰用的是SurfaceView()來寫,那麼首先我們要繼承SurfaceView這個類,然後我們還需要用多執行緒的來執行,那麼還要實現Runnable以及SurfaceHolder.CallBack介面。實現多執行緒就必須要用到run()方法。
由於飛機大戰的大部分工作是需要畫圖片到app裡,那麼我們又會用到Canvas這個類,這個類是畫布類,所有的圖片都需要畫在Canvas的物件上。
然後,我們需要把圖片轉換成Bitmap格式。
那麼,總結一下:飛機大戰使用的最重要的一些類,介面和方法分別是
SurfaceView();Runnable;SurfaceHolder.CallBack;Canvas;Bitmap以及run()方法。
2.規劃大概要寫的類以及要實現的效果
(1)進入介面的類(Start):
構建一個Start類,這個介面上會有三張圖片:背景圖,logo圖,開始遊戲的按鈕圖。
那麼,我們就要定義三張圖片的X,Y座標變數,還有Bitmap變數,這些變數都用private進行修飾,這是用了Java的封裝,提高了程式碼的安全性。
然後,開始遊戲按鈕需要點選螢幕然後進入遊戲介面,這裡就用到了onTouchEvent()這個方法,那麼我們就需要在SurfaceView的子類裡複寫這個方法,然後把start類的touchEvent()方法呼叫過去。
(2)進入遊戲介面(需要多個類)
在進入到遊戲介面時,我們需要建背景類(Background)
boss飛機類(BossPlan),子彈類(MyBullet),爆炸類(Boom),
音效類(GameSoundPool) ,一共6個類。
首先,遊戲介面的背景需要滾動,那麼要在背景類(Background)將圖片進行無限的迴圈。
在遊戲介面,我們要移動自己的飛機和Boss飛機對戰,那麼自己飛機就需要可移動,那麼同樣要在MyPlan類裡寫一個touchEvent()方法。
boss飛機會進入瘋狂模式,那麼要在boss飛機類(BossPlan)寫一個方法來判斷它什麼時候進入這個模式以及持續的時間。
子彈發射出去有它的速度和頻率,那麼在子彈類(MyBullet)
子彈擊中飛機以及飛機撞到飛機會產生爆炸效果,我們需要在MyPlan和BossPlan類裡分別判斷飛機是否被擊中或者是否被撞到。
子彈發射會有聲音,以及爆炸時的爆炸聲,這時我們要在音效類(GameSoundPool)裡使用load()方法呼叫音效,然後再用play()方法播放。在使用音效前要先例項化SoundPool的物件,SoundPool是返回一個int型別的值,那麼要先int一個整數來接受它,這些變數的宣告都用private修飾。
3.分步進行詳細操作
(1)如何繪製迴圈滾動背景圖片
當第一張圖片的y軸大於螢幕的高度時,說明第一張圖片滾動結束了,用第二張圖片的y軸減去圖片高度,這時第一張圖片下一次的y軸就在這。
滾動邏輯程式碼:
public void logic() {
y1 += 3;
y2 += 3;
if (y1 > MySurfaceView.height) {
y1 = y2 - bitmap1.getHeight(); //當y軸大於手機螢幕高度,下一張圖的y軸減去圖片高度,第一張圖片下一次的y軸就在這
}
if (y2 > MySurfaceView.height) {
y2 = y1 - bitmap1.getHeight();
}
}
(2)如何繪製飛機
繪製飛機的圖片用Canvas的物件呼叫draw()方法就行了,由於飛機需要根據手指移動,那麼就要判斷當手指的座標在飛機內移動,飛機才會跟隨移動,否則飛機不動。
觸控事件就要用toTouchEveny()方法來寫,boss飛機有瘋狂模式,要定義一個計數器來判斷它進入瘋狂模式的時間
觸控事件邏輯程式碼:
public void touchEvent(MotionEvent event) { //移動飛機
if (event.getAction() == MotionEvent.ACTION_MOVE) {
float ex = event.getX();//手指觸控的座標
float ey = event.getY();
if (ex > x && ex < x + width && ey > y && ey < y + height) {
x = (int) ex - width / 2;//起始座標(0,0)在左上角,移動的話會向反方向,把起始座標調整到它中間
y = (int) ey - height / 2;
if (y < 0) {
y = 0;
}
if (y > MySurfaceView.height - height) {
y = MySurfaceView.height - height;
}
if (x < 0) {
x = 0;
}
if (x > MySurfaceView.width - width) {
x = MySurfaceView.width - width;
}
}
}
}
判斷boss飛機是否進入瘋狂模式程式碼:
private int count; //瘋狂模式計數器
private int crazySpeed = 45; //瘋狂模式速讀
private int time = 200; //瘋狂模式時間
private boolean isCrazy; //是否進入瘋狂模式
public void logic(){
count++;
if(isCrazy){ //判斷boss飛機是否進入瘋狂模式
y = y+crazySpeed;
crazySpeed--;
if(y==0){
isCrazy = false;
crazySpeed = 50;
}
}else{
if(count%time==0){
isCrazy = true;
}
x = x+speed;
if(x < 0){
speed = -speed;
}
if(x > MySurfaceView.width - oneW){
speed = -speed;
}
}
}
(3)如何繪製子彈
子彈是連續發射的,那麼不光要將它畫出來,在MysurfaceView裡面還要定義兩個Vector陣列,分別用來新增我的飛機和Boss飛機射出的子彈,將每一發子彈都add進去,然後將子彈畫到介面裡,而且要判斷子彈是否飛出介面,一旦飛出介面,立馬將它刪除。
定義陣列程式碼:
private Vector<MyBullet> bulletVector = new Vector<>(); //用Vector陣列定義一個子彈類陣列
private Vector<MyBullet> bossBulletVector = new Vector<>(); //用Vector陣列定義一個boss子彈類陣列
繪製boss子彈程式碼:
if (count % 50 == 0) {
MyBullet bossBullet = new MyBullet(BitmapFactory.decodeResource(getResources(), R.mipmap.bossbullet), bossPlane.getX(), bossPlane.getY() + bossPlane.getOneH(), 1);
MyBullet bossBullet1 = new MyBullet(BitmapFactory.decodeResource(getResources(), R.mipmap.bossbullet), bossPlane.getX() + bossPlane.getOneW(), bossPlane.getY() + bossPlane.getOneH(), 1);
bossBulletVector.add(bossBullet); //把boss子彈物件加到boss子彈數組裡
bossBulletVector.add(bossBullet1);
}
for (int i = 0; i < bossBulletVector.size(); i++) {
bossBulletVector.elementAt(i).draw(canvas, paint);
myPlane.isCollision(bossBulletVector.elementAt(i));
}
繪製我的子彈程式碼:
if (count % 10 == 0) {
MyBullet myBullet = new MyBullet(BitmapFactory.decodeResource(getResources(), R.mipmap.mybullet), myPlane.getX(), myPlane.getY(), 0);
MyBullet myBullet1 = new MyBullet(BitmapFactory.decodeResource(getResources(), R.mipmap.mybullet), myPlane.getX() + myPlane.getWidth(), myPlane.getY(), 0);
bulletVector.add(myBullet);
bulletVector.add(myBullet1);
gameSoundPool.playSound(1);//新增射擊音效
}
for (int i = 0; i < bulletVector.size(); i++) {
bulletVector.elementAt(i).draw(canvas, paint);
if (bossPlane.isCollision(bulletVector.elementAt(i))){ //判斷我的子彈是否擊中boss飛機,擊中就畫一張爆炸圖
Boom boom = new Boom(BitmapFactory.decodeResource(getResources(),R.mipmap.boom),bossPlane.getX(),bossPlane.getY(),7);
boomVector.add(boom);
gameSoundPool.playSound(2); //在爆炸時新增爆炸音效
}
}
移除子彈程式碼:
//移除消失的boss子彈
for (int i = 0; i < bossBulletVector.size(); i++) {
if (bossBulletVector.elementAt(i).isDead()) {
bossBulletVector.remove(i);
}
}
//移除消失我的的子彈
for (int i = 0; i < bulletVector.size(); i++) {
if (bulletVector.elementAt(i).isDead()) {
bulletVector.remove(i);
}
}
判斷子彈是否超出邊界程式碼:
public void logic(){
switch (temp){
case 0:
y -= speed + 3; //我的子彈的座標
if(,y < 0){ //對我的子彈是否超過螢幕邊界判斷
isDead = true;
}
break;
case 1:
y += Bspeed + 3; //boss子彈的座標
if(y > MySurfaceView.height){ //對boss子彈是否超過螢幕邊界判斷
isDead = true;
}
break;
}
}
(4)如何判斷碰撞(子彈與飛機碰撞,飛機與飛機碰撞)
我的飛機如果受到了碰撞,那麼會進入一段時間的無敵狀態,要先定義一個boolean值,然後進行判斷,當碰撞到時,讓飛機閃爍,不然就不閃爍,這裡要定義一個計數器。
判斷飛機是否碰撞也是先定義一個Boolean值,然後對座標是否重合進行判斷,
判斷我的飛機是否是無敵時間程式碼:
private boolean noCollision; //判斷是否進入無敵時間
private int noCollisionCount; //無敵時間計數
public void draw(Canvas canvas, Paint paint) {
if (hp <= 0){
MySurfaceView.GameStart = 3;
}
if (noCollision) {
noCollisionCount++;
if (noCollisionCount % 10 == 0) {
canvas.drawBitmap(bitmap, x, y, paint); //飛機閃爍
}
if (noCollisionCount > 100) { //無敵時間
noCollision = false;
noCollisionCount = 0;
}
} else {
//非無敵時間
canvas.drawBitmap(bitmap, x, y, paint);
}
for (int i = 0; i < hp; i++) {
canvas.drawBitmap(bitmapHp, i * bitmapHp.getWidth(), MySurfaceView.height - bitmapHp.getHeight(), paint);
}
}
判斷我的飛機是否被碰撞程式碼:
/**
* 判斷子彈是否擊中飛機
*
* @param
* @return
*/
public boolean isCollision(MyBullet bullet) {
if (noCollision) {
return false;
} else {
if (bullet.getX() > x && bullet.getX() < x + width && bullet.getY() > y && bullet.getY() < y + height) {
noCollision = true;
if (hp > 0) {
hp--;
}
return true;
}
}
return false;
}
/**
* 判斷我的飛機是否撞上boss飛機
*/
public boolean isCollision(BossPlane bossPlane) {
if (noCollision){
return false;
}else {
if(y > bossPlane.getY()+bossPlane.getOneH()||y+height < bossPlane.getY()||x+width < bossPlane.getX()||x >bossPlane.getX()+bossPlane.getOneW()){
}else {
noCollision = true;
if (hp>0){
hp--;
}
return true;
}
}
return false;
}
判斷boss飛機是否被我的子彈擊中程式碼:
public boolean isCollision(MyBullet bullet){
if (bullet.getX() > x&&bullet.getX()+bullet.getBitmap().getWidth() < x+oneW&&bullet.getY() > y&&bullet.getY() < y+oneH){
bossHp--;
bullet.setDead(true);
if (bossHp < 0){
MySurfaceView.GameStart = 2;
}
return true;
}
return false;
}
(5)如何繪製爆炸效果
首先,爆炸的圖片不止一幀,要一幀一幀依次播放,先要定義兩個整數 幀數和播放第幾幀,
然後再用Vector陣列例項化一個爆炸陣列,把一幀一幀的圖片add進去,然後在繪製我的子彈時,進行判斷,如果我的子彈擊中boss飛機,那麼就將爆炸數組裡的圖片畫一次,然後將結束爆炸的圖刪去。
顯示爆炸圖片的邏輯程式碼:
public void logic() {
if (currentFrame < totalFrame) {
currentFrame++;
} else {
isEnd = true;
}
}
定義爆炸陣列:
private Vector<Boom>boomVector = new Vector<>(); //爆炸圖的陣列,顯示圖片的每一幀畫面
判斷我的子彈是否擊中boss飛機:
if (bossPlane.isCollision(bulletVector.elementAt(i))){ //判斷我的子彈是否擊中boss飛機,擊中就畫一張爆炸圖
Boom boom = new Boom(BitmapFactory.decodeResource(getResources(),R.mipmap.boom),bossPlane.getX(),bossPlane.getY(),7);
boomVector.add(boom);
}
(6)如何新增音效
這裡音效有兩種,一種是遊戲內的子彈聲和爆炸聲,還有一種是背景音樂,遊戲內聲音用的是
SoundPool來寫,背景音樂用MediaPlayer寫。遊戲內的音樂建一個類來寫,
先用load方法新增,再用play方法播放,最後用這個類的物件來呼叫play方法,再將它插入需要播放的地方,
背景音樂直接在 主類的run方法裡寫。
遊戲內音效程式碼:
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
public class GameSoundPool {
private SoundPool soundPool;
private int s1;
private int s2;
private int s3;
public GameSoundPool(Context context){
this.soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC,0);
s1 = soundPool.load(context,R.raw.shoot,1); //第二個引數是播放的音訊資源名,第三個引數是播放優先順序
s2 = soundPool.load(context,R.raw.explosion3,1);
s3 = soundPool.load(context,R.raw.bgm_zhuxuanlv,1);
}
public void playSound(int s){
switch (s){
case 1:
/**
* 第一個引數是 音效物件,第二和第三個引數是左,右聲道音量,第四個是優先順序,第五個是是否迴圈,第六個是播放倍速
*/
soundPool.play(s1,1,1,2,0,2f);//
break;
case 2:
soundPool.play(s2,1,1,1,0,1f);
break;
case 3:
soundPool.play(s3,1,1,3,0,2f);
}
}
}
將遊戲內音效新增到需要的地方
射擊聲:在繪製子彈裡新增
if (count % 10 == 0) {
MyBullet myBullet = new MyBullet(BitmapFactory.decodeResource(getResources(), R.mipmap.mybullet), myPlane.getX(), myPlane.getY(), 0);
MyBullet myBullet1 = new MyBullet(BitmapFactory.decodeResource(getResources(), R.mipmap.mybullet), myPlane.getX() + myPlane.getWidth(), myPlane.getY(), 0);
bulletVector.add(myBullet);
bulletVector.add(myBullet1);
gameSoundPool.playSound(1);//新增射擊音效
}
爆炸聲:在畫出爆炸圖時
for (int i = 0; i < bulletVector.size(); i++) {
bulletVector.elementAt(i).draw(canvas, paint);
if (bossPlane.isCollision(bulletVector.elementAt(i))){ //判斷我的子彈是否擊中boss飛機,擊中就畫一張爆炸圖
Boom boom = new Boom(BitmapFactory.decodeResource(getResources(),R.mipmap.boom),bossPlane.getX(),bossPlane.getY(),7);
boomVector.add(boom);
gameSoundPool.playSound(2); //在爆炸時新增爆炸音效
}
}
背景音樂程式碼:
/**
* 新增背景音樂
*/
mediaPlayer = MediaPlayer.create(getContext(),R.raw.balu);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
mediaPlayer.setVolume(1,1);
}
});
(7)有哪些地方使用了封裝,繼承,多型,方法過載等
方法過載:這裡判斷我的飛機是被子彈擊中,還是被boss飛機撞擊用了方法過載
程式碼
/**
* 判斷子彈是否擊中飛機
*
* @param
* @return
*/
public boolean isCollision(MyBullet bullet) {
if (noCollision) {
return false;
} else {
if (bullet.getX() > x && bullet.getX() < x + width && bullet.getY() > y && bullet.getY() < y + height) {
noCollision = true;
if (hp > 0) {
hp--;
}
return true;
}
}
return false;
}
/**
* 判斷我的飛機是否撞上boss飛機
*/
public boolean isCollision(BossPlane bossPlane) {
if (noCollision){
return false;
}else {
if(y > bossPlane.getY()+bossPlane.getOneH()||y+height < bossPlane.getY()||x+width < bossPlane.getX()||x >bossPlane.getX()+bossPlane.getOneW()){
}else {
noCollision = true;
if (hp>0){
hp--;
}
return true;
}
}
return false;
}
繼承和介面:主類繼承了SurfaceView,實現了Runnable和SurfaceHolder.Callback介面。
封裝:所有的類裡定義的變數都是用private修飾,都用到了封裝,體現了Java的安全性
比如:我的飛機類裡定義的變數都是private型。
程式碼:
private int x;
private int y;
private Bitmap bitmap;
private Bitmap bitmapHp;
private int height, width;
private boolean noCollision; //判斷是否進入無敵時間
private int noCollisionCount; //無敵時間計數
private int hp = 3; //血量初始值為三
如果別的類想要呼叫封裝的變數,可以用set,get’方法,比如:
get,set方法程式碼:
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getWidth() {
return width;
}
}
二.對於飛機大戰的收穫與感悟
經過一個月的學習,對以前學習過的和沒有學習過的Java知識進行了全面的複習和總結,在前幾周,沒有寫飛機大戰這個專案之前,我以為自己的基礎學習的還可以,對於基本的概念以經可以流暢的應用了,但是我也知道我自己的缺點在於不能把這些知識點串聯起來使用,我只時在每一小節的運用上比較熟練,但是當專案複雜以及涉及的內容和知識點過多時,就會產生一種力不從心的感覺,特別是讓我自己去寫一個專案的時候,常常是沒有任何的頭緒,不知道該從哪寫起,程式報錯了,也不會學著去看錯誤提示,不會自己試著改正。
通過這個專案的編寫,我學會了自我學習的習慣,知道要自己先思考問題,自己先解決錯誤,到最後在和別人討論,這樣才能收穫到更多的東西,才能吸取到精華,如果只是單單把別人的東西拿過來抄一遍,效果是沒什麼用。一定是自己思考過後。再討論才有更多自己的想法,而且有時候我覺得我不行,我寫不了,但是多想,多思考,然後再到網上學 ,這個問題說不定就能被我自己給解決了。這時,一種滿足感油然而生,這種滿足感會促使著我不斷的去學習,然後不斷地進步。
這一次寫飛機大戰這個專案,我有學會了使用AndroidStudio這個編譯工具,說起AndroidStudio的安裝,我還真費了好大的勁,最後重置了系統才把它搞定,但是有好多的報錯都是我自己一個一個去網上百度,自己解決的,這也加深了我對這些錯誤的理解,以後遇到了可以更好的去解決它們。
這一次的學習中,不光學到了技術,最重要的是還學到了一些態度,對待學習的態度,一定要多學,多思考,多問。不光是學習,很多方面都是如此。
最後,希望自己在接下來的時間裡,能把這個飛機大戰的專案多寫幾遍,把各種知識的串聯使用的熟練一點,然後再寫一些小專案來提升自己的實力。
相關推薦
Android 飛機大戰詳解與感悟
一.飛機大戰的整體思路: 飛機大戰的主要使用的方法大綱: 1.概略: Android的飛機大戰用的是SurfaceView()來寫,那麼首先我們要繼承SurfaceView這個類,然後我們還需要用多執行緒的來執行,那麼還要實現Runnable以及Surfa
【18.5.31 日常】Android專案——飛機大戰詳解
整體實現思路 通過兩張背景圖片實現背景滾動,同時做出能根據使用者觸控位置不同而改變位置的飛機,能夠不停地射出子彈,Boss同理,Boss移動方式隨機,同時新增小飛機以增強遊戲的表現力,外加例如鐳射之類的特殊遊戲模組來增強遊戲的可玩性,最後新增主介面和啟動介面來
飛機大戰詳解
整體實現思路 主要分為以下步驟 1.實現迴圈背景滾動 2.新增玩家飛機 3.玩家飛機發射子彈 4.新增Boss飛機 5.Boss飛機發射子彈 6.飛機被擊中血量減少及無敵狀態 7.玩家飛機和子彈碰撞,Boss和玩家飛機碰撞 8.子彈擊中飛機爆炸
Android之SharedPreferences詳解與原理分析
SharedPreferences作為Android儲存資料方式之一,主要特點是: 1. 只支援Java基本資料型別,不支援自定義資料型別; 2. 應用內資料共享; 3. 使用簡單. 使用方法 1、存資料 SharedPreferenc
Android觸控式螢幕事件派發機制詳解與原始碼分析三(Activity篇)
PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 【工匠若水 http://blog.csdn.net/yanbober】 該篇承接上一篇《Android觸控式螢幕事件派發機制詳解與原始碼分析
Android觸控式螢幕事件派發機制詳解與原始碼分析二(ViewGroup篇)
【工匠若水 http://blog.csdn.net/yanbober】 該篇承接上一篇《Android觸控式螢幕事件派發機制詳解與原始碼分析一(View篇)》,閱讀本篇之前建議先閱讀。當然,閱讀完這一篇之後可以閱讀繼續進階的下一篇《Android觸控式螢幕事件派發機制詳解與原始碼
Android觸控式螢幕事件派發機制詳解與原始碼分析一(View篇)
【工匠若水 http://blog.csdn.net/yanbober】 Notice:閱讀完該篇之後如果想繼續深入閱讀Android觸控式螢幕事件派發機制詳解與原始碼分析下一篇請點選《Android觸控式螢幕事件派發機制詳解與原始碼分析二(ViewGroup篇)》檢視。 1
Android中ImageSwitcher詳解(注意與圖片瀏覽器的區別)
先看看繼承關係,ImageSwitcher和TextSwitcher的繼承關係是一樣的。兩個重要的父類:ViewSwitcher和ViewAnimator 繼承於ViewSwitcher,說明具備了切換功能 繼承於ViewAnimator,說明具備了動畫功能 Image
Android Application詳解與用法
1:Application是什麼? Application和Activity,Service一樣,是android框架的一個系統元件,當android程式啟動時系統會建立一個 application物件,用來儲存系統的一些資訊。通常我們是不需要指定一個Applicat
Android控制元件之SlidingDrawer(滑動式抽屜)詳解與例項
SlidingDrawer效果想必大家也見到過,它就是1.5模擬器上進入應用程式列表的效果。下面是截圖 一、簡介 SlidingDrawer隱藏屏外的內容,並允許使用者通過handle以顯示隱藏內容。它可以垂直或水平滑動,它有倆個View組成,其
android matrix 最全方法詳解與進階
1 概述 這裡我們會詳細講解matrix的各個方法,以及它的用法。matrix叫做矩陣,在前面講解 ColorFilter 的文章中,我們講解了ColorMatrix,他是一個4*5的矩陣。而這裡,我們講解的Matrix不是用於處理顏色的,而是處理圖形的。他是一個3*3的
Android 微信支付詳解與Demo
最近公司弄Ionic框架,專案中需要微信支付,無奈,把我調過去弄,期間也是幾近崩潰,好在皇天不負有心人,在看別人的文件,終於是在專案中集成了微信支付,下面作為一個小白的我,想要把我的經驗分享給大家,希望對大家有所幫助。 先給一個可用的demo吧(執行前先看txt檔案) http://download.csd
Android開發之位置定位詳解與例項解析(GPS定位、Google網路定位,BaiduLBS(SDK)定位)
/** * 由經緯度獲取所在的城市及區域資訊 * @author caizhiming * */ private class ReadJSONFeedTask extends AsyncTask<String, Void, String> {
Linux與android程序間的通訊及android Binder機制詳解
關於程序之間的通訊又很多種方式,不同的方式適用於不同的場景。 五種不同形式的IPC形式 1.訊息傳遞(管道,FIFO和訊息佇列) 2.同步(互斥量,條件變數,讀寫鎖,檔案和記錄鎖,訊號量) 3.共享記憶體(匿名的和具名的) 4.遠端過程呼叫(Solaris門和Sun R
處女男學Android(十二)---Android 選單(Menu)詳解與應用
package com.wl.menusdemo; import android.app.ActionBar.LayoutParams; import android.app.Activity; import android.content.Context; import android.os.Bundle
WebView詳解與簡單Android與H5互調
為什麼要學習Android與H5互調? 微信,QQ空間等大量軟體都內嵌了H5,不得不說是一種趨勢。Android與H5互調可以讓我們的實現混合開發,至於混合開發就是在一個App中內嵌一個輕量級的瀏覽器,一部分原生的功能改為Html 5來開發。 優勢:使用H5實現的功能能夠在不升級App的情況下動態更
WebView詳解與簡單實現Android與H5互調
本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 為什麼要學習Android與H5互調? 微信,QQ空間等大量軟體都內嵌了H5,不得不說是一種趨勢。Android與H5互調可以讓我們的實現混合開發,至於混合開發就是在一個App中內嵌
Android入門——Broadcast Receiver詳解與應用
引言 作為Android四大元件之一——BroadcastReceive。BroadcastReceive廣泛運用在APP的開發中,其他的三大應用元件不同一樣,是唯一需要被動接收,即負責接收的廣播接收器永遠不知道什麼時候可以接收到廣播,這種機制其實有點像Eve
Android端與web端以及資料庫的建立它們之間的互動詳解與案例分析
本專案是筆者利用十天的實訓時間完成,之間掌握並學到了不少關於Android和web方面的知識,比如:json的資料交換,ListViewAdapter介面卡的使用以及網路請求web端互動的問題。趁熱打
android canvas layer (圖層)詳解與進階
1 概述 前面的canvas變換文章中,已經粗略的講解過saveLayer的知識,只是圖層的概念沒有詳細的講解。這裡將詳細講解layer。在使用相關方法和flag的時候,先關閉硬體加速。如果需要開啟,參照谷歌官方的硬體加速表格。硬體加速版本 2 save