Android学习Scroller(一)——View调用scrollTo()的理解及使用

MainActivity如下:
[java]  view plain copy
  1. package cc.uu;  
  2.   
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7. import android.widget.TextView;  
  8. import android.app.Activity;  
  9. /** 
  10.  * Demo描述: 
  11.  * scrollTo()和scrollBy()的理解以及使用 
  12.  *  
  13.  * 原理说明: 
  14.  * 1 其实View是没有边界,在屏幕上看到的只是View的一部分而已 
  15.  * 2 scrollTo()和scrollBy()的本质一样只是表现形式略有不同 
  16.  *   与这两个方法密切相关的两个变量mScrollX和mScrollY在 
  17.  *   View的源码中可以看到: 
  18.  *    
  19.  *   //The offset,in pixels,by which the content of this view is scrolled horizontally. 
  20.  *   protected int mScrollX; 
  21.  *    
  22.  *   //The offset,in pixels,by which the content of this view is scrolled vertically. 
  23.  *   protected int mScrollY; 
  24.  *    
  25.  *   通过文档描述可知: 
  26.  *   mScrollX和mScrollY表示:View的内容(content)相对于View本身在水平或垂直方向的偏移量. 
  27.  *    
  28.  *   scrollTo(int x, int y)方法: 
  29.  *   将一个视图的内容移动到指定位置.此时偏移量 mScrollX,mScrollY就分别等于x,y. 
  30.  *   默认情况下 mScrollX和mScrollY均为0 
  31.  *    
  32.  *   scrollBy(int x, int y)方法: 
  33.  *   在现有的基础上继续移动视图的内容. 
  34.  *   在该方法的源码很简单,也体现了这一点,如下: 
  35.  *   public void scrollBy(int x, int y) {   
  36.  *      scrollTo(mScrollX + x, mScrollY + y);   
  37.  *   }   
  38.  *   默认情况下 mScrollX和mScrollY均为0 
  39.  *    
  40.  *   再次强调和注意: 
  41.  *   scrollTo()和scrollBy()移动的只是View的内容,但是View的背景是不移动的. 
  42.  *   为了体现这点,在该示例中为View添加了背景色. 
  43.  *    
  44.  *   继续上面问题的延伸: 
  45.  *   假如一个ViewGroup(比如XXXLayout)调用了scrollTo(By)()方法会怎样? 
  46.  *   它的Content(即它所有的子View)都会移动,这点在下个例子中可以看到. 
  47.  *    
  48.  *    
  49.  * 3 scrollTo(int x,int y)和scrollBy(int x,int y)方法的坐标说明 
  50.  *   比如我们对于一个TextView调用scrollTo(0,25) 
  51.  *   那么该TextView中的content(比如显示的文字:Hello)会怎么移动呢? 
  52.  *   向下移动25个单位?不,恰好相反. 
  53.  *   这是为什么呢? 
  54.  *   因为调用这两个方法会导致视图重绘. 
  55.  *   即调用public void invalidate(int l, int t, int r, int b)方法. 
  56.  *   此处的l,t,r,b四个参数就表示View原来的坐标. 
  57.  *   在该方法中最终会调用: 
  58.  *   tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY); 
  59.  *   p.invalidateChild(this, tmpr); 
  60.  *   其中tmpr是ViewParent,tmpr是Rect,this是原来的View. 
  61.  *   通过这两行代码就把View在一个Rect中重绘. 
  62.  *   请注意第一行代码: 
  63.  *   原来的l和r均减去了scrollX 
  64.  *   原来的t和b均减去了scrollY 
  65.  *   就是说scrollX如果是正值,那么重绘后的View的宽度反而减少了;反之同理 
  66.  *   就是说scrollY如果是正值,那么重绘后的View的高度反而减少了;反之同理 
  67.  *   所以,TextView调用scrollTo(0,25)和我们的理解相反 
  68.  *    
  69.  *   scrollBy(int x,int y)方法与上类似,不再赘述. 
  70.  *    
  71.  *    
  72.  *   该示例的说明,请参加下面的代码注释 
  73.  *    
  74.  *    
  75.  * 参考资料: 
  76.  * 1 http://blog.csdn.net/wangjinyu501/article/details/32339379 
  77.  * 2 http://blog.csdn.net/qinjuning/article/details/7247126 
  78.  *   Thank you very much 
  79.  *    
  80.  *  
  81.  * 备注说明: 
  82.  * 使用scrollTo(By)()方法移动过程较快而且比较生硬. 
  83.  * 为了优化scrollTo(By)()的滑动过程可采用Scroller类. 
  84.  * 该类源码第一句This class encapsulates scrolling. 
  85.  * 就指明了该类的目的:封装了滑动过程. 
  86.  * 在后面的示例中,将学习到Scroller的使用. 
  87.  * 
  88.  */  
  89. public class MainActivity extends Activity {  
  90.     private TextView mTextView;  
  91.     private Button mLeftButton;  
  92.     private Button mRightButon;  
  93.     @Override  
  94.     protected void onCreate(Bundle savedInstanceState) {  
  95.         super.onCreate(savedInstanceState);  
  96.         setContentView(R.layout.main);  
  97.         init();  
  98.     }  
  99.       
  100.     private void init(){  
  101.         mTextView=(TextView) findViewById(R.id.textView);  
  102.         mLeftButton=(Button) findViewById(R.id.leftButton);  
  103.         mLeftButton.setOnClickListener(new ClickListenerImpl());  
  104.         mRightButon=(Button) findViewById(R.id.rightButton);  
  105.         mRightButon.setOnClickListener(new ClickListenerImpl());  
  106.     }  
  107.       
  108.     /** 
  109.      * 示例说明: 
  110.      * 1 每次点击leftButton的时候 
  111.      *   1.1 调用scrollBy()让mTextView的内容(即文字)在原本偏移的基础上往左移30 
  112.      *   1.2 调用scrollBy()让mLeftButton的内容(即文字)在原本偏移的基础上也往左移30 
  113.      * 2 每次点击rightButton的时候 
  114.      *   2.1 调用scrollTo()让mTextView的内容(即文字)直接往右偏移30,而不管以前的基础(即 mScrollX和mScrollY) 
  115.      * 3 连续几次点击leftButton会看到mTextView的内容(即文字)每点一次都会往左移动30, 
  116.      *   然后再点击一次rightButton会看到mTextView的内容(即文字)直接一次性到了往右30的位置,而 
  117.      *   不是慢慢移动过去. 
  118.      *   这么操作 
  119.      *   1 很好的体现了这两个方法的区别. 
  120.      *   2 直观地看了scrollTo()方法的效用,它是不管以前的偏移量的. 
  121.      * 4 在该例中也可以看到调用这两个方法时,View的背景是没有移动.移动的是内容. 
  122.      */  
  123.     private class ClickListenerImpl implements OnClickListener {  
  124.         @Override  
  125.         public void onClick(View v) {  
  126.             switch (v.getId()) {  
  127.             case R.id.leftButton:  
  128.                 //让mTextView的内容往左移  
  129.                 mTextView.scrollBy(300);  
  130.                 //让mLeftButton的内容也往左移  
  131.                 mLeftButton.scrollBy(200);  
  132.                 break;  
  133.             case R.id.rightButton:  
  134.                 //让mTextView的内容往右移直接到-30的位置  
  135.                 mTextView.scrollTo(-300);  
  136.                 break;  
  137.             default:  
  138.                 break;  
  139.             }  
  140.         }  
  141.   
  142.     }  
  143.   
  144. }  















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值