自定义顶端顶部导航栏(可配合ViewPager使用)
2016-10-13 20:47
429 查看
最近做项目,需要有类似网易新闻顶端的导航栏的ui组件,但是就是有切换动画的那种,于是就自己动手写了一个,看了我的文章,如果有什么问题,欢迎大家交流哦。
实现原理:通过OnPageChangeListener的onPageScrolled()事件获取当前页面的偏移量,从而改变导航栏指示器的位置
请看代码:
java代码:
导航栏界面布局代码:
最后只需要设置viewpager的OnPageChangeListener了:
PS:如果需要给导航栏添加点击事件,只需要在NavigationBar类中添加一个Handler,当导航按钮被点击时发送相应的message,然后再在其他地方处理该message,让viewpager更改页面即可。
效果图:
实现原理:通过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更改页面即可。
效果图:
相关文章推荐
- 使用ViewPager+Fragment实现顶部导航栏
- 使用ViewPager和GridView配合,实现GridView横向水平滑动的效果。
- 自定义底部工具栏及顶部工具栏和Fragment配合使用demo
- ViewPager和Fragment结合使用,可以做出顶部导航界面滑动效果
- Fragment+ViewPager实习顶部导航栏效果
- ViewPager使用2-ViewPager+顶部HorizontalScrollView+Fragment-仿GooglePlay 顶部可滑动效果
- 关于ViewPager+Fragment配合使用时的几个要点
- 图片放大缩小(和ViewPager配合使用流畅显示)--第三方开源--PhotoView
- 使用Viewpager 和 Fragment实现顶部导航
- ViewPager和Fragment配合使用,以及它的Fragment生命周期分析
- 【移动开发】Android中Fragment+ViewPager的配合使用 推荐
- Android 使用ViewPager和RadioGroup配合Fragment实现标签页,可点击按钮切换、滑动切换。
- android ScrollView顶部使用Viewpager的轮播图,下拉图片能放大效果
- 使用PagerTabStrip配合ViewPager实现左右滑动标题栏的效果
- 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。
- ViewPager中使用自定义的ListView实例
- 自定义View之顶部导航栏
- 底部导航栏(自定义View+ViewPager实现) android项目详解
- 关于在自定义的导航栏中使用UIImagePickerViewControlle
- ViewPager的用法(2)——ViewPager配合PagerTabStrip的使用