Android技巧一之啟動(dòng)屏+新功能左右導(dǎo)航邏輯
前言
很長(zhǎng)一段時(shí)間沒(méi)寫博客了,再不寫點(diǎn)東西真說(shuō)不過(guò)去,把工作上的一些有價(jià)值的東西整理出來(lái)分享,在當(dāng)下還有點(diǎn)時(shí)效性,不然遲早會(huì)爛在肚子里的。還記得之前小巫有個(gè)開(kāi)源計(jì)劃是想實(shí)現(xiàn)一個(gè)星期開(kāi)發(fā)app,現(xiàn)在把它拾起來(lái),計(jì)劃沒(méi)有實(shí)行起來(lái)跟我那懶惰的身軀有關(guān),任何偉大的事情都需要強(qiáng)大的執(zhí)行力才能實(shí)現(xiàn),慢一點(diǎn)沒(méi)關(guān)系,能創(chuàng)造點(diǎn)東西就是值得的事情。
本篇博客先介紹一個(gè)app最常見(jiàn)的特性,就是新功能屬性介紹和啟動(dòng)屏,一般會(huì)怎么實(shí)現(xiàn)呢,這不就打算告訴大家了么。
先說(shuō)邏輯
先判斷是否第一次啟動(dòng)app,如果是,則進(jìn)入功能使用導(dǎo)航(最簡(jiǎn)單的做法就是,左右滑動(dòng)切換查看,滑動(dòng)到最后一頁(yè)點(diǎn)擊按鈕進(jìn)入首頁(yè))。
如果不是,則顯示啟動(dòng)屏,2秒之后進(jìn)入首頁(yè)。
邏輯是很簡(jiǎn)單,如果有廣告怎么辦?廣告肯定是從服務(wù)器拿,但會(huì)緩存到本地,沒(méi)網(wǎng)的時(shí)候可以顯示,可以使用webView來(lái)顯示廣告,反正筆者是這樣干,具體實(shí)現(xiàn)先不說(shuō)。
看看效果
上代碼
SplashActivity.java
package com.devilwwj.featureguide; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import com.devilwwj.featureguide.global.AppConstants; import com.devilwwj.featureguide.utils.SpUtils; /** * @desc 啟動(dòng)屏 * Created by devilwwj on 16/1/23. */ public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 判斷是否是第一次開(kāi)啟應(yīng)用 boolean isFirstOpen = SpUtils.getBoolean(this, AppConstants.FIRST_OPEN); // 如果是第一次啟動(dòng),則先進(jìn)入功能引導(dǎo)頁(yè) if (!isFirstOpen) { Intent intent = new Intent(this, WelcomeGuideActivity.class); startActivity(intent); finish(); return; } // 如果不是第一次啟動(dòng)app,則正常顯示啟動(dòng)屏 setContentView(R.layout.activity_splash); new Handler().postDelayed(new Runnable() { @Override public void run() { enterHomeActivity(); } }, 2000); } private void enterHomeActivity() { Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); } } 代碼解析:使用SharedPreference來(lái)保存app啟動(dòng)狀態(tài),如果為true,則進(jìn)入功能導(dǎo)航,否則延遲2秒之后進(jìn)入主頁(yè)面。 WelcomeGuideActivity.java package com.devilwwj.featureguide; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import com.devilwwj.featureguide.global.AppConstants; import com.devilwwj.featureguide.utils.SpUtils; import java.util.ArrayList; import java.util.List; /** * 歡迎頁(yè) * * @author wwj_748 * */ public class WelcomeGuideActivity extends Activity implements OnClickListener { private ViewPager vp; private GuideViewPagerAdapter adapter; private List<View> views; private Button startBtn; // 引導(dǎo)頁(yè)圖片資源 private static final int[] pics = { R.layout.guid_view1, R.layout.guid_view2, R.layout.guid_view3, R.layout.guid_view4 }; // 底部小點(diǎn)圖片 private ImageView[] dots; // 記錄當(dāng)前選中位置 private int currentIndex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); views = new ArrayList<View>(); // 初始化引導(dǎo)頁(yè)視圖列表 for (int i = 0; i < pics.length; i++) { View view = LayoutInflater.from(this).inflate(pics[i], null); if (i == pics.length - 1) { startBtn = (Button) view.findViewById(R.id.btn_login); startBtn.setTag("enter"); startBtn.setOnClickListener(this); } views.add(view); } vp = (ViewPager) findViewById(R.id.vp_guide); // 初始化adapter adapter = new GuideViewPagerAdapter(views); vp.setAdapter(adapter); vp.setOnPageChangeListener(new PageChangeListener()); initDots(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); // 如果切換到后臺(tái),就設(shè)置下次不進(jìn)入功能引導(dǎo)頁(yè) SpUtils.putBoolean(WelcomeGuideActivity.this, AppConstants.FIRST_OPEN, true); finish(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); } private void initDots() { LinearLayout ll = (LinearLayout) findViewById(R.id.ll); dots = new ImageView[pics.length]; // 循環(huán)取得小點(diǎn)圖片 for (int i = 0; i < pics.length; i++) { // 得到一個(gè)LinearLayout下面的每一個(gè)子元素 dots[i] = (ImageView) ll.getChildAt(i); dots[i].setEnabled(false);// 都設(shè)為灰色 dots[i].setOnClickListener(this); dots[i].setTag(i);// 設(shè)置位置tag,方便取出與當(dāng)前位置對(duì)應(yīng) } currentIndex = 0; dots[currentIndex].setEnabled(true); // 設(shè)置為白色,即選中狀態(tài) } /** * 設(shè)置當(dāng)前view * * @param position */ private void setCurView(int position) { if (position < 0 || position >= pics.length) { return; } vp.setCurrentItem(position); } /** * 設(shè)置當(dāng)前指示點(diǎn) * * @param position */ private void setCurDot(int position) { if (position < 0 || position > pics.length || currentIndex == position) { return; } dots[position].setEnabled(true); dots[currentIndex].setEnabled(false); currentIndex = position; } @Override public void onClick(View v) { if (v.getTag().equals("enter")) { enterMainActivity(); return; } int position = (Integer) v.getTag(); setCurView(position); setCurDot(position); } private void enterMainActivity() { Intent intent = new Intent(WelcomeGuideActivity.this, SplashActivity.class); startActivity(intent); SpUtils.putBoolean(WelcomeGuideActivity.this, AppConstants.FIRST_OPEN, true); finish(); } private class PageChangeListener implements OnPageChangeListener { // 當(dāng)滑動(dòng)狀態(tài)改變時(shí)調(diào)用 @Override public void onPageScrollStateChanged(int position) { // arg0 ==1的時(shí)辰默示正在滑動(dòng),arg0==2的時(shí)辰默示滑動(dòng)完畢了,arg0==0的時(shí)辰默示什么都沒(méi)做。 } // 當(dāng)前頁(yè)面被滑動(dòng)時(shí)調(diào)用 @Override public void onPageScrolled(int position, float arg1, int arg2) { // arg0 :當(dāng)前頁(yè)面,及你點(diǎn)擊滑動(dòng)的頁(yè)面 // arg1:當(dāng)前頁(yè)面偏移的百分比 // arg2:當(dāng)前頁(yè)面偏移的像素位置 } // 當(dāng)新的頁(yè)面被選中時(shí)調(diào)用 @Override public void onPageSelected(int position) { // 設(shè)置底部小點(diǎn)選中狀態(tài) setCurDot(position); } } }
代碼解析:左右滑動(dòng)是使用ViewPager來(lái)做的,切換4個(gè)不同的View,監(jiān)聽(tīng)ViewPager的頁(yè)面切換事件來(lái)更改底部指示點(diǎn)的切換,滑動(dòng)到最后一個(gè)頁(yè)面,設(shè)置按鈕的點(diǎn)擊事件,點(diǎn)擊進(jìn)入首頁(yè)。
github
更多的代碼上的細(xì)節(jié),大家看源工程,代碼已經(jīng)上傳到github,歡迎大家down下來(lái)使用。
相關(guān)文章
Android中利用zxing實(shí)現(xiàn)自己的二維碼掃描識(shí)別詳解
這篇文章主要給大家介紹了關(guān)于Android中利用zxing實(shí)現(xiàn)自己的二維碼掃描識(shí)別的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用zxing具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09MVVMLight項(xiàng)目Model?View結(jié)構(gòu)及全局視圖模型注入器
這篇文章主要為大家介紹了MVVMLight項(xiàng)目中Model及View的結(jié)構(gòu)及全局視圖模型注入器的使用說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-01-01Android利用Intent啟動(dòng)和關(guān)閉Activity
這篇文章主要為大家詳細(xì)介紹了Android利用Intent啟動(dòng)和關(guān)閉Activity的相關(guān)操作,感興趣的小伙伴們可以參考一下2016-06-06Android對(duì)sdcard擴(kuò)展卡文件操作實(shí)例詳解
這篇文章主要介紹了Android對(duì)sdcard擴(kuò)展卡文件操作,非常實(shí)用的技術(shù),需要的朋友可以參考下2014-07-07MVVMLight項(xiàng)目的綁定及各種使用場(chǎng)景示例分析
這篇文章主要為大家介紹了MVVMLight項(xiàng)目中的綁定及綁定的各種使用場(chǎng)景示例源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步除夕快樂(lè)2022-01-01Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別
本文主要介紹了Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04Android入門之SubMenu的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)SubMenu子菜單的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Android有一定的幫助,感興趣的可以了解一下2022-11-11基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題
這篇文章主要介紹了基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03android自定義toast(widget開(kāi)發(fā))示例
這篇文章主要介紹了android自定義toast(widget開(kāi)發(fā))示例,需要的朋友可以參考下2014-03-03