zoukankan      html  css  js  c++  java
  • Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)

    1) ViewPager提供了左右滑动切换页面的方法,但是它所提供的标题只是无语,估计没有真正的项目会照搬拿过来;并且它只能一页一页滑,我想直接查看最后一页要滑半天;

    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

  • 相关阅读:
    idea添加类注释和方法注释
    蓝桥杯ALGO-1,区间k大数查询
    personalblog
    ul+li水平居中的几种方法
    前端ps部分
    帝国cms-tab
    帝国cms判断某一字段是否为空
    帝国cms建站总结-(分页)
    Js获取验证码倒计时
    前端截取字符串:JS截取字符串之substring、substr和slice详解
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/8202686.html
Copyright © 2011-2022 走看看