案头见蠹鱼,犹胜凡俦侣。这篇文章主要讲述Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)相关的知识,希望能为你提供帮助。
1)
ViewPager提供了左右滑动切换页面的方法,但是它所提供的标题只是无语,估计没有真正的项目会照搬拿过来;
并且它只能一页一页滑,我想直接查看最后一页要滑半天;
【Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)】2) 看了腾讯新闻客户端感觉体验很好,所以就仿着写了,因为只是做个demo供大家交流也是给自己做个笔记,所以功能实现就行demo比较简单;
3) 有兴趣的可以在demo的基础拓展,如果哪里写得不好还望大家多多赐教、一起交流
4) 直接上主要代码,所以注释都写在代码里,最后会给工程包。(PS是在AS环境下生成的)
先放个效果图:
文章图片
MainActivity.java
package qi.demo; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import qi.demo.adapter.MyViewPagerAdapter; public class MainActivity extends FragmentActivity implements ViewPager.OnPageChangeListener{private MainActivity mActivity; private ViewPager viewPager; private HorizontalScrollView scrollView; private LinearLayout titleLayout; private ArrayList< Integer> moveToList; //viewPager滑动时标题栏跟随滑动距离 private int mTitleMargin; //每个标题间的间隔private ArrayList< Fragment> fragmentsList; //viewPager加载类 private ArrayList< TextView> textViewList; //标题控件集合 private ArrayList< String> titleList; //标题文字集合 private TestFragment fragment; private MyViewPagerAdapter mAdapter; private int currentPos; //现在显示的是第几页 private String[] strList = new String[]{"物业服务", "教育", "医疗卫生", "劳动保障", "交通出行", "投资服务", "关于左邻右里"}; private int[] idList = new int[]{0, 1, 2, 3, 4, 5, 6}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mActivity = this; mTitleMargin = dip2px(this, 10); initView(); initData(); }private void initView(){ viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setOnPageChangeListener(mActivity); scrollView = (HorizontalScrollView) findViewById(R.id.scrollView); titleLayout = (LinearLayout) findViewById(R.id.titleLayout); }/** *1)初始化viewPager *2)设置默认的Fragment */ private void initData(){ fragmentsList = new ArrayList< > (); titleList = new ArrayList< > (); textViewList = new ArrayList< > (); moveToList = new ArrayList< > (); mAdapter = new MyViewPagerAdapter(getSupportFragmentManager()); for(int i=0; i< strList.length; i++){ titleList.add(strList[i]); fragment = new TestFragment(mActivity, idList[i]); fragmentsList.add(fragment); addTitleLayout(titleList.get(i), idList[i]); } mAdapter.setData(fragmentsList); viewPager.setAdapter(mAdapter); viewPager.setOffscreenPageLimit(1); textViewList.get(0).setTextColor(Color.rgb(255, 0, 0)); currentPos = 0; }/** * 添加标题栏 * @param title标题名称 * @param position标题索引 */ private void addTitleLayout(String title, int position){ final TextView textView = (TextView) getLayoutInflater().inflate(R.layout.title, null); textView.setText(title); textView.setTag(position); textView.setOnClickListener(new posOnClickListener()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.leftMargin = dip2px(mActivity, mTitleMargin); params.rightMargin = dip2px(mActivity, mTitleMargin); titleLayout.addView(textView, params); textViewList.add(textView); int width; //如果是第一个标题则不设滑动距离 if(position==0){ width = 0; moveToList.add(width); } //第N个标题的滑动距离是上一个标题的宽度加上标题之间的间隔,这样的话滑动viewPager的时候保证当前标题栏在最左侧 else{ int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); textViewList.get(position-1).measure(w, h); width = textViewList.get(position-1).getMeasuredWidth() + mTitleMargin*4; moveToList.add(width+moveToList.get(moveToList.size()-1)); } }@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}/** * 滑动viewPager */ @Override public void onPageSelected(int position) { textViewList.get(currentPos).setTextColor(Color.rgb(0, 0, 0)); //将之前的标题栏颜色变回来 textViewList.get(position).setTextColor(Color.rgb(255, 0, 0)); //将当前标题栏变色 currentPos = position; //设置当前索引 scrollView.scrollTo((int) moveToList.get(position), 0); //标题栏跟随viewPager滑动 }@Override public void onPageScrollStateChanged(int state) {}/** *点击标题栏 */ class posOnClickListener implements View.OnClickListener{ @Override public void onClick(View view) { //点击的是当前标题什么都不做 if((int)view.getTag()==currentPos){ return; } //标题栏变色且设置viewPager textViewList.get(currentPos).setTextColor(Color.rgb(0, 0, 0)); currentPos = (int) view.getTag(); textViewList.get(currentPos).setTextColor(Color.rgb(255, 0, 0)); viewPager.setCurrentItem(currentPos); } }/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }}
MyViewPagerAdapter.java
public class MyViewPagerAdapter extends FragmentPagerAdapter {private ArrayList< Fragment> fragmentList; public MyViewPagerAdapter(FragmentManager fm) { super(fm); }public void setData(ArrayList< Fragment> fragmentList){ this.fragmentList = fragmentList; }@Override public Fragment getItem(int arg0) { return fragmentList.get(arg0); }@Override public int getCount() { return fragmentList.size(); }}
activity_main.xml
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> < HorizontalScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="60dp" android:scrollbars="none" android:background="#FFFFFF"> < LinearLayout android:id="@+id/titleLayout" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal"/> < /HorizontalScrollView> < android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"> < android.support.v4.view.PagerTabStrip android:id="@+id/pagerTabStrip" android:layout_width="0dp" android:layout_height="0dp"/> < /android.support.v4.view.ViewPager> < /LinearLayout>
demo下载地址:http://download.csdn.net/detail/qy7941237/9344763
推荐阅读
- Android TabHost 实现Tab切换
- 在android studio中配置运行时签名
- Android 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新
- Android ToolBar使用
- Android 比SwipeRefreshLayout更漂亮和强大的下拉刷新控件(Android-MaterialRefreshLayout)
- Android开发之漫漫长途 IX——彻底掌握Binder
- android dialog
- 洋葱头一键装机如何运用,本文教您运用洋葱头一
- 一键还原系统,本文教您如何运用一键还原软件还