Android攻城狮ScrollView

ScrollView 滚动视图
滚动视图是指当前拥有很多内容,屏幕显示不完整时,需要通过滚动来显示完整的视图。
-----------------------------
ScrollBar分两种:
HorizontalScrollView: 水平滚动视图
ScrollView: 垂直滚动视图
-----------------------------
隐藏滚动条有两种方式:
一种是在标签中设置: android:scrollbars="none"
另一种是在代码中设置: 
setHorizontalScrollBarEnable(false); 隐藏横向ScrollView
setVerticalScrollBarEnable(false); 隐藏纵向ScrollView


switch (event.getAction()){
    case MotionEvent.ACTION_MOVE:
        /**
         * 1.getScrollY()----滚动条滑动的距离
         * 2.getMeasuredHeight()
         * 3.getHeight()
         */
        //顶部状态
        if(scrollView.getScrollY()<=0){
            Log.i("Main","顶部");
        }
        //底部状态
        //scrollView.getChild(0) 表示 scrollView的第一个子View,这里就是TextView。
        //TextView的总高度=屏幕的高度+滚动条的最大滑动距离
        //这里的条件是TextView的总高度<=屏幕的高度+滚动条的滑动距离,一旦达成条件,就说明滚动条已经达到最大距离,也就是到底了。
        if(scrollView.getChildAt(0).getMeasuredHeight()<=scrollView.getHeight()+scrollView.getScrollY()){
            Log.i("Main","滑动到底部");
                            Log.i("Main","scrollView.getChildAt(0).getMeasuredHeight()="+scrollView.getChildAt(0).getMeasuredHeight()+" scrollView.getHeight()="+scrollView.getHeight()+
"scrollView.getScrollY()="+scrollView.getScrollY());
     textView.append(getResources().getString(R.string.content2));
   }
   break;


ScrollView的监听器——setOnTouchLiatener的使用
应用案例:判断 ScrollView 何时滑动到底部
类似于 ListView的下拉更新,但这里使用的是 TextView+ScrollView。
监听事件中含有 onTouch()方法,和上一章的 Flipper的 onTouchEvent类似。
-----------------------------------
getScrollY()----滚动条滑动的距离
getMeasuredHeight() 视图的真实高度(隐藏部分+显示部分)
getHeight() 视图显示部分的高度
--------------------------------------
摘自评论区:
<ScrollView>里边只能有一个元素,如果使用多个元素,需要把元素都放在<LinearLayout>等布局标签中,然后把布局标签在放在<ScrollView>否则放多个元素会报错。
--------------------------------------
摘自评论区:
那个滚动到底部或顶部的判断,放在MotionEvent.ACTION_MOVE不合适,那里会执行很多次操作;放在MotionEvent.ACTION_UP比较适合,手指松开再去执行。





scrollTo 和 scrollBy区别
scrollTo: 相对于滚动视图的起始位置,去滚动相应的距离,所以只能滑动一次。
scrollBy: 相对于当前位置,去滚动相应的距离,每滚动一次就会更新当前位置,所以能不断滚动。
scrollBy的源码:
public void scrollBy(int x,int y){
	scrollTo(mScrollX + x , mScrollY + y);
}
其中,mScrollX 和 mScrollY 表示当前坐标。
----------------------------------
应用案例:控制ScrollView视图的位置
实际案例:小说阅读,想要回到上次看的地方,如果采取手势滑动,要不停地滑,会比较麻烦,而现在采取按钮的方式代替手势滑动,可以直接定位到你上次浏览的地方,实现方法是记录上一次退出的位置,下次浏览时使用 scrollTo 或者 scrollBy  去恢复到上次浏览到的位置。
-------------------------------------
通过按钮滑动视图的步骤
1. 在 main.xml 中添加两个 Button,分别表示向上和向下(这里是垂直的ScrollView)。
2. 在 MainActivity中初始化这两个Button。令 MainActivity 实现接口 OnClickListener。
3. 对两个按钮设置监听器。
4. 重写 onClick():
(1)使用switch,通过view.getId()判断是哪个按钮点击。
(2)使用 scrollTo(int x,int y) 或者 scrollBy(int x,int y)实现滑动。
 1 // ScrollView嵌套TextView,实现滚动条 滚动效果
 2 //实现监听,对顶部和底部的判断
 3 //控制滚动条滚动的位置,向上滚动或者向下滚动指定距离
 4 public class MainActivity extends Activity implements OnClickListener {
 5     private TextView textView;
 6     private ScrollView scrollView;
 7     private Button up, down;
 8 
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.main);
13         up = (Button) findViewById(R.id.up);
14         down = (Button) findViewById(R.id.down);
15         up.setOnClickListener(this);
16         down.setOnClickListener(this);
17         textView = (TextView) findViewById(R.id.content);
18         textView.setText(getResources().getString(R.string.content));
19         scrollView = (ScrollView) findViewById(R.id.scrollview1);
20         //实现监听
21         scrollView.setOnTouchListener(new OnTouchListener() {
22 
23             @Override
24             public boolean onTouch(View v, MotionEvent event) {
25                 // TODO Auto-generated method stub
26                 switch (event.getAction()) {
27                 case MotionEvent.ACTION_UP: {break;}
28                 case MotionEvent.ACTION_DOWN: {break;}
29                 case MotionEvent.ACTION_MOVE: {
30                     // 1.getScrollY()滚动条滑动的距离
31                     // 2.getMeasureHeight() 总的长度
32                     // 3.getHeight()一屏的内容高度
33                     
34                     // 顶部状态
35                     if (scrollView.getScrollY() <= 0) {
36                         Log.i("main", "滑动到顶部");
37                     }
38                     // 底部状态
39                     // textview的总高度《=屏幕高度+滚动条的滚动距离
40                     if (scrollView.getChildAt(0).getMeasuredHeight() <= scrollView
41                             .getHeight() + scrollView.getScrollY()) {
42                         Log.i("main", "滑动到底部咯");
43                         //继续添加数据
44                         textView.append(getResources().getString(
45                                 R.string.content));
46                     }
47                     break;
48                 }
49 
50                 }
51                 return false;
52             }
53         });
54 
55     }
56   //控制滚动条滚动的位置
57     @Override
58     public void onClick(View v) {
59         // TODO Auto-generated method stub
60         switch (v.getId()) {
61         // scrollView.scrollTo 以滚动视图起始位置计算
62         // scrollView.scrollBy 相对前一次位置滚动对应的距离
63         case R.id.up: {
64             scrollView.scrollTo(0, -30);
65             break;
66         }
67         case R.id.down: {
68             scrollView.scrollBy(0, 30);
69             break;
70         }
71         }
72     }
73 
74 }



原文地址:https://www.cnblogs.com/my334420/p/6715556.html