1. 程式人生 > >帶有指示器的自定義底部導航欄的實現

帶有指示器的自定義底部導航欄的實現

  轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992

    今天這篇文章,主要是給大家實現一個自定義的帶有指示器的底部導航欄。

    先看一下實現的效果吧。

  這個自定義控制元件的使用要注意以下幾個方面:

    1.沒有佈局檔案及資原始檔,只需要一個java檔案就可呼叫

    2.可以非常靈活的使用,一句程式碼就可以新增到專案中

    3.暫時只支援4.0以上版本,顏色值使用的是系統自帶色值,如需在低版本使用,請自己替換顏色值

    4.支援智慧適配,可以根據底部按鈕的數量,自動的調整佈局

    5.主內容區域,必須使用Fragment實現,通過附加到Viewpager上實現介面的左右滑動

   下面給出主程式的實現,註釋很清楚哈

  1. package com.example.indicatornavigationbar;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.support.v4.view.ViewPager;  
  5. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  6. import android.util.DisplayMetrics;  
  7. import android.view.Gravity;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.view.ViewGroup;  
  11. import android.view.animation.Animation;  
  12. import android.view.animation.TranslateAnimation;  
  13. import android.widget.ImageView;  
  14. import android.widget.ImageView.ScaleType;  
  15. import android.widget.LinearLayout;  
  16. import android.widget.TextView;  
  17. /** 
  18.  *  
  19.  * @ClassName: com.mengle.activity.IndicatorNavigationBar 
  20.  * @Description: 帶有指示器的底部導航欄 
  21.  * @author zhaokaiqiang 
  22.  * @date 2014-10-17 上午11:07:40 
  23.  *  
  24.  */
  25. publicclass IndicatorNavigationBar extends LinearLayout implements
  26.         OnClickListener, OnPageChangeListener {  
  27.     // 導航欄預設高度,不包括指示器高度,單位是dp
  28.     privatestaticfinalint HEIGHT_NAVIGATION_BAR = 40;  
  29.     // 指示器預設高度,單位是dp
  30.     privatestaticfinalint HEIGHT_INDICATOR = 4;  
  31.     private Context context;  
  32.     private ViewPager viewPager;  
  33.     // 指示器
  34.     private ImageView ivBottomLine;  
  35.     // 當前顯示的index
  36.     privateint currIndex = 0;  
  37.     // 儲存移動位置
  38.     privateint positions[];  
  39.     // 標題數量
  40.     privateint titleCount;  
  41.     public IndicatorNavigationBar(Context context) {  
  42.         super(context);  
  43.         this.context = context;  
  44.     }  
  45.     /** 
  46.      *  
  47.      * @Description: 依附到父佈局上 
  48.      * @param viewGroup 
  49.      *            要依附在的父佈局 
  50.      * @param titles 
  51.      *            底部顯示的導航文字 
  52.      * @param viewPager 
  53.      *            繫結的ViewPager物件 
  54.      * @return void 
  55.      */
  56.     publicvoid attachToParent(ViewGroup viewGroup, String[] titles,  
  57.             ViewPager viewPager) {  
  58.         this.viewPager = viewPager;  
  59.         titleCount = titles.length;  
  60.         // 初始化主佈局
  61.         setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,  
  62.                 dip2px(HEIGHT_NAVIGATION_BAR + HEIGHT_INDICATOR)));  
  63.         setBackgroundColor(getResources().getColor(android.R.color.transparent));  
  64.         setOrientation(VERTICAL);  
  65.         // 導航欄佈局
  66.         LinearLayout ll_navigation = new LinearLayout(context);  
  67.         ll_navigation.setLayoutParams(new LayoutParams(  
  68.                 LayoutParams.MATCH_PARENT, dip2px(HEIGHT_NAVIGATION_BAR)));  
  69.         ll_navigation.setBackgroundColor(getResources().getColor(  
  70.                 android.R.color.holo_blue_light));  
  71.         ll_navigation.setOrientation(HORIZONTAL);  
  72.         // 生成導航按鈕(TextView)
  73.         for (int i = 0; i < titles.length; i++) {  
  74.             TextView textView = new TextView(context);  
  75.             textView.setLayoutParams(new LayoutParams(0,  
  76.                     dip2px(HEIGHT_NAVIGATION_BAR), 1));  
  77.             textView.setText(titles[i]);  
  78.             textView.setGravity(Gravity.CENTER);  
  79.             textView.setTextSize(16);  
  80.             textView.setTextColor(getResources()  
  81.                     .getColor(android.R.color.white));  
  82.             textView.setId(i);  
  83.             textView.setOnClickListener(this);  
  84.             ll_navigation.addView(textView);  
  85.         }  
  86.         // 新增導航
  87.         this.addView(ll_navigation);  
  88.         // 指示器佈局
  89.         LinearLayout ll_indicator = new LinearLayout(context);  
  90.         ll_indicator.setLayoutParams(new LayoutParams(  
  91.                 LayoutParams.MATCH_PARENT, dip2px(HEIGHT_INDICATOR)));  
  92.         ll_indicator.setBackgroundColor(getResources().getColor(  
  93.                 android.R.color.holo_blue_light));  
  94.         ll_indicator.setOrientation(HORIZONTAL);  
  95.         // 指示器
  96.         ivBottomLine = new ImageView(context);  
  97.         ivBottomLine.setImageResource(android.R.color.holo_orange_light);  
  98.         ivBottomLine.setScaleType(ScaleType.MATRIX);  
  99.         ivBottomLine  
  100.                 .setLayoutParams(new LinearLayout.LayoutParams(  
  101.                         getScreenWidth(context) / titleCount,  
  102.                         dip2px(HEIGHT_INDICATOR)));  
  103.         ll_indicator.addView(ivBottomLine);  
  104.         // 新增指示器
  105.         this.addView(ll_indicator);  
  106.         viewGroup.addView(this);  
  107.         viewPager.setOnPageChangeListener(this);  
  108.         // 初始化移動位置
  109.         positions = newint[titleCount];  
  110.         positions[0] = 0;  
  111.         int distance = (int) (getScreenWidth(context) / titleCount);  
  112.         for (int i = 1; i < titleCount; i++) {  
  113.             positions[i] = distance * i;  
  114.         }  
  115.     }  
  116.     @Override
  117.     publicvoid onClick(View v) {  
  118.         viewPager.setCurrentItem(v.getId());  
  119.     }  
  120.     @Override
  121.     publicvoid onPageScrollStateChanged(int arg0) {  
  122.     }  
  123.     @Override
  124.     publicvoid onPageScrolled(int position, float positionOffset,  
  125.             int positionOffsetPixels) {  
  126.     }  
  127.     @Override
  128.     publicvoid onPageSelected(int position) {  
  129.         Animation animation = new TranslateAnimation(currIndex * positions[1],  
  130.                 positions[position], 00);  
  131.         currIndex = position;  
  132.         animation.setFillAfter(true);  
  133.         animation.setDuration(300);  
  134.         ivBottomLine.startAnimation(animation);  
  135.     }  
  136.     privateint dip2px(float dpValue) {  
  137.         finalfloat scale = context.getResources().getDisplayMetrics().density;  
  138.         return (int) (dpValue * scale + 0.5f);  
  139.     }  
  140.     // 獲取螢幕寬度
  141.     privateint getScreenWidth(Context context) {  
  142.         DisplayMetrics dm = new DisplayMetrics();  
  143.         ((Activity) context).getWindowManager().getDefaultDisplay()  
  144.                 .getMetrics(dm);  
  145.         

    相關推薦

    帶有指示器定義底部導航實現

      轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992     今天這篇文章,主要是給大家實現一個自定義的帶有指示器的底部導航欄。     先看一下實現的效果吧。   這個自定義控制元件的使用要注意以下幾個方面:    

    NavigationTabBar 定義底部導航

    先來頁面效果 匯入依賴 implementation 'devlight.io:navigationtabbar:1.2.5' 先建立三個Fragment ,貼出其中一個Fragment 的程式碼  fragment_home.xml <?xml vers

    android 定義底部導航

    1.編寫佈局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+

    小程式定義底部導航樣式

    1.微信app.json檔案中全域性配置小程式API "tabBar": { "color": "#fff", "selectedColor": "red", "backgroundColor": "skyblue", "list": [ { "pagePath": "pa

    定義底部導航圖示

    底部導航欄我門一般的實現方式就是  RadioGroup 和RadioButton這種組合.但是這樣會有很多弊端.比如有個訊息提示.比如要隨時改變圖示 /** * Created by sdx on 2016/12/28. * 底部導航欄圖示 */ public

    vue定義底部導航Tabbar

    如圖所示,要完成類似的一個底部導航切換。 首先。我們需要分為5個大的VUE檔案。可以根據自己的習慣來放在不同的位置。 我將5個主要的VUE檔案放在了5個不同的資料夾 然後,在元件資料夾裡新建Tabbar.vue /以及Item.vue檔案 Item.vue檔案

    微信小程序-定義底部導航

    tool vda www 程序 redirect pub otool lin 初始 代碼地址如下:http://www.demodashi.com/demo/14258.html 一、前期準備工作 軟件環境:微信開發者工具 官方下載地址:https://mp.weixi

    React Native:定義一個導航,改變狀態列背景,隱藏狀態列

    設計開發過程中,導航欄都會有所不同,這時候使用RN就需要自定義一個想要的導航欄了,RN中文網有講專門ios的導航欄(NavigatorIOS),可以不用自定義。 首先定義自定義導航欄的一些屬性的約束,記得npm install --save prop-types然後引入import Prop

    微信小程式——定義底部導航樣式切換

    1、以下截圖是靜態展示部分 解析: 1、catchtap='goHome' 是點選事件,點選的時候傳遞data-num='1',點選事件方法名都是一樣的,只是傳入的data-num值不同,通過這個不同的值,使用三元運算子來判斷需要顯示的樣式和圖示 2、圖示切換,通過

    Android底部導航實現(二)之RadioGroup

    這裡簡單記錄一下Android底部導航欄通過RadioGroup+Fragment的實現。 這裡寫圖片描述 佈局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and

    Recat Native:定義一個導航,改變狀態列背景,隱藏狀態列

    設計開發過程中,導航欄都會有所不同,這時候使用RN就需要自定義一個想要的導航欄了,RN中文網有講專門ios的導航欄(NavigatorIOS),可以不用自定義。 首先定義自定義導航欄的一些屬性的約束,記得npm install --save prop-types然後引入im

    小程式定義底部選單

       問題:小程式的底部選單欄基本的樣式根本不能滿足我們的審美要求,所以我們可以通過自己來自定義一套小程式底部欄,可以設定透明背景喲,想要什麼樣式都可以自己定義,好了,廢話不多說,直接上程式碼! 首先在和pages同一級建錄建立tabbar.xml,如右截圖所示 具體的t

    微信小程式定義頂部導航,新增背景圖,透明色等.

    在微信小程式中,導航欄的顏色可以在app.json.  window裡面新增navigationBarBackgroundColor屬性,但是顏色只能為純色.不能使用rgb,或者rgba的色號. 但是這

    定義UINavigationController導航背景

    方法一:自定義一個BaseNavigationViewController : UINavigationController 在初始化方法中加入以下程式碼,之後就使用BaseNavigationViewController [self.navigatio

    微信小程式定義底部導航帶跳轉

    index.wxml <!--底部導航 --> <view class='footer'> <view class='footer_list' data-id='{{

    QT定義視窗標題實現拖動雙擊放大縮小

        去掉Qt視窗的標題邊框,重新定義標題欄,可以在標題欄上實現更多的功能,能滿足更多的開發需求,可以實現標題欄的拖動,雙擊,自定義放大縮小。      本文引用自:http://www.devbean.net/2011/10/custom-qt-titlebar/,感謝

    微信小程式-定義底部導航

    之前我的做微信小程式的時候,需要一個底部導航樣式,但是我搜索的時候,大部分都是寫的一些小程式自定義的tabBar的樣式,而當時我在網上有一個地方找到了這個模板,現在介紹給大家參考參考WXML程式碼:<import src="../../template/nav" /&g

    定義導航如何增加右滑動返回的手勢

    這幾天產品增加了個新需求,要求增加滑動返回的手勢。安卓上有返回按鈕,但是iOS上沒有返回按鈕,增加一個返回的手勢可以較大的提高使用者體驗。iOS7剛出來的時候系統增加了滑動返回手勢,感覺特別好,但是發現把導航欄隱藏,自定義的滑動返回手勢不好使。於是按照這個帖子(http:/

    Android (爭取做到)最全的底部導航實現方法

    本文(爭取做到)Android 最全的底部導航欄實現方法. 現在寫了4個主要方法. 還有一些個人感覺不完全切題的方法也會簡單介紹一下. 方法一. ViewPager + List<View> + PagerAdapter 先看a

    底部導航實現

          底部導航欄我選擇用FragmentTabHost+Fragment來實現,這個方法比較好用,程式碼量也不多       首先是開始的activity_main.xml <RelativeLayout xmlns:android="http://schemas