自定义tab,viewpager实现仿tablayout切换效果
来源:互联网 发布:知乎 纽约时报订阅 编辑:程序博客网 时间:2024/05/08 16:16
首先书写Xml文件
<LinearLayout android:id="@+id/login_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/login_head" android:layout_marginLeft="40dp" android:layout_marginRight="40dp" android:layout_weight="1" android:background="@android:color/transparent" android:orientation="vertical" > <!-- 和viewpager结合的 tab --> <RelativeLayout android:id="@+id/login_rl_tab" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="horizontal" android:padding="10dp" > <TextView android:id="@+id/login_tab_name1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/tag" android:layout_centerVertical="true" android:layout_marginRight="15dp" android:background="@android:color/transparent" android:clickable="true" android:gravity="center" android:text="@string/login_tab_name1" /> <TextView android:id="@+id/login_tab_name2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tag" android:layout_centerVertical="true" android:layout_marginLeft="15dp" android:background="@android:color/transparent" android:clickable="true" android:gravity="center" android:text="@string/login_tab_name2" /> <View android:id="@+id/tag" android:layout_width="0dp" android:layout_height="0dp" android:layout_centerInParent="true" /> <!-- 下划线 --> <View android:id="@+id/login_view_divider" android:layout_width="10dp" android:layout_height="3dp" android:layout_alignLeft="@+id/login_tab_name1" android:layout_below="@+id/login_tab_name1" android:layout_marginLeft="5dp" android:layout_marginTop="10dp" android:background="@android:color/black" /> </RelativeLayout> <!-- 首页主内容区域 --> <android.support.v4.view.ViewPager android:id="@+id/login_vp_content" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" > </android.support.v4.view.ViewPager> </LinearLayout>
获取到下划线的layout参数
mDividerParams = (RelativeLayout.LayoutParams) mLoginDivider.getLayoutParams();
初始化适配器
class MyViewPagerAdapter extends PagerAdapter { @Override public int getCount() { return 2; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view;// 使用账号密码登录 加载相应的布局 if (position == 1) { view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_login_userpwd, null); UserPwdViewHolder holder = new UserPwdViewHolder(view); holder.mLoginToRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myStartActivity(getApplicationContext(), RegisterActivity.class); } }); } else {// 使用 手机验证码登录 view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_login_phone_register, null); PhoneViewHolder holder = new PhoneViewHolder(view); setHintSize(holder.mRegisterPhone, holder.mLoginPhoneConfirm); holder.mLoginToRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myStartActivity(getApplicationContext(), RegisterActivity.class); } }); } container.addView(view); return view; }// 单独设置 Editext的 hint文本大小 private void setHintSize(EditText registerPhone, EditText loginPhoneConfirm) { // 新建一个可以添加属性的文本对象 SpannableString hintPhone = new SpannableString(UIUtils.getString(R.string.login_hint_phone)); SpannableString hintConfirm = new SpannableString(UIUtils.getString(R.string.login_hint_confirm));// 新建一个属性对象,设置文字的大小,true为dip AbsoluteSizeSpan ass = new AbsoluteSizeSpan(13, true);// 附加属性到文本 hintPhone.setSpan(ass, 0, hintPhone.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); hintConfirm.setSpan(ass, 0, hintConfirm.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置hint registerPhone.setHint(new SpannedString(hintPhone)); // 一定要进行转换,否则属性会消失 loginPhoneConfirm.setHint(new SpannedString(hintConfirm)); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }
初始化page chang监听
/** * 手机号快捷登陆 和 账号密码登录的切换. */ class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { public static final int USER_PWD_LOGIN = 1; public static final int PHONE_LOGIN = 0; @Override public void onPageScrolled(int position, float positionOffset, int positiofsetPixels) {// 获取滑动的最大距离 int dis = mLogin_rl_tab.getChildAt(1).getLeft() - mLogin_rl_tab.getChildAt(0).getLeft();// 移动的距离 float moveDis = position * dis + positionOffset * dis; if (moveDis > dis) { mDividerParams.leftMargin = dis; } else { mDividerParams.leftMargin = (int) moveDis; }// 最初的位置, if (mDividerMinLeft > mDividerParams.leftMargin) { mDividerParams.leftMargin = mDividerMinLeft; }// 左右各少5dp mDividerParams.leftMargin += UIUtils.dip2px(5); mLoginDivider.setLayoutParams(mDividerParams); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) {// 当状态为 空闲时, 改变下划线的宽度 if (state == ViewPager.SCROLL_STATE_IDLE) { int item = mLoginVpContent.getCurrentItem(); switch (item) { case PHONE_LOGIN: mDividerParams.width = mDividerWidthTab1; mDividerParams.leftMargin = UIUtils.dip2px(5); break; case USER_PWD_LOGIN: mDividerParams.width = mDividerWidthTab2; break; } mLoginDivider.setLayoutParams(mDividerParams); } } }
设置适配器,监听和下划线的宽度
mLoginVpContent.setAdapter(new MyViewPagerAdapter());// 设置页面切换监听 mLoginVpContent.addOnPageChangeListener(new MyOnPageChangeListener());// 修改分割线的宽度 mLoginDivider.post(new Runnable() { @Override public void run() { mDividerWidthTab1 = mLoginTabName1.getWidth() - UIUtils.dip2px(10); mDividerWidthTab2 = mLoginTabName2.getWidth() - UIUtils.dip2px(10); mDividerParams.width = mDividerWidthTab1; mLoginDivider.setLayoutParams(mDividerParams);// mDividerMinLeft = mLoginDivider.getLeft(); mDividerMinLeft = mDividerParams.leftMargin; } });
设置上面两个textview点击监听
// 手机登录 mLoginTabName1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mLoginVpContent.setCurrentItem(0); } });// 账号密码登录 mLoginTabName2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mLoginVpContent.setCurrentItem(1); } });
0 0
- 自定义tab,viewpager实现仿tablayout切换效果
- Tablayout+viewpager+fragment实现tab导航以及滑动切换
- tab头部滑动切换,TabLayout和ViewPager实现
- FragmentPagerAdapter+ViewPager实现Tab切换效果
- ViewPager实现简单Tab切换效果
- 安卓 TabLayout+ViewPager实现滑动Tab效果
- TabLayout+ViewPager实现tab和页面联动效果
- TabLayout实现仿今日头条顶部tab导航效果
- Viewpager和fragment和自定义的底部Tab实现切换效果
- TabLayout+ViewPager轻松搞定Tab栏切换
- 自定义HorizontalScrollView视图实现仿ViewPager效果
- Android TabLayout、ViewPager实现顶部和底部Tab导航 点击滑动切换Tab页面
- TabLayout、ViewPager实现页面切换
- 使用FragmentTabHost实现仿QQ的切换,并在里面嵌套TabLayout+ViewPager的滑动切换
- ActionBar + ViewPager实现左右滑动切换Tab页效果
- jQuery实现仿淘宝tab栏切换效果
- ViewPager自定义切换效果
- TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
- PTA 5-11 编程打印空心字符菱形 【打印图形】
- BZOJ 1196 二分+Kruskal
- 九度oj1166
- Java多态中重载方法参数分别为父类和子类时的疑惑
- 1125. Chain the Ropes (25)
- 自定义tab,viewpager实现仿tablayout切换效果
- wpf中invoke传递参数时传递ref参数或者out参数无效
- 杂记
- 【SpringMVC】拦还是不拦
- Java的基本数据类型
- 《理想的程序员》-一个程序员的顿悟
- 初识div&css 20160304
- 【p1093-奖学金】解题记录
- MPU6050姿态融合