Android 使用Scroller自动滚动第一种实现
来源:互联网 发布:原生js获取子元素节点 编辑:程序博客网 时间:2024/05/02 03:07
源码下载 , 效果图如下:
1. 自定义视图继承自ViewGroup,覆写onMeasure,onLayout,之前文章介绍过覆写这两个方法。
2. 提供两个方法供两个button使用,向左向右移动。调用startScroll (int startX, int startY, int dx, int dy)方法, 以提供的起始点和将要滑动的距离开始滚动。滚动会使用缺省值250ms作为持续时间。
3. 设置滚动的便宜量childView.offsetLeftAndRight(leftAndRightOffset);
4. 调用invalidate()进行重绘
5. 延迟短暂时间,返回执行3,4步骤
public class CustomViewGroup extends ViewGroup { // =========================================================== // Constants // =========================================================== private static final int DELAY_MILLIS = 1000 / 60; // =========================================================== // Fields // =========================================================== // 记录上次滚动的位置,用于计算滚动偏移量 private int mOffsetX = 0; private Scroller mScroller = new Scroller(getContext()); private Handler mHandler = new Handler(); private Runnable mScrollerRunnable = new ScrollerRunnable(); // 每次滚动的距离 private int mScrollWidth = 300; // =========================================================== // Constructors // =========================================================== public CustomViewGroup(Context context) { super(context); } public CustomViewGroup(Context context, AttributeSet attrs) { super(context, attrs); } public CustomViewGroup(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } // =========================================================== // Getter & Setter // =========================================================== /** * 向右滚动 */ public void scrollToRight() { scroll(true); } /** * 向左滚动 */ public void scrollToLeft() { scroll(false); } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); measureChildren(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(widthSize, heightSize); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); int measuredWidth = childView.getMeasuredWidth(); int measuredHeight = childView.getMeasuredHeight(); childView.layout(mOffsetX, 0, mOffsetX + measuredWidth, measuredHeight); } } // =========================================================== // Methods // =========================================================== private void scroll(boolean scrollToRight) { // 向右滚动举例是正值,反之负值 int scrollWidth = scrollToRight ? mScrollWidth: -mScrollWidth; // 此次滚动的X轴终点位置 int scrollFinalX = mOffsetX + scrollWidth; // 不能移出边界 if (scrollFinalX > 300 || scrollFinalX < 0) { return; } // 清除 mHandler.removeCallbacks(mScrollerRunnable); // 触发开始滚动 mScroller.startScroll(mOffsetX, 0, scrollWidth, 0); // 子线程中间隔段时间重绘视图 mHandler.post(mScrollerRunnable); } /** * 设置view滚动后的x坐标的位置 * * @param offsetX */ private void setOffsetX(int offsetX) { if (offsetX == mOffsetX) { return; } final int leftAndRightOffset = offsetX - mOffsetX; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); childView.offsetLeftAndRight(leftAndRightOffset); } mOffsetX = offsetX; } // =========================================================== // Inner and Anonymous Classes // =========================================================== private class ScrollerRunnable implements Runnable { @Override public void run() { final Scroller scroller = mScroller; if (scroller.computeScrollOffset()) { setOffsetX(scroller.getCurrX()); // 位置发生偏移,重绘 invalidate(); // 每过间隔时间,再次执行当前子线程 mHandler.postDelayed(this, DELAY_MILLIS); } } } }
扩展:
学习下Scroller原理
原文地址:http://blog.csdn.net/love_world_/article/details/8126234
- Android 使用Scroller自动滚动第一种实现
- Android 使用Scroller自动滚动第二种实现
- 使用Scroller实现滚动
- Android 滑动侧边栏(Sliding Menu)第一种实现 - 1 手动滚动+自动滚动
- Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理
- Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理
- Android Scroller的滚动实现原理
- Android 滚动类Scroller
- android关于Scroller与GestureDetector实现滚动的效果
- Android学习笔记-使用Scroller来滚动视图
- Scroller的滚动实现原理
- android 使用Scroller实现缓慢移动
- android 使用Scroller实现缓慢移动
- Android 使用Scroller 实现渐变式滑动
- Android Scroller简介 ---- 界面滚动
- Android使用Recyclerview实现图片水平自动循环滚动效果
- android 实现ScrollView自动滚动
- android Scroller使用
- 串口通信(Serial Communications)原理
- ubuntu12.04安装带调试功能的Bochs
- 用Wget工具批量下载远程FTP服务器上的文件
- 如何去写一个方法呢?
- nodejs版jsp/servlet终于完成了
- Android 使用Scroller自动滚动第一种实现
- 如何编译和加载.ko模块
- C++虚函数的默认实参
- StringManager Tomcat学习(转载)
- 串口通信
- 丢一年了,竟然能回得来。
- 关于拷贝
- 有关javascript方法命名规范
- C#中的for循环语句