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 }



  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/my334420/p/6715556.html
Copyright © 2011-2022 走看看