引導頁之從零開始

一、前言
最近所開發(fā)的項目中需要用到引導頁,在網上找了很久都沒有找到適合的,于是乎就卷起袖子,擼起了代碼,決定寫一個完全自己的引導頁庫。寫完之后頗有成就感,畢竟100%純自己,無添加。寫的過程中遇到不少問題,于是有了這篇筆記。本文仍然會先展示效果。然后分解實現步驟。接著一步步實現。github地址
二、展示效果

展示效果

圖片的選取有些糙,后續(xù)找到合適的會替換,有合適的也可以推薦

二、步驟分解
1.實現滑動的ViewPager
2.實現底部導航條
3.實現下半部分圖片的變化
4.實現小貓動畫

三、步驟實現
1.ViewPager,這沒有什么好說的,現在的項目中基本都會用到,但我在這糾結了很久,也來來回回做了很多測試。主要糾結是用FragmentPagerAdapter還是PagerAdapter。因為只有一張圖所以使用PagerAdapter是完全可以勝任的。使用PagerAdapter也會比較高效,但最后還是選擇了FragmentPagerAdapter,這里有幾個原因:
1.1如果用一張圖片上下就是一個整體,如果上下任何一個部分有變化整個圖都得變化,這樣就不夠靈活。
1.2找圖太費勁,下半部分是純色,這個是比較好實現的,但要找一個上半部分是圖,下半部分是純色的那就得找設計師了。

使用FragmentPagerAdapter的具體做法是把布局的上半部分用圖片,下半部分透明填充,透明的原因是讓背景能夠顯示出來,這樣ViewPager才可以在最上面。滑動的時候才能觸發(fā)ViewPager的滑動事件。代碼比較簡單,此處省略。

2.底部導航條
剛開始準備使用第三方的庫,這種庫有很多,但后來想了想,既然都寫了,那就一擼到底部。于是就決定自己寫了,其實整個過程也不復雜,只是中間有很多小的細節(jié)只有真正的去擼才能發(fā)現。
首先還是給大家說一下實現的整體思路:整個的導航條就是一個LinearLayout加一個View。它們倆利用shape資源文件設置不同的背景,比較簡單,此處忽略。View的寬短設置為LinearLayout的1/n(導航頁的個數),這里不是太靈活,因為,當個數改變時,還需要計算,實際可以封裝一下,利用屬性去控制,這樣會比較規(guī)范。由于想整個庫一起封裝,所以暫時沒有優(yōu)化。
接下來看一下代碼(導航條代碼單獨抽出)

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) vScroll.getLayoutParams();
float distance = vScroll.getWidth();
int leftDistance = 0;
if (lastOffset < positionOffset && positionOffset > 0) {  
//正向    
leftDistance = (int) (distance * (position)); 
lp.leftMargin = leftDistance + (int) (positionOffset * distance);
}
if (lastOffset > positionOffset && positionOffset > 0) {  
//反向  
leftDistance = (int) (distance * (position + 1));    
lp.leftMargin = leftDistance + (int) ((positionOffset - 1) * distance);
}

代碼非常簡單,但里面有幾個需要注意的點:
1.ViewPager從第一頁到第二頁View滑動的距離正常的話應該是自己的寬度所以distance設置為本身的寬度。
2.positionOffset永遠大于等于0,所以必須分正向和逆向,正向和逆向由上次滑動比例和本次滑動比例算出。
3.去除等于0的情況,加上會有抖動,或者與想要的效果不符
4.正向是position 逆向是position+1 .逆向時,如果當前是第二個頁面,稍微往左一些potisition就會變?yōu)?.所以是position+1
5.positionOffset - 1
當運行demo時,可以注意一下打印注釋,順便關注一下上面說到的幾個問題。這樣會比較好理解代碼為什么長這樣。

3.底部圖片處理
底部圖片主要是透明度的變化,沒有太多的難點,注意一些細節(jié)即可下面開一下主要代碼(圖片代碼單獨抽出)


 int leftDistance = 0;
if (lastOffset < positionOffset && positionOffset > 0) {
    //正向
    if (positionOffset < 0.5) {  
        ivGuideDown.setImageResource(imgResDown[position]);  
       float alpha = 1 - 2 * positionOffset;      
       ivGuideDown.setAlpha(alpha < 0.2 ? 0.2f : alpha);
    } else {  
          ivGuideDown.setImageResource(imgResDown[position+1]);
      float alpha = (float) (2 * (positionOffset - 0.5));        
     ivGuideDown.setAlpha(alpha < 0.2 ? 0.2f : alpha);}
}
if (lastOffset > positionOffset && positionOffset > 0) { 
     //反向   
     if (positionOffset < 0.5) {      
          ivGuideDown.setImageResource(imgResDown[position]);
         float alpha = 1 - 2 * positionOffset;   
        (alpha < 0.2 ? 0.2f : alpha); 
         } else {  
          ivGuideDown.setImageResource(imgResDown[position+1]);
          float alpha = 2 * (positionOffset - 0.5f);        
        ivGuideDown.setAlpha(alpha < 0.2 ? 0.2f : alpha);  
     }}

幾個細節(jié)的地方
1.0.5和 2 * positionOffset,0.5是變化的節(jié)點,而透明度是0到1,所以是2 * positionOffset
2.透明度最小 0.2,當0.5或者接近。5時文字為看不到,所以這里設置最小值0.2
3.position和position+1的設定,這里建議大家多看看demo中的打印,效果會更直觀

4、貓的動畫
貓的動畫其實很簡單,就是一個幀動畫。這里是真的不打算說,想了解詳情的可以在github地址 中查看。

四、后記
自此文章已經結束,github地址 的下載地址已經給出,對代碼有修改建議的也可以提出,相互討論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容