忙忙碌碌的一個多月又結束了,連續奮戰到淩晨四點的兩周也成為了過去式….此次上線因為添加了視訊直播和點播功能,是以比較趕,真是分分鐘要猝死的趕腳.不過此次又是上線又是對舊知識的鞏固和對新技術的探究,此次用到的ScrollView比較多,寫一篇文章用以積累.
從谷歌的文檔我們可以得到ScrollView是一個可以滾動的使用者布局容器,它可以讓在手機螢幕上展示不開的情況下滾動展示。ScrollView是一個FrameLayout,是以你應該把一個子控件包含在它的整個内容滾動;這個子控件本身可以是一個複雜的層次結構對象的布局管理器,這個子控件一般是在垂直方向的一個LinearLayout呈現,使用者可以通過滾動的頂級項目的垂直陣列。如果一個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