学习笔记--了解Scroller
来源:互联网 发布:软件商店开发 编辑:程序博客网 时间:2024/04/28 13:26
Scroller是什么?
Scroller类一个滚动工具类,它可以view等控件的实现平滑移动,可以控制方向速度,长短等数值。
Scroller只是个计算器,提供插值计算,让滚动过程具有动画属性,但它并不是UI,也不是滑动辅助UI运动,反而是单纯地为滑动提供计算。
那是什么来设置滑动事件呢?
真正让ViewGroup滑动滚动的是Scroller中的scrollBy()和scrollTo()两个方法。
参考 [http://www.jb51.net/article/77796.htm]
scrollTo()的源码:
public void scrollTo(int x, int y) { if (mScrollX != x || mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { invalidate(); } } }
从上面可以看出,如果传入的x,y等于View的偏移量x与y,则不移动;如果不相等,就调用onScrollChanged()方法,然后改变界面,重绘界面,就实现了滑动。
scrollBy()的源码:
public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }
从上可以看出,scrollBy()是在scrollTo的基础上增加了(x,y)的数值。为何不再次调用scrollTo()呢?因为scrollTo是在相对于view的上一个位置进行移动的,因此用到了scrollBy(),它是在当前的位置上进行滑动。
如果要包裹一个LinearLayout中的控件移动,要在button外部裹上一层LinearLayout,这样才能滑动。
还有重要的一点:单纯的使用scrollTo与scrollBy,并不会实现滑动的效果,so要再加上Scroller.
参考[http://blog.csdn.net/xiaanming/article/details/17483273]
Scroller的使用
- 创建Scroller的实例
- 调用startScroll()方法来初始化滚动数据并刷新界面
- 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑
public class ScrollerLayout extends ViewGroup { /** * 用于完成滚动操作的实例 */ private Scroller mScroller; /** * 判定为拖动的最小移动像素数 */ private int mTouchSlop; /** * 手机按下时的屏幕坐标 */ private float mXDown; /** * 手机当时所处的屏幕坐标 */ private float mXMove; /** * 上次触发ACTION_MOVE事件时的屏幕坐标 */ private float mXLastMove; /** * 界面可滚动的左边界 */ private int leftBorder; /** * 界面可滚动的右边界 */ private int rightBorder; public ScrollerLayout(Context context, AttributeSet attrs) { super(context, attrs); // 第一步,创建Scroller的实例 mScroller = new Scroller(context); ViewConfiguration configuration = ViewConfiguration.get(context); // 获取TouchSlop值 mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); // 为ScrollerLayout中的每一个子控件测量大小 measureChild(childView, widthMeasureSpec, heightMeasureSpec); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (changed) { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); // 为ScrollerLayout中的每一个子控件在水平方向上进行布局 childView.layout(i * childView.getMeasuredWidth(), 0, (i + 1) * childView.getMeasuredWidth(), childView.getMeasuredHeight()); } // 初始化左右边界值 leftBorder = getChildAt(0).getLeft(); rightBorder = getChildAt(getChildCount() - 1).getRight(); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mXDown = ev.getRawX(); mXLastMove = mXDown; break; case MotionEvent.ACTION_MOVE: mXMove = ev.getRawX(); float diff = Math.abs(mXMove - mXDown); mXLastMove = mXMove; // 当手指拖动值大于TouchSlop值时,认为应该进行滚动,拦截子控件的事件 if (diff > mTouchSlop) { return true; } break; } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: mXMove = event.getRawX(); int scrolledX = (int) (mXLastMove - mXMove); if (getScrollX() + scrolledX < leftBorder) { scrollTo(leftBorder, 0); return true; } else if (getScrollX() + getWidth() + scrolledX > rightBorder) { scrollTo(rightBorder - getWidth(), 0); return true; } scrollBy(scrolledX, 0); mXLastMove = mXMove; break; case MotionEvent.ACTION_UP: // 当手指抬起时,根据当前的滚动值来判定应该滚动到哪个子控件的界面 int targetIndex = (getScrollX() + getWidth() / 2) / getWidth(); int dx = targetIndex * getWidth() - getScrollX(); // 第二步,调用startScroll()方法来初始化滚动数据并刷新界面 mScroller.startScroll(getScrollX(), 0, dx, 0); invalidate(); break; } return super.onTouchEvent(event); } @Override public void computeScroll() { // 第三步,重写computeScroll()方法,并在其内部完成平滑滚动的逻辑 if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate(); } }}
转载至:[http://blog.csdn.net/guolin_blog/article/details/48719871]
- 学习笔记--了解Scroller
- Android Scroller学习笔记
- Scroller、scrollTo、ScrollBy学习笔记
- Scroller学习
- Scroller 学习
- 学习笔记-WMI了解
- Python 学习笔记 -了解
- [Egret学习笔记 五]GUI Scroller的使用
- 关于Scroller的学习及相关的知识笔记get
- Android学习笔记-使用Scroller来滚动视图
- Android Scroller 源码笔记
- app-framework学习--Scroller
- Scroller的学习
- 学习Scroller类看这篇就够了
- Android中Scroller类的了解
- RPG学习笔记(基本知识了解)
- 学习笔记--了解主要视频格式
- 了解Boilerplate - 学习笔记 一
- 如何在Xcode8上安装插件
- 使用Hive遇到的错误
- ViewPager+RadioGroup 实现网络加载图片的轮播
- 基于zookeeper的分布式锁实现
- JavaScript中的while和do while循环
- 学习笔记--了解Scroller
- 深入Android MediaPlayer的使用方法详解
- C语言fgets读取整个文本文件的内容
- C# 第十四章 上机1-5
- Tomcat 报 The valid characters are defined in RFC 7230 and RFC 3986
- 复习iOS动画-layer-4
- 关于Android Spinner setSelection 和 onItemSelected事件的触发顺序
- VC运行库合集
- Android中检查更新APK,以及下载APK安装。