天天看點

ScrollView 使用小結

忙忙碌碌的一個多月又結束了,連續奮戰到淩晨四點的兩周也成為了過去式….此次上線因為添加了視訊直播和點播功能,是以比較趕,真是分分鐘要猝死的趕腳.不過此次又是上線又是對舊知識的鞏固和對新技術的探究,此次用到的ScrollView比較多,寫一篇文章用以積累.

ScrollView 使用小結

從谷歌的文檔我們可以得到ScrollView是一個可以滾動的使用者布局容器,它可以讓在手機螢幕上展示不開的情況下滾動展示。ScrollView是一個FrameLayout,是以你應該把一個子控件包含在它的整個内容滾動;這個子控件本身可以是一個複雜的層次結構對象的布局管理器,這個子控件一般是在垂直方向的一個LinearLayout呈現,使用者可以通過滾動的頂級項目的垂直陣列。如果一個ScrollView有多個布局就會報出以下的錯誤:

ScrollView 使用小結

當然,也可以通過below和above讓Scrollview在哪兩個控件之間滾動,根據自己的項目實時調整.

xml中常用到的屬性:

android:fadingEdge=”none”

設定拉滾動條時 ,邊框漸變的放向。none(邊框顔色不變),horizontal(水準方向顔色變淡),vertical(垂直方向顔色變淡).

android:overScrollMode=”never”

删除ScrollView拉到盡頭(頂部、底部),然後繼續拉出現的陰影效果,适用于2.3及以上的 否則不用設定.

android:scrollbars=”none”

設定滾動條顯示。none(隐藏),horizontal(水準),vertical(垂直)。見下列代碼示範使用該屬性讓EditText内有滾動條。但是其他容器如LinearLayout設定了但是沒有效果。

ScrollView本身的高度設定為match_parent,其子View的高度也設定為match_parent,自然狀态下該子View的高度并不會占滿ScrollView的高度。 原因是match_parent針對一般布局而言,是子view的高度和parent的高度一緻,但在ScrollView身上,工作機制并非如此,而是ScrollView的高度随着子View的高度變化而變化(子View高度大于ScrollView時)。在子View高度小于ScrollView高度時,必需在xml裡為ScrollView加上Android:fillViewport=”true”,這樣子View小于ScrollView高度時就會占滿父View.

解決方法:

xml裡為ScrollView加上android:fillViewport=“true”

ScrollView 中常用到的方法:

Scrollview禁止滑動:

scrollView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return true;
    }
});
           

可滑動

scrollView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return false;
    }
});
           

滾到到底部:

scrollView.post(new Runnable() {
    @Override
    public void run() {//滑動頂部
        scrollView.fullScroll(ScrollView.FOCUS_UP);
    }
});
           

滾動到頂部:

scrollView.post(new Runnable() {
    @Override
    public void run() {//滑動頂部
        scrollView.fullScroll(ScrollView.FOCUS_UP);
    }
});
           

滾動到某個位置:

scrollView.post(new Runnable() {
     @Override
     public void run() {
         int offset = ;偏移值
         scrollView.smoothScrollTo(, offset);
     }
 });
           

注意:ScrollView 滾動的時候需要post 一個runnable,讓其在消息隊列中執行滾動!

第一,handler.post(runnable);并不是新開線程,隻是讓UI主線程去并發執行run()方法。

第二,之是以放在handler裡,是為了保證View都已經繪制完成。不然,你放在resume()中執行,應該也可以的。

第三,smoothScrollTo類似于scrollTo,但是滾動的時候是平緩的而不是立即滾動到某處。另外,smoothScrollTo()方法可以打斷滑動動畫。

監聽ScrollView滑動到底部,加載資料:

有時候我們想讓在ScrollView滑動到底部的時候去做一些事情,但是scrollview并沒有直接提供這樣的方法,此時我們可以通過簡單的繼承一下ScrollView,為ScrollView滑動到底部設定一下監聽:

public class ScrollBottomScrollView extends ScrollView {
    private OnScrollBottomListener listener;
    private int calCount;

    public interface OnScrollBottomListener {
        void scrollToBottom();
    }

    public void onScrollViewScrollToBottom(OnScrollBottomListener l) {
        listener = l;
    }

    public ScrollBottomScrollView(Context context, AttributeSet attrs)    {
        super(context, attrs);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View view = this.getChildAt();
        if (this.getHeight() + this.getScrollY() == view.getHeight()) {
            calCount++;
            if (calCount == ) {
                if (listener != null) {
                    listener.scrollToBottom();
                }
            }
        } else {
            calCount = ;
        }
    }
}
           

在需要的地方調用如下:

scrollView.onScrollViewScrollToBottom(new ScrollBottomScrollView.OnScrollBottomListener() {
            @Override
            public void scrollToBottom() {
               //請求資料
            }
        });
           

另外如果你的布局中是ScrollView嵌入RecycerView那麼久勢必就會出現滑動沖突的問題,此時我們可以把RecycerView的滑動監聽給禁止,這樣就不會有沖突的問題了.

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this) {//禁止recycleview豎直滑動
            @Override
            public boolean canScrollVertically() {
                return false;
            }
        };
           

大概就用到了這麼多,以後有新的研究還會繼續更新.另外有時間會把horizontalscrollview總結記錄一下,想想都覺得激動.

谷歌官方文檔https://developer.android.com/reference/android/widget/ScrollView.html