Android ViewPager内容部分随手势上下滑动隐藏与显示Indicator效果的实现

效果

ViewPager中的内容,比如ListView手势上下滑动,当内容向下滑动时,即手势上划,隐藏indictor,当内容向上滑动时,即手势下滑,显示indicator,效果如图所示

编码

借用两个库来快速完成

1. ViewPagerIndicator

2. ObservableScrollView

将两个库引入项目中去,快速的搭建一个ViewPager框架后,在ViewPager每页对应的Fragment的布局中增加一个ListView,这个ListView使用ObservableScrollView库中的ListView

  • 主布局代码,使用线性布局,上方放置indicator,下方放置ViewPager
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/indicator"
        android:layout_width="fill_parent"
        android:layout_height="50dp" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

-Fragment代码,放置一个ObservableListView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <cn.edu.zafu.view.observableview.ObservableListView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
  • 业务逻辑代码

在Activity中初始化indicator和viewpager,然后再fragment中处理viewpager中内容即listview手势上下滑动与indicator的联动。在onCreateView中管理indicator,并获取其高度

indicator = (TabPageIndicator) getActivity().findViewById(indicatorId);
//获得indicator高度
indicator.post(new Runnable() {
    @Override
    public void run() {
        height=indicator.getHeight();
        Log.d("TAG", "height:"+height);
    }
});                         

关联listview并设置监听器

listView = (ObservableListView) view.findViewById(R.id.list);
listView.setScrollViewCallbacks(this);

fragment实现对应的接口

implements ObservableScrollViewCallbacks

实现的方法如下

@Override
public void onScrollChanged(int scrollY, boolean firstScroll,
        boolean dragging) {

}

@Override
public void onDownMotionEvent() {

}

@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {

}

在onUpOrCancelMotionEvent方法中完成显示和隐藏indicator

//获得高度的另一种方法
/*if(height==0){
    height=indicator.getHeight();
    Log.d("TAG", "height:"+height);
}*/
//如果手势向上则隐藏,手势向下则显示
if (scrollState == ScrollState.UP) {
    //如果显示的并且动画没有在进行,则隐藏
    if (isIndicatorShow&&!isShowing) {
        hideIndicator();
    }
} else if (scrollState == ScrollState.DOWN) {
    //如果没显示的并且动画没有在进行,则显示
    if (!isIndicatorShow&&!isShowing) {
        showIndicator();
    }
}

完成显示和隐藏的函数,使用属性动画完成一个过渡效果

public void showIndicator() {
    //属性动画translationY
    ObjectAnimator animator = ObjectAnimator.ofFloat(indicator, "translationY",
            0f);
    //持续时间
    animator.setDuration(500);
    //插值器,减速
    animator.setInterpolator(new DecelerateInterpolator(2));
    //监听器
    animator.addUpdateListener(new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            //不断增加indicator所在viewgroup的高度
            LayoutParams layoutParams = indicator.getLayoutParams();
            float v=(Float) animation.getAnimatedValue();
            Log.d("TAG","show:"+v);
            layoutParams.height=height+(int)v;
            //重新布局
            indicator.requestLayout();
        }
    });
    animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStart(Animator animation) {
            //动画开始后设置为true
            isShowing=true;
            super.onAnimationStart(animation);
        }
        @Override
        public void onAnimationEnd(Animator animation) {
            //动画结束后设置为false
            isShowing=false;
            //显示后设置为已显示
            isIndicatorShow = true;
            super.onAnimationEnd(animation);
        }

    });
    //开始动画
    animator.start();

}

public void hideIndicator() {

    ObjectAnimator animator = ObjectAnimator.ofFloat(indicator, "translationY",-height);
    animator.setDuration(500);
    //加速插值器
    animator.setInterpolator(new AccelerateInterpolator(2));
    animator.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            //不断减小indicator所在viewgroup的高度
            LayoutParams layoutParams = indicator.getLayoutParams();
            float v=(Float) animation.getAnimatedValue();
            Log.d("TAG","hide:"+v);
            layoutParams.height=height+(int)v;
            indicator.requestLayout();
        }
    });
    //同显示
    animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStart(Animator animation) {
            isShowing=true;
            super.onAnimationStart(animation);
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            isShowing=false;
            isIndicatorShow = false;
            super.onAnimationEnd(animation);
        }

    });
    animator.start();

}

所有用到的变量

    private View view = null;//存储fragemnt的视图
    private TabPageIndicator indicator = null;//indicator
    private ObservableListView listView = null;//listview
    private int indicatorId;//indicator对应的id值
    private int height=0;//indicator高低
    private boolean isIndicatorShow = true;//是否显示
    private boolean isShowing=false;//动画是否正在进行

源码下载

源码下载

时间: 2024-11-09 21:52:32

Android ViewPager内容部分随手势上下滑动隐藏与显示Indicator效果的实现的相关文章

Android TextView内容过长加省略号,点击显示全部内容

在Android TextView中有个内容过长加省略号的属性,即ellipsize,用法如下: 在xml中: android:ellipsize="end"   省略号在结尾 android:ellipsize="start" 省略号在开头 android:ellipsize="middle"   省略号在中间 android:ellipsize="marquee"  跑马灯 最好加一个TextView显示行数的约束,例如:

android 根据滑动隐藏或显示导航 类似手机QQ好友个人信息

//重写ScrollView public class NotifyingScrollView extends ScrollView { /** * @author Cyril Mottier */ public interface OnScrollChangedListener { void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt); } private OnScrollChangedListener m

标题栏的滑动隐藏和显示是怎么实现的?

在你日常使用App过程中,可能发现,有些应用界面的标题栏会随着屏幕滑动显示不同的效果(向上滑动时标题栏消失,向下滑动时标题栏出现). 开始注意到这个效果的时候觉得很有趣,后来知道这其实是Material Design中一个重要的设计思想.当用户向上滑动屏幕的时候,注意力主要集中在屏幕内容中,这时候一般不需要用到标题栏中功能的操作:当向下滑动时,标题栏自动显示.这样既能在用户浏览阅读内容时,避免标题栏干扰(碍眼),又不影响标题栏功能,达到提供用户更好阅读体验的目的. 那么,这个功能是怎么实现的呢?

NestedScrollView嵌套RecycleView 滑动 实现上滑隐藏 下滑显示头部效果

废了好大的劲才弄好的,记下来 方便以后查看 public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> mDatas; private HomeAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(

Android Toolbar跟随ListView滑动隐藏和现实

使用过Google Play Store应用或者Google+应用的人都知道,其ActionBar能随着ListView的滑动而相应的隐藏或者显示.效果看起来很不错,为此,我笨拙的模仿了一个类似的效果,不知道有没有更好的办法. 先上主布局activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.

iOS-实现映客首页TabBar和滑动隐藏NavBar和TabBar

之前在做直播的时候,参照了映客App,发现其首页的效果还挺不错,在网上找了一下相关仿映客App代码和博客,大部分都是说如何播放直播流和推流,对于UI这块甚少,所以我自己花了点时间研究了一下映客的首页UI效果. 转载自 SUN'S BLOG - 专注互联网知识,分享互联网精神! . 映客首页主要分两部分,一部分是实现没有文字而且中间按钮突出的TabBar,另一部分是显示滑动ScrollView隐藏和显示NavBar和TabBar.我们来慢慢看. 一.TabBar实现 首先,我们看下实现后的效果.

Android ViewPager和Fragment实现顶部导航界面滑动效果

在项目中,我们常常需要实现界面滑动切换的效果.例如,微信界面的左右滑动切换效果.那这种效果是怎么实现的?今天我就带大家简单了解ViewPager,并通过实例来实现该效果. 一. ViewPager 官方API 首先我们来看一下ViewPager官方给出的解释,如图: 具体意思如下: Layout 管理器允许用户可以在页面上,左右滑动来翻动页面.你可以考虑实现PagerAdapter接口来显示该效果. ViewPager很多时候会结合Fragment一块使用,这种方法使得管理每个页面的生命周期变得

Android 利用ViewPager实现底部圆点导航左右滑动效果以及Fragment页面切换

上一篇博文我们介绍了利用ViewPager和Fragment实现顶部滑块左右滑动效果,具体参考(http://blog.csdn.net/a123demi/article/details/39480385). 而本篇博文将实例讲解利用ViewPager实现底部圆点导航左右滑动效果,以及被滑动界面实现监听事件,同时通过Fragment实现页面的切换. 对于该效果的实现,需要实现以下几个问题: 1. 底部圆点加载和实现方法? 2. 怎样实现左右滑动效果? 3. 被滑动页面,怎样实现监听事件? 4.

android ViewPager左右滑动翻页,并可以删除page

首先新建一个Activity,继承FragmentActivity. 初始化一个Fragment的List集合,用于像FragmentStatePagerAdapter填充数据,而ViewPager由FragmentStatePagerAdapter的实例进行初始化.和ListView一样,Fragment的List集合的数据变了,就通知FragmentStatePagerAdapter进行界面刷新. ArrayList<Fragment> fragments =new ArrayList&l