[英]Scrolling vertically and horizontally in Android
我有一個RelativeLayout
(參數= MatchParent,MatchParent)作為我的內容視圖。
RelativeLayout
包含一個ScrollView
(params = Wrap_Content,Wrap_Content)。
然后, ScrollView
包含LinearLayout
(無參數,設置垂直方向)。
我向LinearLayout
添加“ myrows”。
每個myrow由另一個LinearLayout
(無參數,水平方向)組成,其中包含一個SpannableString
,該SpannableString
包含等間距/填充數字。
結果是一個垂直可滾動的表,看起來不錯。 問題是,如果我在較小的設備上運行它,則SpannableString
s擴展到屏幕之外。
在較小的屏幕上,我希望文本足夠大以便閱讀,因此我還需要能夠水平滾動才能看到SpannableString
擴展到屏幕之外的部分。 我已經嘗試了幾種解決方案。 一種是將垂直ScrollView
放在水平ScrollView
並捕獲xy等。但是人們提到這很危險。 我不想把弦包起來。 我無法使用保管箱等...來顯示超越值。 它必須是一個平面表,其文本足夠大,可以閱讀,我無法消除任何字符串長度。
我可以將其改為水平ScrollView
並放置一個頁面上/下按鈕,但是它不能像現在那樣平滑。 我可以將ListView
放在水平ScrollView
並且可以在兩個方向上滾動嗎?
還有其他想法嗎? 我可以在底部放置一個滾動條,以水平滾動屏幕,該滾動條僅捕獲您對滾動條本身的手指觸摸嗎?
謝謝!
我終於找到了一個很好的解決方案。 創建具有以下替代的自定義gridView。 我還創建了一個跟隨gridView滾動的滾動標題。
@Override
public boolean onInterceptTouchEvent (MotionEvent ev) {
getMaxLeftScroll();
myLastX = ev.getX();
myLastY = ev.getY();
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(final MotionEvent ev){
final int action = ev.getAction();
final float x;
final float y;
switch (action) {
case MotionEvent.ACTION_MOVE:
// This handles Scrolling only.
x = ev.getX();
y = ev.getY();
final int deltaX = (int) (myLastX - x);
final int deltaY = (int) (myLastY - y);
if(Math.abs(deltaX) > Math.abs(deltaY)) {
if( (iCurrentLeftScroll+deltaX) > 0 &&
iCurrentLeftScroll+deltaX < iMaxLeftScroll) {
scrollBy(deltaX, 0);
//Listener and call the method here to scroll the header
mScrollChangeListener.onGridViewScrolled(deltaX);
iCurrentLeftScroll+=deltaX;
} //Scrolled by some value
// Close to right edge within 10? Smooth Scroll remaining small distance if not already there
else if(deltaX > 0 && (iCurrentLeftScroll<iMaxLeftScroll)) {
if ((iMaxLeftScroll - iCurrentLeftScroll) < 10) {
scrollBy(iMaxLeftScroll-iCurrentLeftScroll, 0);
mScrollChangeListener.onGridViewScrolled(iMaxLeftScroll-iCurrentLeftScroll);
iCurrentLeftScroll = iMaxLeftScroll;
}
}
// Close to left edge within 30? Smooth Scroll remaining small distance if not already there
else if(deltaX < 0 && (iCurrentLeftScroll>0)) {
if ((iCurrentLeftScroll) < 10) {
scrollBy(iCurrentLeftScroll*-1, 0);
mScrollChangeListener.onGridViewScrolled(iCurrentLeftScroll*-1);
iCurrentLeftScroll = 0;
}
}
//left and right are subjective
if(iCurrentLeftScroll == iMaxLeftScroll)
iScrollStatus = SCROLLED_FULL_LEFT;
if(iCurrentLeftScroll == 0)
iScrollStatus = SCROLLED_FULL_RIGHT;
if( (iCurrentLeftScroll > 0) && (iCurrentLeftScroll < iMaxLeftScroll) )
iScrollStatus = 0;
Log.d(TAG," Scroll Status " + String.valueOf(iScrollStatus) );
Log.d(TAG," MaxLeftScroll " + String.valueOf(iMaxLeftScroll) );
Log.d(TAG," Current Left Scroll " + String.valueOf(iCurrentLeftScroll) );
}
myLastX = x;
myLastY = y;
break;
}
return super.onTouchEvent(ev);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.