当前位置:   article > 正文

ScrollView中smoothScrollTo()方法无效

smoothscrollto

最近在写一个自定义的View继承于ScrollView时出现了一个问题,就是调用smoothScrollTo()方法时不起作用了,scrollTo()方法是没有问题的,但我们想要一种平滑的效果,所以就得使用smoothScrollTo()方法。网上找了好多方法,只有一种方法目前是有效的,就是使用post()方法,具体如下:


  1. this.post(new Runnable() {
  2. @Override
  3. public void run() {
  4. smoothScrollTo(0, 0);
  5. }
  6. });

this代表当前的类,也就是w继承于ScrollView的自定义View。

问题的现象是解决了,接下来就该看看其中的原理了。

跟进post()方法,可以看到这个是View类中的方法:


  1. /**
  2. * <p>Causes the Runnable to be added to the message queue.
  3. * The runnable will be run on the user interface thread.</p>
  4. *
  5. * <p>This method can be invoked from outside of the UI thread
  6. * only when this View is attached to a window.</p>
  7. *
  8. * @param action The Runnable that will be executed.
  9. *
  10. * @return Returns true if the Runnable was successfully placed in to the
  11. * message queue. Returns false on failure, usually because the
  12. * looper processing the message queue is exiting.
  13. */
  14. public boolean post(Runnable action) {
  15. Handler handler;
  16. AttachInfo attachInfo = mAttachInfo;
  17. if (attachInfo != null) {
  18. handler = attachInfo.mHandler;
  19. } else {
  20. // Assume that post will succeed later
  21. ViewRootImpl.getRunQueue().post(action);
  22. return true;
  23. }
  24. return handler.post(action);
  25. }

看到注释中的第二行,再看看代码中的Handler,有没有一种很熟悉的感觉呢----通过Handler发送消息到主线程中对界面进行更新。当然这只是看到这两行代码后的初步猜想,具体的原理在下面的链接中有解释,其中的涉及的Handler及其内部类和关联类的知识点需要深度学习:

http://www.cnblogs.com/akira90/archive/2013/03/06/2946740.html

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/312717
推荐阅读
相关标签
  

闽ICP备14008679号