理解Scroller
任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法,但使用这两个方法完成的滚动效果是跳跃式的,没有任何平滑滚动的效果.而Scroller正是实现平滑滚动的利器
对于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的更多相关文章
- 滚来滚去,滚来滚去...Scroller完全解析
API: 1 mScroller.getCurrX() //获取mScroller当前水平滚动的位置 2 mScroller.getCurrY() //获取mScroller当前竖直滚动的位置 3 m ...
- Android Scroller类的详细分析
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/7321910 Scroller这个类理解起来有一定的困难,刚开始接触Scrol ...
- 下拉刷新XListView的简单分析
依照这篇博文里的思路分析和理解的 先要理解Scroller,看过的博文: http://ipjmc.iteye.com/blog/1615828 http://blog.csdn.net/wangji ...
- android Scroller类的理解
Scroller 一个特例: **点击Button后可能View没有移动,要关闭硬件加速,这段代码中int detalX = (int) (event.getX() - downX)要更正. demo ...
- 【安卓进阶】Scroller理解与应用
项目中有个需求,就是在RecyclerView的item中进行侧滑,一开始同事推荐了一个开源库,使用起来确实也方便好用,直接在布局作为父布局即可实现侧滑. 自己也非常好奇这个开源库到底用了什么API能 ...
- [Android Pro] Scroller使用分析
reference to : http://blog.csdn.net/a910626/article/details/51548840 一.Scroller是什么? Android里 Scrolle ...
- Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解
前言: 虽然本文标题的有点标题党的感觉,但无论如何,通过这篇文章的学习以及你自己的实践认知,写个简单的滑屏小 Demo还是just so so的. 友情提示: 在继续往下面读之前,希望您对以下知识点 ...
- Android 带你从源码的角度解析Scroller的滚动实现原理
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢! 今天给大 ...
- Android View视图系统分析和Scroller和OverScroller分析
Android View视图系统分析和Scroller和OverScroller分析 View 视图分析 首先,我们知道.在Android中全部的视图资源(无论是Layout还是V ...
随机推荐
- wp中的动画
动画目标:必须是依赖属性.可以用于Double,Color,Point,Object类型.对应的动画类后面加Animation,下面代码演示旋转360°. <Button Content=&qu ...
- redis 最优雅的错误提示
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis ...
- Winform DatagridviewcomboboxColumn Disable Style
DataGridViewComboBoxCell cell =(DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex]; c ...
- [uart]3.tty驱动分析
转自:http://www.wowotech.net/linux_kenrel/183.html 目录: 1 首先分析设备驱动的注册 1.1 uart_register_driver分析 1.2 tt ...
- dac7562 应用层实现dac
/* * dac7562 (using spidev driver) * */ #include <stdint.h>#include <unistd.h>#include ...
- ruby send respond_to
http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html http://galeki.is-progr ...
- [转载]php设计模式之单例、多例设计模式
单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...
- OpenCV_基于局部自适应阈值的图像二值化
在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...
- Node.js进程通信模块child_process
前言 Node.js是一种单线程的编程模型,对Node.js的赞美和诟病的也都是因为它的单线程模型,所有的任务都在一个线程中完成(I/O等例外).单线程模型,不仅让代码非常简洁,更是直接避免了线程调度 ...
- QMainWindow + QtabWidget 实现 菜单栏 和 标签
from PyQt5.QtWidgets import ( QMainWindow, QMenu, QAction, QTabWidget) if __name__ == '__main__': im ...