Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【Android】Scrollview返回頂部,快速返回頂部的功能實現,詳解代碼。

【Android】Scrollview返回頂部,快速返回頂部的功能實現,詳解代碼。

編輯:關於Android編程

首先給大家看一下我們今天這個最終實現的效果圖:
這裡寫圖片描述
我這裡只是單純的實現了scrollview返回頂部的功能。具體效果大家可以適當地美化
在實際項目中可以換圖標,去掉右側滾動條等。具體ui美化不做解釋。
好了,首先我們是當不在頂部的時候,返回頂部按鈕就會出現,而到頂部之後就會隱藏此按鈕,所以我們這裡就要算scrollview的滑動偏移量,當然,有這個返回頂部按鈕,而且一直顯示在底部,所以當然用相對布局了。下面先給大家看一下xml布局源碼:




    

        

            

            

            

            

            

            

            
        
    

好了,然後就是我們的java實現代碼了。下面是源代碼,不懂得朋友可以留言,或者更好的建議,相互交流。對了,特別說一下,scrollview在XML布局中只能有一個子view,不然就會報錯。所以這一點我在java代碼中也特意說明了一下。java實現代碼如下:

package davidtotopscrollview.qq986945193.davidtotopscrollview;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ScrollView;

/**
 * @author :程序員小冰
 * @新浪微博 :http://weibo.com/mcxiaobing
 * @GitHub: https://github.com/QQ986945193
 * @CSDN博客: http://blog.csdn.net/qq_21376985
 * @碼雲OsChina :http://git.oschina.net/MCXIAOBING
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ScrollView scrollView;// scrollView數據列表
    private Button toTopBtn;// 返回頂部的按鈕


    private int scrollY = 0;// 標記上次滑動位置

    private View contentView;

    private final String TAG = "qq986945193";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     * 初始化視圖
     */
    private void initView() {
        scrollView = (ScrollView) findViewById(R.id.my_scrollView);
        if (contentView == null) {
            contentView = scrollView.getChildAt(0);
        }

        toTopBtn = (Button) findViewById(R.id.top_btn);
        toTopBtn.setOnClickListener(this);

        //http://blog.csdn.net/qq_21376985
        /******************** 監聽ScrollView滑動停止 *****************************/
        scrollView.setOnTouchListener(new View.OnTouchListener() {
            private int lastY = 0;
            private int touchEventId = -9983761;
            Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    View scroller = (View) msg.obj;
                    if (msg.what == touchEventId) {
                        if (lastY == scroller.getScrollY()) {
                            handleStop(scroller);
                        } else {
                            handler.sendMessageDelayed(handler.obtainMessage(
                                    touchEventId, scroller), 5);
                            lastY = scroller.getScrollY();
                        }
                    }
                }
            };

            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    handler.sendMessageDelayed(
                            handler.obtainMessage(touchEventId, v), 5);
                }
                return false;
            }

            /**
             * ScrollView 停止
             *
             * @param view
             */
            private void handleStop(Object view) {

                Log.i(TAG, "handleStop");
                ScrollView scroller = (ScrollView) view;
                scrollY = scroller.getScrollY();

                doOnBorderListener();
            }
        });
        /***********************************************************/

    }

    /**
     * ScrollView 的頂部,底部判斷:
     * http://blog.csdn.net/qq_21376985
     * 

* 其中getChildAt表示得到ScrollView的child View, 因為ScrollView只允許一個child * view,所以contentView.getMeasuredHeight()表示得到子View的高度, * getScrollY()表示得到y軸的滾動距離,getHeight()為scrollView的高度。 * 當getScrollY()達到最大時加上scrollView的高度就的就等於它內容的高度了啊~ * * @param */ private void doOnBorderListener() { // 底部判斷 if (contentView != null && contentView.getMeasuredHeight() <= scrollView.getScrollY() + scrollView.getHeight()) { toTopBtn.setVisibility(View.VISIBLE); Log.i(TAG, "bottom"); } // 頂部判斷 else if (scrollView.getScrollY() == 0) { Log.i(TAG, "top"); } else if (scrollView.getScrollY() > 30) { toTopBtn.setVisibility(View.VISIBLE); Log.i(TAG, "test"); } } /** * 下面我們看一下這個函數: scrollView.fullScroll(ScrollView.FOCUS_DOWN);滾動到底部 * scrollView.fullScroll(ScrollView.FOCUS_UP);滾動到頂部 *

*

* 需要注意的是,該方法不能直接被調用 因為Android很多函數都是基於消息隊列來同步,所以需要一部操作, * addView完之後,不等於馬上就會顯示,而是在隊列中等待處理,雖然很快, 但是如果立即調用fullScroll, * view可能還沒有顯示出來,所以會失敗 應該通過handler在新線程中更新 *

* http://blog.csdn.net/qq_21376985 * http://weibo.com/mcxiaobing */ @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.top_btn: scrollView.post(new Runnable() { @Override public void run() { // scrollView.fullScroll(ScrollView.FOCUS_DOWN);滾動到底部 // scrollView.fullScroll(ScrollView.FOCUS_UP);滾動到頂部 // // 需要注意的是,該方法不能直接被調用 // 因為Android很多函數都是基於消息隊列來同步,所以需要一部操作, // addView完之後,不等於馬上就會顯示,而是在隊列中等待處理,雖然很快,但是如果立即調用fullScroll, view可能還沒有顯示出來,所以會失敗 // 應該通過handler在新線程中更新 scrollView.fullScroll(ScrollView.FOCUS_UP); } }); toTopBtn.setVisibility(View.GONE); break; } } }

好了,教程到此結束。如果此文章幫到了你,歡迎點贊。
源代碼需要的可以去
(AndroidStudio版)github下載地址:
https://github.com/QQ986945193/DavidToTopScrollView

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved