帶有指示器的自定義底部導航欄的實現
轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992
今天這篇文章,主要是給大家實現一個自定義的帶有指示器的底部導航欄。
先看一下實現的效果吧。
這個自定義控制元件的使用要注意以下幾個方面:
1.沒有佈局檔案及資原始檔,只需要一個java檔案就可呼叫
2.可以非常靈活的使用,一句程式碼就可以新增到專案中
3.暫時只支援4.0以上版本,顏色值使用的是系統自帶色值,如需在低版本使用,請自己替換顏色值
4.支援智慧適配,可以根據底部按鈕的數量,自動的調整佈局
5.主內容區域,必須使用Fragment實現,通過附加到Viewpager上實現介面的左右滑動
下面給出主程式的實現,註釋很清楚哈
- package com.example.indicatornavigationbar;
- import android.app.Activity;
- import android.content.Context;
- import android.support.v4.view.ViewPager;
- import android.support.v4.view.ViewPager.OnPageChangeListener;
- import android.util.DisplayMetrics;
-
import android.view.Gravity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.view.animation.Animation;
- import android.view.animation.TranslateAnimation;
- import android.widget.ImageView;
- import android.widget.ImageView.ScaleType;
-
import android.widget.LinearLayout;
- import android.widget.TextView;
- /**
- *
- * @ClassName: com.mengle.activity.IndicatorNavigationBar
- * @Description: 帶有指示器的底部導航欄
- * @author zhaokaiqiang
- * @date 2014-10-17 上午11:07:40
- *
- */
- publicclass IndicatorNavigationBar extends LinearLayout implements
- OnClickListener, OnPageChangeListener {
- // 導航欄預設高度,不包括指示器高度,單位是dp
- privatestaticfinalint HEIGHT_NAVIGATION_BAR = 40;
- // 指示器預設高度,單位是dp
- privatestaticfinalint HEIGHT_INDICATOR = 4;
- private Context context;
- private ViewPager viewPager;
- // 指示器
- private ImageView ivBottomLine;
- // 當前顯示的index
- privateint currIndex = 0;
- // 儲存移動位置
- privateint positions[];
- // 標題數量
- privateint titleCount;
- public IndicatorNavigationBar(Context context) {
- super(context);
- this.context = context;
- }
- /**
- *
- * @Description: 依附到父佈局上
- * @param viewGroup
- * 要依附在的父佈局
- * @param titles
- * 底部顯示的導航文字
- * @param viewPager
- * 繫結的ViewPager物件
- * @return void
- */
- publicvoid attachToParent(ViewGroup viewGroup, String[] titles,
- ViewPager viewPager) {
- this.viewPager = viewPager;
- titleCount = titles.length;
- // 初始化主佈局
- setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
- dip2px(HEIGHT_NAVIGATION_BAR + HEIGHT_INDICATOR)));
- setBackgroundColor(getResources().getColor(android.R.color.transparent));
- setOrientation(VERTICAL);
- // 導航欄佈局
- LinearLayout ll_navigation = new LinearLayout(context);
- ll_navigation.setLayoutParams(new LayoutParams(
- LayoutParams.MATCH_PARENT, dip2px(HEIGHT_NAVIGATION_BAR)));
- ll_navigation.setBackgroundColor(getResources().getColor(
- android.R.color.holo_blue_light));
- ll_navigation.setOrientation(HORIZONTAL);
- // 生成導航按鈕(TextView)
- for (int i = 0; i < titles.length; i++) {
- TextView textView = new TextView(context);
- textView.setLayoutParams(new LayoutParams(0,
- dip2px(HEIGHT_NAVIGATION_BAR), 1));
- textView.setText(titles[i]);
- textView.setGravity(Gravity.CENTER);
- textView.setTextSize(16);
- textView.setTextColor(getResources()
- .getColor(android.R.color.white));
- textView.setId(i);
- textView.setOnClickListener(this);
- ll_navigation.addView(textView);
- }
- // 新增導航
- this.addView(ll_navigation);
- // 指示器佈局
- LinearLayout ll_indicator = new LinearLayout(context);
- ll_indicator.setLayoutParams(new LayoutParams(
- LayoutParams.MATCH_PARENT, dip2px(HEIGHT_INDICATOR)));
- ll_indicator.setBackgroundColor(getResources().getColor(
- android.R.color.holo_blue_light));
- ll_indicator.setOrientation(HORIZONTAL);
- // 指示器
- ivBottomLine = new ImageView(context);
- ivBottomLine.setImageResource(android.R.color.holo_orange_light);
- ivBottomLine.setScaleType(ScaleType.MATRIX);
- ivBottomLine
- .setLayoutParams(new LinearLayout.LayoutParams(
- getScreenWidth(context) / titleCount,
- dip2px(HEIGHT_INDICATOR)));
- ll_indicator.addView(ivBottomLine);
- // 新增指示器
- this.addView(ll_indicator);
- viewGroup.addView(this);
- viewPager.setOnPageChangeListener(this);
- // 初始化移動位置
- positions = newint[titleCount];
- positions[0] = 0;
- int distance = (int) (getScreenWidth(context) / titleCount);
- for (int i = 1; i < titleCount; i++) {
- positions[i] = distance * i;
- }
- }
- @Override
- publicvoid onClick(View v) {
- viewPager.setCurrentItem(v.getId());
- }
- @Override
- publicvoid onPageScrollStateChanged(int arg0) {
- }
- @Override
- publicvoid onPageScrolled(int position, float positionOffset,
- int positionOffsetPixels) {
- }
- @Override
- publicvoid onPageSelected(int position) {
- Animation animation = new TranslateAnimation(currIndex * positions[1],
- positions[position], 0, 0);
- currIndex = position;
- animation.setFillAfter(true);
- animation.setDuration(300);
- ivBottomLine.startAnimation(animation);
- }
- privateint dip2px(float dpValue) {
- finalfloat scale = context.getResources().getDisplayMetrics().density;
- return (int) (dpValue * scale + 0.5f);
- }
- // 獲取螢幕寬度
- privateint getScreenWidth(Context context) {
- DisplayMetrics dm = new DisplayMetrics();
- ((Activity) context).getWindowManager().getDefaultDisplay()
- .getMetrics(dm);
-
相關推薦
帶有指示器的自定義底部導航欄的實現
轉載請註明出處: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