1. 程式人生 > >自定義頂端頂部導航欄(可配合ViewPager使用)

自定義頂端頂部導航欄(可配合ViewPager使用)

最近做專案,需要有類似網易新聞頂端的導航欄的ui元件,但是就是有切換動畫的那種,於是就自己動手寫了一個,看了我的文章,如果有什麼問題,歡迎大家交流哦。

實現原理:通過OnPageChangeListener的onPageScrolled()事件獲取當前頁面的偏移量,從而改變導航欄指示器的位置

請看程式碼:

java程式碼:

import android.content.Context;
import android.os.Handler;
import android.support.v7.widget.CardView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.support.v4.view.ViewPager;
import android.widget.ImageView;


/**
 * Created by 豬屎秋 on 2016/10/13.
 */

public class NavigationBar extends CardView implements ViewPager.OnPageChangeListener {

//繼承的類可以不是cardview,只要是viewgroup就可以了

    private ImageView nav_indicator;

    public NavigationBar(Context context, AttributeSet attributeSet) {
        super(context,attributeSet);
        LayoutInflater.from(context).inflate(R.layout.navigation_bar,this);

        init();

    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Log.d("Nav_P",""+position);
        Log.d("Nav_O",""+positionOffset);
        Log.d("Nav_POP",""+positionOffsetPixels);
        nav_indicator.setX(position*getResources().getDisplayMetrics().widthPixels/3+positionOffsetPixels/3);//getResources().getDisplayMetrics().widthPixels獲取螢幕寬度,除以3是因為我的導航欄只有3個,實際情況可以自己改的,這句是關鍵程式碼哦
    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    public void init()
    {
        nav_indicator=(ImageView)findViewById(R.id.nav_indicator);
        nav_indicator.setMaxWidth(getResources().getDisplayMetrics().widthPixels/3);
        nav_indicator.setMinimumWidth(getResources().getDisplayMetrics().widthPixels/3);
    }
}

導航欄介面佈局程式碼:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="75dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="NAV1"
            android:layout_weight="1"
            android:gravity="center"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="NAV2"
            android:layout_weight="1"
            android:gravity="center"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="NAV3"
            android:layout_weight="1"
            android:gravity="center"/>
    </LinearLayout>
    <ImageView
        android:id="@+id/nav_indicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/nav_indicator"
        android:contentDescription="指示器"
        android:layout_gravity="bottom"/>
</FrameLayout>


最後只需要設定viewpager的OnPageChangeListener了:

NavigationBar navigationBar=(NavigationBar)findViewById(R.id.nav_bar);
        pager.addOnPageChangeListener(navigationBar);

PS:如果需要給導航欄新增點選事件,只需要在NavigationBar類中新增一個Handler,當導航按鈕被點選時傳送相應的message,然後再在其他地方處理該message,讓viewpager更改頁面即可。

效果圖: