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[]{, , , , , , };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mActivity = this;
- mTitleMargin = dip2px(this, );
- 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=; 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();
- textViewList.get().setTextColor(Color.rgb(, , ));
- currentPos = ;
- }
- /**
- * 添加标题栏
- * @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==){
- width = ;
- moveToList.add(width);
- }
- //第N个标题的滑动距离是上一个标题的宽度加上标题之间的间隔,这样的话滑动viewPager的时候保证当前标题栏在最左侧
- else{
- int w = View.MeasureSpec.makeMeasureSpec(, View.MeasureSpec.UNSPECIFIED);
- int h = View.MeasureSpec.makeMeasureSpec(, View.MeasureSpec.UNSPECIFIED);
- textViewList.get(position-).measure(w, h);
- width = textViewList.get(position-).getMeasuredWidth() + mTitleMargin*;
- moveToList.add(width+moveToList.get(moveToList.size()-));
- }
- }
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- }
- /**
- * 滑动viewPager
- */
- @Override
- public void onPageSelected(int position) {
- textViewList.get(currentPos).setTextColor(Color.rgb(, , )); //将之前的标题栏颜色变回来
- textViewList.get(position).setTextColor(Color.rgb(, , )); //将当前标题栏变色
- currentPos = position; //设置当前索引
- scrollView.scrollTo((int) moveToList.get(position), ); //标题栏跟随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(, , ));
- currentPos = (int) view.getTag();
- textViewList.get(currentPos).setTextColor(Color.rgb(, , ));
- 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实现标题栏滑动(腾讯新闻)的更多相关文章
- android Viewpager HorizontalScrollView 实现分页栏拖拽
源码:http://files.cnblogs.com/android100/ViewPaperDemo.rar首先我们先看一个效果: 前两个是网易的,它做的title不能拖拽,.不过点击动画效果挺 ...
- android记帐本、涂鸦、仿腾讯新闻、仿bilibili、Markdwon便签、资讯APP等源码
Android精选源码 kotlin版仿哔哩哔哩动画Android客户端源码 android实现图片涂鸦效果源码 Android 开源记账本项目源码 android高仿腾讯新闻app源码 androi ...
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPa ...
- Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突
用HorizontalScrollView实现类似微信的滑动删除 测试于:Android2.2+ 对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的I ...
- Android ViewPager再探:增加滑动指示条
上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...
- Android ViewPager初探:让页面滑动起来
下一篇:<Android ViewPager再探:增加滑动指示条> ViewPager需要用到适配器PagerAAdapter,以下四个函数需要重写: instantiateItem(Vi ...
- android笔记:ViewPager实现界面的滑动
最近在学习ViewPager实现界面的滑动,拜读了郭神的博客文章,并抽取归纳了自己对ViewPager的理解. ViewPager实现界面滑动的步骤如下: 1.在xml布局内加入控件android.s ...
- Android 使用ViewPager实现左右循环滑动图片
ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一 ...
- Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; ...
随机推荐
- oracle11g expdp/impdp数据库
oracle11g导入/导出数据库 导出 .创建目录 sqlplus / as sysdba create directory dbDir as 'd:\oralce_sdic_backup\'; g ...
- 使用RoboCopy 命令[转载]
经常进行文件管理操作的朋友们,不满意于Windows系统内置的复制功能,因为它太龟速了.于是大家就使用FastCopy.TeraCopy之类的软件来加速复制,但是你是否知道Windows 7已经内置快 ...
- STM32F104VG (一)中断与外部中断
一.基础知识 1.ARM的中断优先级分硬件优先级和软件优先级两种 当中软件优先级又由抢占优先级和响应优先级组成 2.中断的优先级採用编号小优先的原则. 3.普通情况: 1).假设设定了软件优先级.先看 ...
- Windows命令实现匿名邮件发送
在日常工具开发中,常常会有发送邮件的需求.在一些高级语言中,如Python.C#中,都有专门的邮件发送模块,如Python 中的 smtplib 模块.那么.一封邮件究竟是怎样发送到一个特定的邮箱呢? ...
- WEB安全实战(四)关于 Cookie
前言 这几天中,一直再跟漏洞打交道,而在这些漏洞中,出现的最多的就是 Cookie 和 Session 了.这篇文章就简单的介绍一些 Cookie 中最经常使用的四个属性.也算是为兴许的文章做一个铺垫 ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq
大意:一个数组,三个操作,第一种是区间[a,b]每个数乘乘,第二种是区间[a,b]每个数加c,第三种是查询[a,b]区间的和并对p取摸. 两种操作就不能简单的只往下传标记.每次传乘法标记时,要把加法标 ...
- Redis: Redis on Windows Setup
ylbtech-Redis: Redis on Windows Setup 1.返回顶部 1. 2. 3. 4. 5. 6. 7. 8. 9. 2.返回顶部 3.返回顶部 4.返回顶部 5 ...
- libnids 显示UDP数据报,编译,运行,正确。
#include<stdio.h>#include<nids.h>#include<string.h>#include <sys/socket.h>#i ...
- 8. Ext文本输入框:Ext.form.TextField属性汇总
转自:https://blog.csdn.net/ryuudenne/article/details/8834650 Ext.form.TextField主要配置表: allowBlank ...
- Linux 上安装 Node.js
Linux 上安装 Node.js 直接使用已编译好的包(在个人阿里云服务器47.100.6.106上安装) Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使 ...