天天看點

掌上快遞之開機啟動篇

啟動篇

主要分為開機和功能導航倆部分來總結

先上部分截圖圖直覺感受下

掌上快遞之開機啟動篇

1、開機部分

開機圖檔比較簡單,有個開機圖檔,圖檔放在了r.layout.start布局檔案中,剛開始老是出現适配問題,後來索性放到linearlayout的background屬性中,然後使用hnadler建立了一個子線程延時子線程加載後續的跳轉activity(第一次開機跳轉功能導航,非第一次跳轉主界面)開機的布局檔案 r.layout.start(适配比較好)

<span style="font-family:microsoft yahei;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"  

    xmlns:baiduadsdk="http://schemas.android.com/apk/res/com.weimeijing.feigeshudi"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    android:background="@drawable/startlogo" >  

</linearlayout></span>  

其中引導動畫邏輯部分,這裡采用sharedpreferences方式記錄是否第一次啟動,來判斷是否進入引導畫面開機

<span style="font-family:microsoft yahei;font-size:14px;">package com;  

import android.app.activity;  

import android.content.intent;  

import android.content.sharedpreferences;  

import android.os.bundle;  

import android.os.handler;  

import com.kaiji.viewpage_activity;  

import com.weimeijing.feigeshudi.r;  

public class startactivity extends activity {  

    private final int splash_display_lenght = 2000; // 延遲二秒  

    @override  

    public void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        setcontentview(r.layout.start);//在這個顯示開機圖檔  

        // handler線程延時2秒執行run方法,顯示開機圖檔效果  

        new handler().postdelayed(new runnable() {  

            @override  

            public void run() {  

                // run方法中sharedpreference就是一個xml檔案,裡面通過鍵值對來存儲相應的使用者的設定及其狀态。  

                sharedpreferences setting = getsharedpreferences(  

                        "citigame.ini", 0);  

                boolean user_first = setting.getboolean("first", true);  

                if (user_first) {  

                    //第一次加載跳轉到功能導航界面  

                    <span style="color:#009900;">setting.edit().putboolean("first", false).commit()</span>;  

                    intent intent = new intent(startactivity.this,  

                            viewpage_activity.class);  

                    startactivity.this.startactivity(intent);  

                    startactivity.this.finish();  

                } else {  

                    //非第一次加載直接跳轉主界面  

                    intent mainintent = new intent(startactivity.this,  

                            maintabactivity.class);  

                    startactivity.this.startactivity(mainintent);  

                }  

            }  

        }, splash_display_lenght);  

    }  

}  

</span>  

1.1、知識點

代碼注釋的很清楚了,這裡主要重點提一下

【1】sharedpreferences,它的本質其實就是xml,但是它可以通過鍵值對來存儲使用者相應的設定,算是一個輕量級的存儲類,sharedpreferences類似過去windows系統上的ini配置檔案,但是它分為多種權限,可以全局共享通路。

getsharedpreferences(string name, int mode)

name為本元件的配置檔案名( 自己定義,也就是一個檔案名),當這個檔案不存在時,直接建立,如果已經存在,則直接使用,

mode為操作模式,預設的模式為0或mode_private,還可以使用mode_world_readable和mode_world_writeable

mode指定為mode_private,則該配置檔案隻能被自己的應用程式通路。

mode指定為mode_world_readable,則該配置檔案除了自己通路外還可以被其它應該程式讀取。

mode指定為mode_world_writeable,則該配置檔案除了自己通路外還可以被其它應該程式讀取和寫入

【2】sharedpreferences使用

它的本質是基于xml檔案存儲key-value鍵值對資料,通常用來存儲一些簡單的配置資訊。 其存儲位置在/data/data/<包名>/shared_prefs目錄下。

 sharedpreferences對象本身隻能擷取資料而不支援存儲和修改,存儲修改是通過editor對象實作。

 實作sharedpreferences存儲的步驟如下:   

    一、根據context擷取sharedpreferences對象   

    二、利用edit()方法擷取editor對象。   

    三、通過editor對象存儲key-value鍵值對資料。   

    四、通過commit()方法送出資料。

【3】代碼分析

在建立的sharedpreferences中第一次運作記錄為true進而進入第一個if條件進入功能導航:

boolean user_first = setting.getboolean("first", true);

然後進入第一個if判斷立馬将其修改為false:

setting.edit().putboolean("first", false).commit();

這樣下次啟動時就直接進入第二個if中直接跳轉到主界面

【4】handler開啟子線程的達到延時加載的效果

代碼中已經表現的很詳細了

2、功能導航部分

主要就是采用viewpager+layoutinflater (動态加載頁面)來實作

主要分為以下2大部分:

2.1、初始化

主要是通過layoutinflater動态加載導航頁面,為了顯示效果這裡還加入了一些标記圓點,在上圖可以看到,代碼注釋如下

// 用來擷取整個view并傳回  

        layoutinflater inflater = getlayoutinflater();  

        pageviews = new arraylist<view>();  

        pageviews.add(inflater.inflate(r.layout.activity_viewpage1, null));  

        pageviews.add(inflater.inflate(r.layout.activity_viewpage2, null));  

        pageviews.add(inflater.inflate(r.layout.activity_viewpage3, null));  

        pageviews.add(inflater.inflate(r.layout.activity_viewpage4, null));  

        pageviews.add(inflater.inflate(r.layout.activity_viewpage5, null));  

        pageviews.add(inflater.inflate(r.layout.activity_viewpage6, null));  

        // 小圓點數大小是圖檔的個數  

        imageviews = new imageview[pageviews.size()];  

        // 從指定xml檔案中加載視圖  

        viewpictures = (viewgroup) inflater.inflate(  

                r.layout.activity_viewpagers, null);  

        viewpager = (viewpager) viewpictures.findviewbyid(r.id.guidepagers);  

        viewpoints = (viewgroup) viewpictures.findviewbyid(r.id.viewpoints);  

        // 添加小圓點導航圖檔  

        for (int i = 0; i < pageviews.size(); i++) {  

            imageview = new imageview(viewpage_activity.this);  

            imageview.setlayoutparams(new layoutparams(20, 20));  

            imageview.setpadding(5, 0, 5, 0);  

            // 把小圓點放進數組  

            imageviews[i] = imageview;  

            // 預設選中的是第一張圖檔,此時第一個小圓點是選中狀态,其他不是  

            if (i == 0)  

                imageviews[i].setimagedrawable(getresources().getdrawable(  

                        r.drawable.page_indicator_focused));  

            else  

                        r.drawable.page_indicator_unfocused));  

            // 将imageviews添加到小圓點視圖組  

            viewpoints.addview(imageviews[i]);  

        }  

2.2、pageadapter——pageview的擴充卡

跟listview一樣這玩意也需要擴充卡

pageadapter 必須重寫的四個函數:

    * boolean isviewfromobject(view arg0, object arg1)

    * int getcount() 

    * object instantiateitem(viewgroup container, int position)

具體作用如下代碼注釋:

// 導航view的擴充卡  

    class navigationadapter extends pageradapter {  

        // 擷取需要滑動view數目  

        @override  

        public int getcount() {  

            return pageviews.size();  

        public boolean isviewfromobject(view arg0, object arg1) {  

            return arg0 == arg1;  

        // 2件事情,第一:将目前視圖添加到container中,第二:傳回目前view  

        public object instantiateitem(view container, int position) {  

            ((viewpager) container).addview(pageviews.get(position));  

            return pageviews.get(position);  

        // 銷毀每個item  

        public void destroyitem(view container, int position, object object) {  

            ((viewpager) container).removeview(pageviews.get(position));  

2.3、知識點

這個部分需要注意以下知識點

【1】viewpager

viewpager類提供了多界面切換的新效果,新效果有如下特征:

<1>目前顯示一組界面中的其中一個界面;

<2>當使用者通過左右滑動界面時,目前的螢幕顯示目前界面和下一個界面的一部分;

<3>滑動結束後,界面自動跳轉到目前選擇的界面中

【2】layoutinflater

動态加載頁面,注意與findviewbyid()的差別

layoutinflater其實是在res/layout/下找到xml布局檔案,并且将其執行個體化,這個和findviewbyid()有點相似,後者是找xml布局檔案下的具體widget控件(如button、textview等)

作用:

1、對于一個沒有被載入或者想要動态載入的界面,都需要使用layoutinflater.inflate()來載入;

2、對于一個已經載入的界面,就可以使用activiyt.findviewbyid()方法來獲得其中的界面元素。

轉載:http://blog.csdn.net/xsf50717/article/details/47205259

繼續閱讀