任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法,但使用这两个方法完成的滚动效果是跳跃式的,没有任何平滑滚动的效果.而Scroller正是实现平滑滚动的利器

Android Scroller完全解析

View滑动的若干方法

startScroll方法

对于Scroller的startScroll 方法一直不太理解

startScroll

added in API level 9
public void startScroll (int startX,
int startY,
int dx,
int dy)
Start scrolling by providing a starting point and the distance to travel. The scroll will use the default value of 250 milliseconds for the duration. Parameters
startX int: Starting horizontal scroll offset in pixels. Positive numbers will scroll the content to the left.
startY int: Starting vertical scroll offset in pixels. Positive numbers will scroll the content up.
dx int: Horizontal distance to travel. Positive numbers will scroll the content to the left.
dy int: Vertical distance to travel. Positive numbers will scroll the content up.

例子: 点击Button实现平滑滚动

public class ScrollerButton extends Button {
private OverScroller mScroller; public ScrollerButton(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new OverScroller(context);
} @Override
public void computeScroll() {
super.computeScroll();
if (mScroller.computeScrollOffset()) {
((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
} public void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll(scrollX, 0, delta, 0, 2000);
invalidate();
}
} ----
调用部分:
scrollToBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
layout.scrollTo(-60, 0);
}
}); smoothScrollToBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
smoothScrollToBtn.smoothScrollTo(-60, 0);
}
});

由于滚动都是针对内容,要想实现Button整体移动, computeScroll中要调用其父控件的scrollTo方法

  • 比较奇怪是,第一次点击, Butoon两秒后向右移动到60位置
  • 再次点击,又重复这个动作,先向左回到0,再向右回到 60 -> 0 -> 60

为什么会这样呢, 原来是getScrollX()在捣鬼, Button始终没有执行过ScroolTo和ScroolBy方法, 所以getScrollX始终为0. 所以一直重复 0 到 -60

论startScroll的正确用法

 public void smoothScrollTo(int destX, int destY) {
int scrollX = ((View) getParent()).getScrollX();
Log.i(TAG, "smoothScrollTo: " + scrollX);
mScroller.startScroll(scrollX, 0, destX - scrollX, 0, 2000);
invalidate();
}
  • 第一个参数的要写getScrollX(), 避免上面的奇怪现象
  • 第三个参数要减去scrollX, 这样可以保证滑到指定位置就不滑了, 否则回出现始终滑动的问题.
  void startScroll(int start, int distance, int duration) {
mFinished = false; mCurrentPosition = mStart = start;
mFinal = start + distance; mStartTime = AnimationUtils.currentAnimationTimeMillis();
mDuration = duration; // Unused
mDeceleration = 0.0f;
mVelocity = 0;
}

理解Scroller的更多相关文章

  1. 滚来滚去,滚来滚去...Scroller完全解析

    API: 1 mScroller.getCurrX() //获取mScroller当前水平滚动的位置 2 mScroller.getCurrY() //获取mScroller当前竖直滚动的位置 3 m ...

  2. Android Scroller类的详细分析

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/7321910 Scroller这个类理解起来有一定的困难,刚开始接触Scrol ...

  3. 下拉刷新XListView的简单分析

    依照这篇博文里的思路分析和理解的 先要理解Scroller,看过的博文: http://ipjmc.iteye.com/blog/1615828 http://blog.csdn.net/wangji ...

  4. android Scroller类的理解

    Scroller 一个特例: **点击Button后可能View没有移动,要关闭硬件加速,这段代码中int detalX = (int) (event.getX() - downX)要更正. demo ...

  5. 【安卓进阶】Scroller理解与应用

    项目中有个需求,就是在RecyclerView的item中进行侧滑,一开始同事推荐了一个开源库,使用起来确实也方便好用,直接在布局作为父布局即可实现侧滑. 自己也非常好奇这个开源库到底用了什么API能 ...

  6. [Android Pro] Scroller使用分析

    reference to : http://blog.csdn.net/a910626/article/details/51548840 一.Scroller是什么? Android里 Scrolle ...

  7. Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解

    前言:  虽然本文标题的有点标题党的感觉,但无论如何,通过这篇文章的学习以及你自己的实践认知,写个简单的滑屏小 Demo还是just so so的. 友情提示: 在继续往下面读之前,希望您对以下知识点 ...

  8. Android 带你从源码的角度解析Scroller的滚动实现原理

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢! 今天给大 ...

  9. Android View视图系统分析和Scroller和OverScroller分析

    Android  View视图系统分析和Scroller和OverScroller分析 View  视图分析         首先,我们知道.在Android中全部的视图资源(无论是Layout还是V ...

随机推荐

  1. xml与dataset的数据交互

    1. this.dsConfig = new DataSet(); //使用指定的文件将 XML 架构和数据读入 System.Data.DataSet. this.dsConfig.ReadXml( ...

  2. 【Unity笔记】经典的鼠标点击射线检测碰撞

    void Update (){ )){ //从摄像机发出到点击坐标的射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Ra ...

  3. kubernetes生态圈

    1:helm(部署工具,可以用来部署常用的应用,替代kubelet原生命令) https://github.com/kubernetes/helm 应用列表:https://github.com/ku ...

  4. Fiddler2 java代码拦截设置

    jre -DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 Or: jre -DproxySet=true -Dproxy ...

  5. C/C++捕获段错误,打印出错的具体位置(精确到哪一行)_转

    转自:C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 修订:2013-02-16 其实还可以使用 glibc 的 backtrace_symbols 函数,把栈帧各返回地址里面的数字地址翻译 ...

  6. ipad safari 滚动(overflow)解决方案

    项目需要放到ipad应用了,发现有一个奇怪的问题,就是我div是设置滚动属性的,在pc上面的各个浏览器页面变小时,会出现滚动条,可是是ipad的safari,则不会滚动,开始以为是div的问题 但发现 ...

  7. synchronize模块

    synchronize模块 使用rsync同步文件,其参数如下: archive: 归档,相当于同时开启recursive(递归).links.perms.times.owner.group.-D选项 ...

  8. kettle中执行sql语句

    一.直接执行sql,不添加任何参数 1.先找出执行sql语句的控件 2.打开控件,填写要执行的sql语句,主要下图中的红框中选项,后面会介绍各个选项的作用 二.执行sql,变量替换选项,变量指的是ke ...

  9. easyui Datagrid+searchbox 实现搜索功能

    1.前台页面 <%@ page language="java" pageEncoding="utf-8" isELIgnored="false& ...

  10. R工具包

    直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和爬一些R的资料,看着看着就入迷了,这就是个大宝库了,以前怎么没发现,看来还是太狭隘了.直到前几天我看到这个 ...