簡體   English   中英

在Android中垂直和水平滾動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM