博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android UI开发第四十篇——ScrollTricks介绍
阅读量:6680 次
发布时间:2019-06-25

本文共 3558 字,大约阅读时间需要 11 分钟。

hot3.png

ScrollTricks是一个开源控件,实现了两个简单功能:

1、Quick Return:向上滑动时,View也向上滑动并且消失,当向下滑动时,View马上出现。例如Google Now的搜索功能。

2、Sticky:类似的同步滚动,特定的View最多滑动到顶部并保持固定不动。例如大众点评或美团的“立即购买”功能。

    ScrollTricks的两个效果原理是两个相同的View同在一个FrameLayout布局,这里是android:id="@+id/placeholder",android:id="@+id/sticky"两个View。监控ScrollView的滑动,根据android:id="@+id/placeholder" View的位置控制android:id="@+id/sticky"View的位置。主要是对ScrollView滚动的Y值得监听。

看一下sticky的实现:

public class StickyFragment extends Fragment implements ObservableScrollView.Callbacks {    private TextView mStickyView;    private View mPlaceholderView;    private ObservableScrollView mObservableScrollView;    public StickyFragment() {    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        ViewGroup rootView = (ViewGroup) inflater                .inflate(R.layout.fragment_content, container, false);        mObservableScrollView = (ObservableScrollView) rootView.findViewById(R.id.scroll_view);        mObservableScrollView.setCallbacks(this);        mStickyView = (TextView) rootView.findViewById(R.id.sticky);        mStickyView.setText(R.string.sticky_item);        mPlaceholderView = rootView.findViewById(R.id.placeholder);        mObservableScrollView.getViewTreeObserver().addOnGlobalLayoutListener(                new ViewTreeObserver.OnGlobalLayoutListener() {                    @Override                    public void onGlobalLayout() {                        onScrollChanged(mObservableScrollView.getScrollY());                    }                });        return rootView;    }    @Override    public void onScrollChanged(int scrollY) {    	    	Log.d("onScroll", "Y:"+scrollY+"|"+mPlaceholderView.getTop());        mStickyView.setTranslationY(Math.max(mPlaceholderView.getTop(), scrollY));    }    @Override    public void onDownMotionEvent() {    }    @Override    public void onUpOrCancelMotionEvent() {    }}

ObservableScrollView的实现:

public class ObservableScrollView extends ScrollView {    private Callbacks mCallbacks;    public ObservableScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected void onScrollChanged(int l, int t, int oldl, int oldt) {        super.onScrollChanged(l, t, oldl, oldt);        if (mCallbacks != null) {            mCallbacks.onScrollChanged(t);        }    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        if (mCallbacks != null) {            switch (ev.getActionMasked()) {                case MotionEvent.ACTION_DOWN:                    mCallbacks.onDownMotionEvent();                    break;                case MotionEvent.ACTION_UP:                case MotionEvent.ACTION_CANCEL:                    mCallbacks.onUpOrCancelMotionEvent();                    break;            }        }        return super.onTouchEvent(ev);    }    @Override    public int computeVerticalScrollRange() {        return super.computeVerticalScrollRange();    }    public void setCallbacks(Callbacks listener) {        mCallbacks = listener;    }    public static interface Callbacks {        public void onScrollChanged(int scrollY);        public void onDownMotionEvent();        public void onUpOrCancelMotionEvent();    }}

下载:

/**
* 张兴业
*  http://blog.csdn.net/xyz_lmn
*  我的新浪微博:
*/

转载于:https://my.oschina.net/201003674/blog/289007

你可能感兴趣的文章
Oracle10g RAC 单独关闭一个节点(维护)
查看>>
CentOS7怎么保存退出vi编辑
查看>>
上海一日游记
查看>>
ArchLinux上卸载高版本的jdk安装低版本的jdk
查看>>
进程间通信
查看>>
CIO需要消除八个大数据神话
查看>>
分布式系统之CAP理论
查看>>
注释方式汇总
查看>>
突破吞吐限制,多NAS性能聚合方案,数据上传及读写
查看>>
Flume 1.5.0简单部署试用
查看>>
lastlog
查看>>
Spring MVC 4.2.2 中最好的集成静态资源的方法
查看>>
计算机专业常用英语
查看>>
HBase源码分析之Region上Spilt流程
查看>>
UBuntu14.04下安装和卸载Qt5.3.1
查看>>
ZooKeeper 笔记(1) 安装部署及hello world
查看>>
青年之锋——文学之家
查看>>
Chromium Embedded Framework中文文档之(基本使用)
查看>>
【干货】Pycon 2017: Python可视化库大全
查看>>
Memcache Binary Protocol
查看>>