zoukankan      html  css  js  c++  java
  • 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 }



  • 相关阅读:
    spring的断言工具类Assert的基本使用
    开发工具推荐
    IDEA 接口调试插件 HTTP Client
    【笔记0-开篇】面试官系统精讲Java源码及大厂真题
    面试题:HashSet、TreeSet 和HashMap 的实现与原理
    Mybatis面试问题集锦
    分组拼接字符串,GROUP_CONCAT
    跨表更新,Mysql Update Join
    【设计模式】UML类图及Java的类之间的关系
    Sql性能优化梳理
  • 原文地址:https://www.cnblogs.com/my334420/p/6715556.html
Copyright © 2011-2022 走看看