查看原文
其他

一招教你打造一个滑动置顶的视觉特效

2017-10-31 codeGoogler 终端研发部

【公众号回复“1024”,送你一个特别推送】

博客地址:

http://www.jianshu.com/p/6e500ac77c6e

声明原创|本文为codeGooger独家发布,未经允许请勿转载

正文

一个滑动悬浮置顶的View,通过自定义ScrollView来实现一个精美的固定悬浮效果

效果图:

这个特效其实没有那么复杂!

思路:

  • 自定义ListView对头布局进行处理

  • 自定义 RecycleView 貌似很复杂的样子

  • 自定义Behavior 把问题复杂化了

  • 自定义listView + PopuWindows

  • 自定义ViewGroup ,(需要重写onLayout等方法)

  • 自定义Scrollview,对View进行处理

思来考去,其实我们写View的时候以少量的代码打造轮子才是精髓。于是对scrollView进行处理。这就方便很多了!!!

通过广告栏的高度H和view中Y方向所滑动的距离Y进行比较,从而对view进行处理

关键代码:

重写onTouchEvent获取滑动的距离

/** * 重写onTouchEvent, 当用户的手在HoveringScrollview上面的时候, */ public boolean onTouchEvent(MotionEvent ev) {        //直接将HoveringScrollview滑动的Y方向距离回调给onScroll方法中        if (onScrollListener != null) {            onScrollListener.onMyScroll(lastScrollY = this.getScrollY());        }        switch (ev.getAction()) {            //当用户抬起手的时候,  HoveringScrollview可能还在滑动,            // 所以当用户抬起手我们隔6毫秒给handler发送消息,            // 在handler处理 HoveringScrollview滑动的距离        case MotionEvent.ACTION_UP:            handler.sendMessageDelayed(handler.obtainMessage(), 20);            break;        }        return super.onTouchEvent(ev); }; `

需要在Handler里面进行

/** * 用于用户手指离开MyScrollView的时候获取MyScrollView滚动的Y距离,然后回调给onScroll方法中 */ private Handler handler = new Handler() {    public void handleMessage(android.os.Message msg) {        int scrollY = HoveringScrollview.this.getScrollY();        // 此时的距离和记录下的距离不相等,在隔6毫秒给handler发送消息?        if (lastScrollY != scrollY) {            lastScrollY = scrollY;            handler.sendMessageDelayed(handler.obtainMessage(), 6);        }        if (onScrollListener != null) {            onScrollListener.onMyScroll(scrollY);        }    }; };

重要的在监听回调里面做一些操作:

   @Override    public void onMyScroll(int scrollY) {        LogUtils.e("yuyahao","scrollY: " +scrollY);        // TODO Auto-generated method stub        if (scrollY >= searchLayoutTop) {            if (hoveringLayout.getParent() != search01) {                search02.removeView(hoveringLayout);                search01.addView(hoveringLayout);            }        } else {            if (hoveringLayout.getParent() != search02) {                search01.removeView(hoveringLayout);                search02.addView(hoveringLayout);            }        }    }

当广告栏的高亮 大于手指所滑动的高度的时候,所指定固定悬浮的View在他本身父布局的View中,否则指定一个顶部的父容器添加在里面即可。

更多文章

上半年技术文章集合—184篇文章分类汇总

关于编程,你想要的这里都有

那些年不容错过的智能刷新加载框

NDK项目实战—高仿360手机助手之卸载监听

最新2017(Android)面试题级答案(精选版)

Android Studio3.0更新之路(遇坑必入)

送书活动:(截止日期2017年11月06星期一晚上十点24方便)

送书福利,不忘初心

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!


日   更   精   彩

微  信  号:codeGoogler

终端研发部


如果你觉得此文对您有所帮助,可以转发给身边的朋友,一起做一个乐于分享的小猿猿


            

这里学到不仅仅是技术


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存