zoukankan      html  css  js  c++  java
  • [转]ScrollView简单自动滚动问题总结

    http://blog.csdn.net/huangbiao86/article/details/7388632

    今天参考网上的资料写了一个简单的动画,刚开始的时候,确实困难重重:

    1、当我们在Activity里面获得View对象的时候,无论是getMeasuredHeight()还是getHehgit()方法(放在Activity里的onCreate,onStart,onResum),返回值一律为零。

    2、无法使ScrollView的内容从最底部开始向上滑动(一开始ScrollView为空白,但是内容由下向上慢慢上移)

    3、对ScrollView的scrollBy与scrollTo方法区别不是太熟悉;

    在网上查询资料:

    1. 在一个类初始化时,即在构造函数当中是得不到View的实际大小的(这个我测试过,的确)。大家可以试试,getWidth()和getMeasuredWidth()得到的结果都是0,但是可以从onDraw()方法或者dispatchDraw()方法里面获得。可以通过调用invalidate()来执行onDraw()和dispatchDraw()方法。

    2. 这两个方法所得到的结果的单位是像素即pixel

    getWidth(): View在设定好布局后,整个View的宽度

    getMeasuredWidth():对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure参数的值可以知己定义),否则得到的结果和getWidth()得到的结果是一样的。

    这两个方法最主要的区别在于,是否使用了measure()方法,同时measure()使用的位置也很重要。

    getHeight() 和 get MeasuredHeight() 区别同理。

    经过我的测试(不知道有没有别的方法),ScrollView是不能开始就显示在最底层的,只能在最上面添加一个控件,这里我添加了一个TextView空的空间,这样在开始显示的ScrollView的时候,是空的,感觉是内容慢慢开始向上移动

     scrollTo() 是直接指定滚动条的位置, 但是由于这个动作不是单纯关于 ScrollView 而已, 还要根据 ScrollView 里面包含的View 的实际信息. 所以这动作必须在页面加载完成以后才能执行.    在Activity 初始化过程中, 要指定滚动条位置, 必须用下面的代码

    sView.post(new Runnable() {  
        @Override  
        public void run() {  
            sView.scrollTo(sViewX, sViewY);  
        }   
    });  

    滚动代码如下:

    public class MainActivity extends Activity {  
        private final Handler mHandler = new Handler();  
      
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            iniHolder();  
        }  
      
        private void iniHolder() {  
            Holder.scroll = (ScrollView) findViewById(R.id.sv_scroll);  
            Holder.mlayout = (LinearLayout) findViewById(R.id.l_test);  
            Holder.tv_null = (TextView) findViewById(R.id.tv_null);  
            Holder.tv_null.setHeight(getWindowManager().getDefaultDisplay()  
                    .getHeight() - 50);  
        }  
      
        @Override  
        protected void onResume() {  
            super.onResume();  
            System.out.println(Holder.mlayout.getMeasuredHeight() + ":"  
                    + Holder.scroll.getHeight());  
            Holder.scroll.post(ScrollRunnable);  
        }  
      
        private Runnable ScrollRunnable = new Runnable() {  
            @Override  
            public void run() {  
                int off = Holder.mlayout.getMeasuredHeight()  
                        - Holder.scroll.getHeight();// 判断高度,ScrollView的最大高度,就是屏幕的高度  
                if (off > 0) {  
                    Holder.scroll.scrollBy(0, 2);  
                    if (Holder.scroll.getScrollY() == off) {  
                        Thread.currentThread().interrupt();  
                    } else {  
                        mHandler.postDelayed(this, 10);  
                    }  
                }  
            }  
        };  
      
        static class Holder {  
            static ScrollView scroll;  
            static LinearLayout mlayout;  
            static TextView tv_null;  
        }  
    }  
  • 相关阅读:
    牛客小白月赛-鲲
    HDU-1069 Monkey and Banana
    HDU-1159 Common Subsequence
    Python3-提高效率的方法
    Python3-ORM-Sqlalchemy
    redis端口6379的由来
    Linux环境下的network IO
    Yii2-设置和获取、删除Cookies空值分析(有代码)
    PHP中的运算符---位运算符、递增递减运算符、三元运算符、字符串运算符、数组运算符、类型运算符、错误控制运算符
    redis的五种存储类型的具体用法
  • 原文地址:https://www.cnblogs.com/wilma/p/3118544.html
Copyright © 2011-2022 走看看