1. 程式人生 > >Android ViewPager+HorizontalScrollView實現標題欄滑動(騰訊新聞)

Android ViewPager+HorizontalScrollView實現標題欄滑動(騰訊新聞)

flat off net 單位 上一個 undle scrollto 一起 ava

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

Android ViewPager+HorizontalScrollView實現標題欄滑動(騰訊新聞)