View调用scrollTo()的理解及使用

PS:

该篇博客已经deprecated,不再维护,详情请参见 

站在源码的肩膀上全解Scroller工作机制

 http://blog.csdn.NET/lfdfhl/article/details/53143114

 

MainActivity如下:

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  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.  *  
  77.  * 备注说明: 
  78.  * 使用scrollTo(By)()方法移动过程较快而且比较生硬. 
  79.  * 为了优化scrollTo(By)()的滑动过程可采用Scroller类. 
  80.  * 该类源码第一句This class encapsulates scrolling. 
  81.  * 就指明了该类的目的:封装了滑动过程. 
  82.  * 在后面的示例中,将学习到Scroller的使用. 
  83.  * 
  84.  */  
  85. public class MainActivity extends Activity {  
  86.     private TextView mTextView;  
  87.     private Button mLeftButton;  
  88.     private Button mRightButon;  
  89.     @Override  
  90.     protected void onCreate(Bundle savedInstanceState) {  
  91.         super.onCreate(savedInstanceState);  
  92.         setContentView(R.layout.main);  
  93.         init();  
  94.     }  
  95.       
  96.     private void init(){  
  97.         mTextView=(TextView) findViewById(R.id.textView);  
  98.         mLeftButton=(Button) findViewById(R.id.leftButton);  
  99.         mLeftButton.setOnClickListener(new ClickListenerImpl());  
  100.         mRightButon=(Button) findViewById(R.id.rightButton);  
  101.         mRightButon.setOnClickListener(new ClickListenerImpl());  
  102.     }  
  103.       
  104.     /** 
  105.      * 示例说明: 
  106.      * 1 每次点击leftButton的时候 
  107.      *   1.1 调用scrollBy()让mTextView的内容(即文字)在原本偏移的基础上往左移30 
  108.      *   1.2 调用scrollBy()让mLeftButton的内容(即文字)在原本偏移的基础上也往左移30 
  109.      * 2 每次点击rightButton的时候 
  110.      *   2.1 调用scrollTo()让mTextView的内容(即文字)直接往右偏移30,而不管以前的基础(即 mScrollX和mScrollY) 
  111.      * 3 连续几次点击leftButton会看到mTextView的内容(即文字)每点一次都会往左移动30, 
  112.      *   然后再点击一次rightButton会看到mTextView的内容(即文字)直接一次性到了往右30的位置,而 
  113.      *   不是慢慢移动过去. 
  114.      *   这么操作 
  115.      *   1 很好的体现了这两个方法的区别. 
  116.      *   2 直观地看了scrollTo()方法的效用,它是不管以前的偏移量的. 
  117.      * 4 在该例中也可以看到调用这两个方法时,View的背景是没有移动.移动的是内容. 
  118.      */  
  119.     private class ClickListenerImpl implements OnClickListener {  
  120.         @Override  
  121.         public void onClick(View v) {  
  122.             switch (v.getId()) {  
  123.             case R.id.leftButton:  
  124.                 //让mTextView的内容往左移  
  125.                 mTextView.scrollBy(30, 0);  
  126.                 //让mLeftButton的内容也往左移  
  127.                 mLeftButton.scrollBy(20, 0);  
  128.                 break;  
  129.             case R.id.rightButton:  
  130.                 //让mTextView的内容往右移直接到-30的位置  
  131.                 mTextView.scrollTo(-30, 0);  
  132.                 break;  
  133.             default:  
  134.                 break;  
  135.             }  
  136.         }  
  137.   
  138.     }  
  139.   
  140. }  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

main.xml如下:

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     xmlns:tools="http://schemas.android.com/tools"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"  
    5.     >  
    6.   
    7.     <TextView  
    8.         android:id="@+id/textView"  
    9.         android:layout_width="wrap_content"  
    10.         android:layout_height="wrap_content"  
    11.         android:text="@string/hello_world"   
    12.         android:layout_centerHorizontal="true"  
    13.         android:layout_marginTop="20dip"  
    14.         android:background="@android:color/darker_gray"  
    15.     />  
    16.       
    17.     <Button   
    18.         android:id="@+id/leftButton"  
    19.          android:layout_width="wrap_content"  
    20.         android:layout_height="wrap_content"  
    21.         android:text="TextView移向屏幕的左边"   
    22.         android:layout_centerHorizontal="true"  
    23.         android:layout_marginTop="150dip"/>  
    24.       
    25.     <Button   
    26.         android:id="@+id/rightButton"  
    27.          android:layout_width="wrap_content"  
    28.         android:layout_height="wrap_content"  
    29.         android:text="TextView移向屏幕的右边"   
    30.         android:layout_centerHorizontal="true"  
    31.         android:layout_marginTop="250dip"/>  
    32.   
    33. </RelativeLayout>  
posted @ 2016-11-26 15:18  天涯海角路  阅读(172)  评论(0)    收藏  举报