啟動篇
主要分為開機和功能導航倆部分來總結
先上部分截圖圖直覺感受下
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