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; ...
随机推荐
- pkill有的时候并不能杀死进程?
pkill的用法:http://man.linuxde.net/pkill 根据进程命令行,杀死进程 如下intellij.go代码为一个代理服务器,把本地请求转向一个代理 package main ...
- [52ABP系列] - 002、模板项目配合代码生成器开发
前言 本篇的主要内容是 52ABP SPA模板如何配合52ABP代码生成器开发项目 如果不了解 52ABP 项目请先看我的第一篇文章 [52ABP系列] - 001.SPA免费项目模版搭建教程 话不多 ...
- 在Linux(centos)上安装PHP的mongodb扩展 成功试过的
到http://pecl.php.net/package/mongo下载相应的mongodb客户端,本例为1.2.1# wget http://pecl.php.net/get/mongo-1.2.1 ...
- C语言中结构体变量之间赋值
近期,我阅读了某新员工小刘写的C语言代码,发现其对结构体变量之间的赋值不是非常熟悉. 对于两个同样类型的结构体变量,他均採用的是逐个成员变量直接赋值的形式.例如以下的代码演示样例: 如上代码所看到的, ...
- Oracle新建数据库
确定楼主是以管理员身份登录的:1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password ...
- Cocos2d-x编译Android环境
1.Android环境搭配: 下载jdk 下载Android ADT 下载安装Android SDK,地址:http://developer.android.com/sdk/index.html#do ...
- Dagger2----一个最简单的Dagger2依赖的实现
Dagger2是首个使用生成代码实现完整依赖注入的框架,极大降低了使用者的编码负担.Dagger2分析全部依赖并生成代码将这些依赖组织在一起,关于很多其它的Dagger2理论介绍请移步具体解释Dagg ...
- CPU上电时序详细分析
首先是RTC电源,这部分电力是永远不关闭的,除非电池(纽扣电池)没电并且没接任何外部电源(比如电池和电源适配器). RTC用以保持机器内部时钟的运转和保证CMOS配置信息在断电的情况下不丢失:其次,在 ...
- preparing launch delegate问题
启动tomcat成功,但是右下角一直显示100%点进去 发现preparing launch delegate卡在100% 以为是代理的事,把代理关了,还是不行,最后发现是数据库没有,导入数据库后完美 ...
- activity工作流表结构分析
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository( ...