仿豌豆荚ViewPager下拉

在豌豆荚的应用详情页中有个ViewPager布局,该布局头部添加了一个可上下收展的view用于显示应用资料。实现思路基本上就是利用ViewDragHelper进行拖动来控制头部的view的布局。当TopView可见时,手势事件被拖动层截获控制上下拖动达到TopView的折叠和展开效果。当TopView不可见时,手势事件交由ViewPager进行控制达到ListView正常滚动,并在ListView的onScroll滚动监听中判断ListView是否触顶。如果触顶则下拉拖动ViewPager显示TopView.

项目已经上传到Github的DragTopLayout.

先看下效果图:

实现过程



1.继承一个FrameLayout,在FrameLayout中控制子View拖动。FrameLayout初始化中实例化一个ViewDragHelper对象。

ViewDragHelper.create(this, 1.0f, callback);

2.参数中callback即为拖动过程中所有的事件回调,实现一个ViewDragHelper.Callback()。

Callback中的所用到得方法如下:

// 判断child是否是拖动的目标
tryCaptureView(View child, int pointerId)
// 拖动位置的处理,可以处理拖动过程中的最高位置或者最低位置
clampViewPositionVertical(View child, int top, int dy)
// 拖动后view位置的改变
onViewPositionChanged(View view, int left, int top, int dx, int dy)
// 拖动手势释放后的处理
onViewReleased(View releasedChild, float xvel, float yvel)
// 拖动状态的改变
onViewDragStateChanged(int state)

3.覆盖onInterceptTouchEvent和onTouchEvent方法,将事件拦截处理。

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return shouldIntercept && dragHelper.shouldInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        dragHelper.processTouchEvent(event);
        return true;
    }

4.覆盖computeScroll方法,用以实现拖动后的滚动效果

    @Override
    public void computeScroll() {
        if (dragHelper.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }

5.简单地拖动差不多实现了,下面就需要在Callback中进行拖动事件的自定义逻辑处理了。

先利用tryCaptureView判断当前touch的view是否是目标拖动view,返回true则拖动处理,false不处理。

return child == dragContentView;

在clampViewPositionVertical方法中处理拖动的最高高度不超过上边界。

    @Override
    public int clampViewPositionVertical(View child, int top, int dy) {
            return Math.min(topViewHeight, Math.max(top, getPaddingTop()));
    }

在onViewPositionChanged方法中控制拖动后新位置的处理。因为拖动过程中还需对TopView进行相应地处理,所以在方法内记录拖动的top位置,并在onLayout回调方法中处理最新位置的现实。

    @Override
    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
        super.onViewPositionChanged(changedView, left, top, dx, dy);
        contentTop = top;
        requestLayout();
    }

当释放手势后判断手势方向利用settleCapturedViewAt方法进行处理最终滚动位置。其中yvel参数>0代表快速往下滑动,否则为快速往上滑动。

    @Override
    public void onViewReleased(View releasedChild, float xvel, float yvel) {
        super.onViewReleased(releasedChild, xvel, yvel);
        // yvel > 0 Fling down || yvel < 0 Fling up
        int top;
        if (yvel > 0 || contentTop > topViewHeight) {
            top = topViewHeight + getPaddingTop();
        } else {
            top = getPaddingTop();
        }
        if (wizard.enableSliding) {
            dragHelper.settleCapturedViewAt(releasedChild.getLeft(), top);
        }
        postInvalidate();
    }

这样就处理好了拖动的所有事件了。具体代码可参考Github上的项目。



联系方式:

  • Chenupt - [email protected]
  • 微博:chenupt
  • QQ:753785666
时间: 2024-10-08 05:07:08

仿豌豆荚ViewPager下拉的相关文章

安卓开发之Kotlin和java双实现仿qq空间下拉图片拉伸

先不扯淡看今天要实现的效果: 话说使用Kotlin实现安卓功能,那我们还是要做一点准备工作,so,你得加一点插件到eclipse或android studio.然并卵,你现在还在使用eclipse开发的话我只能提供地址Kotlin Plugin for Eclipse,然后我使用的还是死丢丢. 死丢丢(android studio)集成kotlin安卓开发 要使用android studio开发kotlin的安卓app,那么你必须有开发kotlin的环境: Kotlin插件.打开Android

Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

前言: 因为公司人员变动原因,导致了博主四个月没有动安卓,一直在做IOS开发,如今接近年前,终于可以花一定的时间放在安卓上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下目标效果以及demo效果:      因为此效果实现的步骤较多,所以今天博主要实现以上效果的第一步——打造一个通用的下拉刷新控件,具体效果如下: GIF图片比较大,还希望读者能耐心等待一下下从效果图中可以看出,我们的下拉刷新的滑动还是很流畅的,可能大多数开发者用的是XListview或者PullTo

Android自定义控制(五)仿新浪微博的下拉刷新

网上有很多很有名的开源框架,这里就来拉拉PullToRefresh这个框架,也就是我们平时用的下拉刷新啦,当然你问我这个有什么用啊?别人已经写好了,这里主要是学习以及练习,练习的次数多了,一切就顺其自然的会了. 废话少说,先上图,再上代码: 1.要想实现下拉刷新功能必须要有个下拉刷新的布局,是吧? <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="htt

MDNavBarView下拉导航菜单(仿美团导航下拉菜单)

说到下拉导航菜单这个东西用得还真不少,细心算一下做开发以来这样的菜单已经写了第三次了,但基本都是不能复用.感觉特累人.不经意看到同事写一个类似的下拉菜单,但他引用了开源库仿大众菜单的库,大致看了一下,感觉挺不错的,复用性也比较好,但要 是换成别的样式就要去修改代码了,感觉这有点不方便也比较容易出错.于是参照他的大致思路写了一个仿下拉菜单. 具体的实现就不多说了,觉得有意思的话可以下来看看.下面说一下使用方法吧: 1.添加navbarview包下的代码与对应资源 2.布局文件中添加: <com.m

仿新浪下拉菜单

要求 仿新浪网,鼠标移入显示下拉菜单,鼠标移出隐藏下拉菜单,具体表现如下图: 代码 <ul> <li id="top">微博</li> <li class="hide">私信</li> <li class="hide">评论</li> <li class="hide">@我</li> </ul> <sc

jquery 仿百度搜索下拉框的插件

转载地址:http://www.open-open.com/lib/view/open1420624048437.html 今天写了个下拉插件分享出来 效果: , 可以搜素,也可以使用上下键选择匹配出来的值 css 1 .select4_box { 2 border: 1px solid #5897fb; 3 position: absolute; 4 width: 250px; 5 background: #fff; 6 border-radius: 4px; 7 -webkit-box-sh

仿今日头条下拉出现SearchBar,再下拉刷新效果,SearchListView实现以及原理讲解

先看效果 分别是我的效果和今日头条的效果: 以上效果包括: 1.如果下拉的高度超过search view的高度的3/4,但是小于head view高度,则松开手时search view自动出现 2.如果下拉的高度小于search view的高度的1/4,则松开手时search view自动回弹消失 3.如果下拉的高度超过head view的总高度,则松手进行刷新 4.刷新完成自动隐藏search view 实现原理讲解 参考了 github开源项目:[https://github.com/viv

Android自定义下拉刷新动画--仿百度外卖下拉刷新

好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错.好了废话不多说了,开始我们今天的主题吧.现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前两天订饭的时候不经意间看到了"百度外卖"的下拉刷新,今天的主题就是它–自定义下拉刷新动画. 看一下实现效果吧: 动画 我们先来看看Android中的动画吧: Android中的动画分为三种: Tween动画,这一类的动画提供了旋转.平移.缩放等效果. Alpha – 淡入淡出 Scale

Android 轻松实现仿QQ空间下拉刷新

(本文讲解了在Android中实现列表下拉刷新的动态效果的过程,文末附有源码.) 看完本文,您可以学到: 1.下拉刷新的实现原理 2.自定义Android控件,重写其ListView 3.ScrollListener滚动监听 4.Adapter适配器的使用 话不多说,先来看看效果图: 接下来我们一步一步地实现以上的效果. 一.图文并茂的ListViewItem 看一下这一步的效果图: 首先,我们要实现的是带下拉刷新效果的ListView.所以我们选择自己重写原生控件ListView.只需要写一个