1. 程式人生 > >Android 飛機大戰詳解與感悟

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)

我的飛機類(MyPlan)
boss飛機類(BossPlan)子彈類(MyBullet)爆炸類(Boom)
音效類(GameSoundPool) ,一共6個類。
首先,遊戲介面的背景需要滾動,那麼要在背景類(Background)將圖片進行無限的迴圈
在遊戲介面,我們要移動自己的飛機和Boss飛機對戰,那麼自己飛機就需要可移動,那麼同樣要在MyPlan類裡寫一個touchEvent()方法。
boss飛機會進入瘋狂模式,那麼要在boss飛機類(BossPlan)寫一個方法來判斷它什麼時候進入這個模式以及持續的時間。
子彈發射出去有它的速度和頻率,那麼在子彈類(MyBullet)
裡要對這些進行判斷。
子彈擊中飛機以及飛機撞到飛機會產生爆炸效果,我們需要在MyPlanBossPlan類裡分別判斷飛機是否被擊中或者是否被撞到。
子彈發射會有聲音,以及爆炸時的爆炸聲,這時我們要在音效類(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> {

Linuxandroid程序間的通訊及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簡單AndroidH5互調

為什麼要學習Android與H5互調? 微信,QQ空間等大量軟體都內嵌了H5,不得不說是一種趨勢。Android與H5互調可以讓我們的實現混合開發,至於混合開發就是在一個App中內嵌一個輕量級的瀏覽器,一部分原生的功能改為Html 5來開發。  優勢:使用H5實現的功能能夠在不升級App的情況下動態更

WebView簡單實現AndroidH5互調

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 為什麼要學習Android與H5互調? 微信,QQ空間等大量軟體都內嵌了H5,不得不說是一種趨勢。Android與H5互調可以讓我們的實現混合開發,至於混合開發就是在一個App中內嵌

Android入門——Broadcast Receiver應用

引言 作為Android四大元件之一——BroadcastReceive。BroadcastReceive廣泛運用在APP的開發中,其他的三大應用元件不同一樣,是唯一需要被動接收,即負責接收的廣播接收器永遠不知道什麼時候可以接收到廣播,這種機制其實有點像Eve

Androidweb端以及資料庫的建立它們之間的互動案例分析

本專案是筆者利用十天的實訓時間完成,之間掌握並學到了不少關於Android和web方面的知識,比如:json的資料交換,ListViewAdapter介面卡的使用以及網路請求web端互動的問題。趁熱打

android canvas layer (圖層)進階

1 概述 前面的canvas變換文章中,已經粗略的講解過saveLayer的知識,只是圖層的概念沒有詳細的講解。這裡將詳細講解layer。在使用相關方法和flag的時候,先關閉硬體加速。如果需要開啟,參照谷歌官方的硬體加速表格。硬體加速版本 2 save