android自定义View之自定义可置顶ScrollView,View滑动原理简析

使用各种App的时候,发现一个特点,现在的App在可以滑动的页面中,基本上都添加了一个置顶按钮的效果,使的用户可以很方便的回到顶部,就像网页中几乎所有的页面都有置顶效果按钮一样,觉得这个交互不错,以后自己的项目里也肯定会用到的,就抽空把这个小功能实现了一下,现在把实现过程记录下,以方便以后使用。

先看下效果图:

当ScrollView向上滑动超过一定距离后,就渐变的出现一个置顶的按钮,当滑动距离小于我们指定的距离时,按钮又以一个渐变的方式消失。

实现原理:

这个小案例的实现原理很简单:1.就是监听View的onScrollChanged()方法,获取到ScrolView滑动的距离,如果大于我们的距离,则出现置顶按钮,否则,隐藏

2.按钮点击事件的处理,点击按钮让整个ScrollView滑动到(0,0)位置即可。

虽然这个案例很简单,但是却涉及到了android的滑动原理,从onScrollViewChanged这个方法属于View这个类也可以看出,android的任何View都是可以滑动的,在这个案例后,我会说一下我对android滑动原理的理解。

自定义ScrollView代码:

<span style="font-size:14px;">/********************************************************** * @文件名称:GoTopScrollView.java * @文件作者:rzq * @文件描述:滑动超过一定距离后,出现置顶按钮 * @修改历史:2015年3月26日创建初始版本 **********************************************************/public class GoTopScrollView extends ScrollView implements OnClickListener{private ImageView goTopBtn;private int screenHeight;public GoTopScrollView(Context context, AttributeSet attrs){super(context, attrs);}public void setScrollListener(ImageView goTopBtn){this.goTopBtn = goTopBtn;this.goTopBtn.setOnClickListener(this);}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt){super.onScrollChanged(l, t, oldl, oldt);/** * 滑动距离超过300px,出现向上按钮,可以做为自定义属性 */if (t >= 300){goTopBtn.setVisibility(View.VISIBLE);}else{goTopBtn.setVisibility(View.GONE);}}@Overridepublic void onClick(View v){if (v.getId() == R.id.go_top_btn){this.smoothScrollTo(0, 0);}}}</span>Activity使用代码:<span style="font-size:14px;">private void initView(){container = (RelativeLayout) findViewById(R.id.container);container.setLayoutTransition(new LayoutTransition());goTopBtn = (ImageView) findViewById(R.id.go_top_btn);scrollView = (GoTopScrollView) findViewById(R.id.scroll_view);scrollView.setScrollListener(goTopBtn);}</span> 这样就很轻松的实现了这个置顶的效果,但仅仅这样是不够的,现在我们来分析一下android的滑动原理到底是怎么回事,是不是只有ScrollView才可以滑动。

1.首先,android中任意的View,都是可以滑动的,为什么呢?请看View中的关键源码,只挑出和滑动有关的代码:

<span style="font-size:14px;"> /*** 指定X轴的滑动,Y轴不动* @param value the x position to scroll to*/public void setScrollX(int value) {scrollTo(value, mScrollY);}/*** 指定Y轴的滑动,X轴不动* @param value the y position to scroll to*/public void setScrollY(int value) {scrollTo(mScrollX, value);} /**     * 真正处理滑动的方法     * @param x the x position to scroll to     * @param y the y position to scroll to     */    public void scrollTo(int x, int y) {        if (mScrollX != x || mScrollY != y) {            int oldX = mScrollX;            int oldY = mScrollY;            mScrollX = x;            mScrollY = y;            invalidateParentCaches();            onScrollChanged(mScrollX, mScrollY, oldX, oldY);            if (!awakenScrollBars()) {                postInvalidateOnAnimation();            }        }    }    /**     * Move the scrolled position of your view. This will cause a call to     * {@link #onScrollChanged(int, int, int, int)} and the view will be     * invalidated.     * @param x the amount of pixels to scroll by horizontally     * @param y the amount of pixels to scroll by vertically     */    public void scrollBy(int x, int y) {        scrollTo(mScrollX + x, mScrollY + y);    }/**     * 触发滑动后的监听     * @param l Current horizontal scroll origin.     * @param t Current vertical scroll origin.     * @param oldl Previous horizontal scroll origin.     * @param oldt Previous vertical scroll origin.     */    protected void onScrollChanged(int l, int t, int oldl, int oldt) {        if (AccessibilityManager.getInstance(mContext).isEnabled()) {            postSendViewScrolledAccessibilityEventCallback();        }        mBackgroundSizeChanged = true;        final AttachInfo ai = mAttachInfo;        if (ai != null) {            ai.mViewScrollChanged = true;        }    }</span><span style="font-size:14px;"> </span>逆境磨练人、逆境是老师、逆境之苦可变甜。

android自定义View之自定义可置顶ScrollView,View滑动原理简析

相关文章:

你感兴趣的文章:

标签云: