[Android] ScrollView滾動到底部和頂部的檢測

來源:互聯網
上載者:User

1. 源起

 


    很多分頁載入的組件都是繼承自ScrollView,分頁要檢查是否滾動到底部,下拉重新整理需要檢測是否滾動到頂部。

 


2. 代碼

 


 

<SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context=".MainActivity" >      <ScrollView         android:id="@+id/scroll_view"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:scrollbars="vertical" >          <LinearLayout             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:background="@android:color/darker_gray"             android:orientation="vertical" >              <TextView                 android:layout_width="wrap_content"                 android:layout_height="2000dip"                 android:text="text" />         </LinearLayout>     </ScrollView>  </RelativeLayout></SPAN> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" >    <ScrollView        android:id="@+id/scroll_view"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:scrollbars="vertical" >        <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:background="@android:color/darker_gray"            android:orientation="vertical" >            <TextView                android:layout_width="wrap_content"                android:layout_height="2000dip"                android:text="text" />        </LinearLayout>    </ScrollView></RelativeLayout>[java] view plaincopyprint?<SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px">public class MainActivity extends Activity {      @Override     protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     final ScrollView view = (ScrollView) findViewById(R.id.scroll_view);     view.setOnTouchListener(new OnTouchListener() {         @Override         public boolean onTouch(View v, MotionEvent event) {             switch (event.getAction()) {             case MotionEvent.ACTION_DOWN:                 break;             case MotionEvent.ACTION_MOVE:                 if (v.getScrollY() <= 0) {                     Log.d("scroll view", "top");                 } else if (view.getChildAt(0).getMeasuredHeight() <= v.getHeight() + v.getScrollY()) {                     Log.d("scroll view", "bottom");                     Log.d("scroll view", "view.getMeasuredHeight() = " + view.getMeasuredHeight()                         + ", v.getHeight() = " + v.getHeight()                         + ", v.getScrollY() = " + v.getScrollY()                         + ", view.getChildAt(0).getMeasuredHeight() = " + view.getChildAt(0).getMeasuredHeight());                 }                 break;             default:                 break;             }             return false;     } });     } }</SPAN> public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    final ScrollView view = (ScrollView) findViewById(R.id.scroll_view);    view.setOnTouchListener(new OnTouchListener() {        @Override        public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                break;            case MotionEvent.ACTION_MOVE:                if (v.getScrollY() <= 0) {                    Log.d("scroll view", "top");                } else if (view.getChildAt(0).getMeasuredHeight() <= v.getHeight() + v.getScrollY()) {                    Log.d("scroll view", "bottom");                    Log.d("scroll view", "view.getMeasuredHeight() = " + view.getMeasuredHeight()                        + ", v.getHeight() = " + v.getHeight()                        + ", v.getScrollY() = " + v.getScrollY()                        + ", view.getChildAt(0).getMeasuredHeight() = " + view.getChildAt(0).getMeasuredHeight());                }                break;            default:                break;            }            return false; } });    }}


3. 說明


    檢測滾動的時機有很多,這裡是在ScrollView外面檢測,使用onTouch的MotionEvent.ACTION_MOVE。如果是繼承ScrollView,可以在其他回調的時候檢測。

    v.getScrollY()表示scrollview的上面滾出去的長度。v.getHeight()表示scrollview本身看上去的高度。view.getChildAt(0).getMeasuredHeight()是內容的高度。這裡不能用view.getMeasureHeight()。

    view.getMeasuredHeight() = 1038

    v.getHeight() = 1038

    v.getScrollY() = 2962

    view.getChildAt(0).getMeasuredHeight() = 4000

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.