View调用scrollTo()、scrollBy()的理解及使用(移动内容而非位置)

MainActivity如下:

package cc.uu;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
/**
 * Demo描述:
 * scrollTo()和scrollBy()的理解以及使用
 * 
 * 原理说明:
 * 1 其实View是没有边界,在屏幕上看到的只是View的一部分而已
 * 2 scrollTo()和scrollBy()的本质一样只是表现形式略有不同
 *   与这两个方法密切相关的两个变量mScrollX和mScrollY在
 *   View的源码中可以看到:
 *   
 *   //The offset,in pixels,by which the content of this view is scrolled horizontally.
 *   protected int mScrollX;
 *   
 *   //The offset,in pixels,by which the content of this view is scrolled vertically.
 *   protected int mScrollY;
 *   
 *   通过文档描述可知:
 *   mScrollX和mScrollY表示:View的内容(content)相对于View本身在水平或垂直方向的偏移量.
 *   
 *   scrollTo(int x, int y)方法:
 *   将一个视图的内容移动到指定位置.此时偏移量 mScrollX,mScrollY就分别等于x,y.
 *   默认情况下 mScrollX和mScrollY均为0
 *   
 *   scrollBy(int x, int y)方法:
 *   在现有的基础上继续移动视图的内容.
 *   在该方法的源码很简单,也体现了这一点,如下:
 *   public void scrollBy(int x, int y) {  
 *      scrollTo(mScrollX + x, mScrollY + y);  
 *   }  
 *   默认情况下 mScrollX和mScrollY均为0
 *   
 *   再次强调和注意:
 *   scrollTo()和scrollBy()移动的只是View的内容,但是View的背景是不移动的.
 *   为了体现这点,在该示例中为View添加了背景色.
 *   
 *   继续上面问题的延伸:
 *   假如一个ViewGroup(比如XXXLayout)调用了scrollTo(By)()方法会怎样?
 *   它的Content(即它所有的子View)都会移动,这点在下个例子中可以看到.
 *   
 *   
 * 3 scrollTo(int x,int y)和scrollBy(int x,int y)方法的坐标说明
 *   比如我们对于一个TextView调用scrollTo(0,25)
 *   那么该TextView中的content(比如显示的文字:Hello)会怎么移动呢?
 *   向下移动25个单位?不,恰好相反.
 *   这是为什么呢?
 *   因为调用这两个方法会导致视图重绘.
 *   即调用public void invalidate(int l, int t, int r, int b)方法.
 *   此处的l,t,r,b四个参数就表示View原来的坐标.
 *   在该方法中最终会调用:
 *   tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
 *   p.invalidateChild(this, tmpr);
 *   其中tmpr是ViewParent,tmpr是Rect,this是原来的View.
 *   通过这两行代码就把View在一个Rect中重绘.
 *   请注意第一行代码:
 *   原来的l和r均减去了scrollX
 *   原来的t和b均减去了scrollY
 *   就是说scrollX如果是正值,那么重绘后的View的宽度反而减少了;反之同理
 *   就是说scrollY如果是正值,那么重绘后的View的高度反而减少了;反之同理
 *   所以,TextView调用scrollTo(0,25)和我们的理解相反
 *   
 *   scrollBy(int x,int y)方法与上类似,不再赘述.
 *   
 *   
 *   该示例的说明,请参加下面的代码注释
 *   
 *   
 * 参考资料:
 * 1 http://blog.csdn.net/wangjinyu501/article/details/32339379
 * 2 http://blog.csdn.net/qinjuning/article/details/7247126
 *   Thank you very much
 *   
 * 
 * 备注说明:
 * 使用scrollTo(By)()方法移动过程较快而且比较生硬.
 * 为了优化scrollTo(By)()的滑动过程可采用Scroller类.
 * 该类源码第一句This class encapsulates scrolling.
 * 就指明了该类的目的:封装了滑动过程.
 * 在后面的示例中,将学习到Scroller的使用.
 *
 */
public
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值