Android实现带Tab页引导的ViewPager
来源:互联网 发布:洛阳理工网络教学平台 编辑:程序博客网 时间:2024/05/22 15:54
Tab页很适合用来做平行功能之间的引导,而各功能页面用ViewPager来展示会显得比较平滑、过渡自然,所以自然就有了许多软件将二者结合,用于展示主功能界面,比如网易新闻和360优化大师的主界面,那么下面就来做一个这样的带Tab页的ViewPager吧~
基本需求:1,点击Tab页,ViewPager做出相应滑动,且Tab页中有表示切换的动画
2,滑动ViewPager,Tab页中有表示切换的动画
3,Tab页可以动态添加并自行计算所占宽度
基本思路是:用一个横向LinearLayout管理动态加载的Tab页,下方是ViewPager,再用代码将二者关联起来就可以了,代码如下
public class TabViewPager extends LinearLayout{ /* 数据段begin */ public final static String TAG = "TabViewPager"; private Context mContext; private LinearLayout mTabHost; private ImageView mUnderline; private ViewPager mViewPager; //tab及underline宽度,也是underline的最小移动距离 private int mTabWidth; /* 数据段end */ /* 函数段begin */ public TabViewPager(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; inflate(mContext, R.layout.tab_view_pager, this); initViews(); } private void initViews() { mTabHost = (LinearLayout) findViewById(R.id.tab_host); mUnderline = (ImageView) findViewById(R.id.tab_underline); mViewPager = (ViewPager) findViewById(R.id.view_pager); } public void initTabs(String[] tabTitles, int parentWidth) { LinearLayout.LayoutParams tabHostLayoutParams; TextView tab; mTabWidth = parentWidth / tabTitles.length; //设置宽度 if (tabTitles.length > 0) { tabHostLayoutParams = new LinearLayout.LayoutParams(mTabWidth, LinearLayout.LayoutParams.WRAP_CONTENT); } else { return; } //动态添加tab for (int loopVal = 0; loopVal < tabTitles.length; loopVal++) { tab = new TextView(mContext); tab.setText(tabTitles[loopVal]); tab.setTextSize(22); tab.setTextColor(getResources().getColor(R.color.white)); tabHostLayoutParams.weight = 1; tabHostLayoutParams.gravity = Gravity.CENTER_VERTICAL; tab.setLayoutParams(tabHostLayoutParams); tab.setGravity(Gravity.CENTER); tab.setOnClickListener(new TabOnClickListener(loopVal)); mTabHost.addView(tab); } //设置underline宽度,使得下划线与tab宽度保持一致 FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(mTabWidth, FrameLayout.LayoutParams.WRAP_CONTENT); frameLayoutParams.gravity = Gravity.BOTTOM; mUnderline.setLayoutParams(frameLayoutParams); mUnderline.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_view_pager_underline)); } public void setAdapter(PagerAdapter pagerAdapter) { mViewPager.setAdapter(pagerAdapter); //滑动viewPager时也要执行mUnderline的移动动画 mViewPager.setOnPageChangeListener(new OnPageChangeListener() { private int currentPosition = -1; private int nextPosition = -1; @Override public void onPageSelected(int position) { nextPosition = position; //mUnderline的移动动画 mUnderline.startAnimation(new UnderlineTranslateAnimation(currentPosition * mTabWidth, nextPosition * mTabWidth, 0, 0)); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { currentPosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); } public void setCurrentItem(int position) { //记录当前的位置后再设置选中位置 int currentPosition = mViewPager.getCurrentItem(); mViewPager.setCurrentItem(position); int nextPosition = mViewPager.getCurrentItem(); //mUnderline的移动动画 mUnderline.startAnimation(new UnderlineTranslateAnimation(currentPosition * mTabWidth, nextPosition * mTabWidth, 0, 0)); } /* 函数段end */ /* 内部类begin */ private class TabOnClickListener implements OnClickListener { private int viewPosition = -1; public TabOnClickListener(int position) { viewPosition = position; } @Override public void onClick(View v) { if (AppEnv.bAppdebug) { Log.d(TAG, "tab onClick --> " + ((TextView) v).getText()); } setCurrentItem(viewPosition); } } private class UnderlineTranslateAnimation extends TranslateAnimation { public UnderlineTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) { super(fromXDelta, toXDelta, fromYDelta, toYDelta); setFillAfter(true); } } /* 内部类end */}这样,只需调用initTabs()来设置Tab页,和setAdapter()来设置适配器即可使用。
相应布局代码
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:ignore="ContentDescription" > <FrameLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <LinearLayout android:id="@+id/tab_host" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="horizontal" > </LinearLayout> <ImageView android:id="@+id/tab_underline" android:layout_width="0dp" android:layout_height="0dp" /> </FrameLayout> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="7" /></LinearLayout>
- Android实现带Tab页引导的ViewPager
- Android实现带Tab页引导的ViewPager
- Android实现带Tab页引导的ViewPager
- Android实现带Tab页引导的ViewPager
- Android使用ViewPager实现引导页(带小点提示)
- Android ViewPager程序引导页的实现
- Android ViewPager实现引导页
- android引导页viewpager实现
- Android ViewPager实现引导页
- 一个带指示器的引导页(ViewPager)
- Android实践-使用ViewPager和Fragment实现带Tab导航条的仿新闻类页面
- Android引导页动画的基本实现方法—ViewPager
- Android底部Tab页基于ViewPager的实现
- android通过viewpager实现引导页效果
- android使用ViewPager实现欢迎引导页
- android使用ViewPager实现引导页效果
- android: 带很多tab的指示器的ViewPager
- Tab+ViewPager的实现
- 如何在Eclipse中创建Maven项目?
- 整数取反
- UITableView总结
- JConsole 远程监控Tomcat服务
- 将按钮灰掉 即设置不可点击状态
- Android实现带Tab页引导的ViewPager
- [转]C语言,指针与内存分配
- 百度地图Label 样式 setStyle
- linux内核中一些关键词讲解
- Objective-C的日志宏
- android中通过id获得drawable类型的数据
- 调用第三方库 多线程开发防止
- asp_异步增删查改(2)
- java中的泛型方法