2014-04-04 22 views
7

Ich mache auto-horizontal scrollen. Also ich habe 15 Gegenstände. Jetzt möchte ich auf 12 Artikel zugreifen, so dass mein Index 11 ist. Aber ich kann es nicht automatisch scrollen, wenn ein Index auftritt.Automatisch zu HorizontalScrollView scrollen

horizontalScrollView.scrollTo(12, 0); 

@Override 
public void onPageSelected(int page) { 
    for(int i = 0; i < holeTitle.length; i++) { 
     if(i == page) { 
      title[i].setTextColor(0xffffffff); 
horizontalScrollView.scrollTo(12, 0); 

     } 
     else { 
      title[i].setTextColor(0xffe0e0e0); 

     } 
    } 

} 

bitte Experte einen Blick zu werfen.

+0

blättern möchten, können Sie uns bitte genau sagen, was falsch läuft, wenn Sie dies versuchen? –

+0

meine zwölften Artikel sollten Autoscroll für sichtbar sein. Derzeit ist es ausblenden, ich muss es manuell scrollen. –

Antwort

15

DmRomantsov's answer ist der richtige Weg, um zum 12. Knopf zu blättern. Die Methoden getLeft() und getRight() geben jedoch 0 zurück, da das Layout noch nicht auf dem Bildschirm angezeigt wird. Es ist zu früh, um die Breite des übergeordneten und untergeordneten Layouts zu berechnen. Um dies zu erreichen, müssen Sie innerhalb von onWindowFocusChanged automatisch scrollen.

@Override 
public void onWindowFocusChanged(boolean hasFocus){ 
    super.onWindowFocusChanged(hasFocus); 
    if(hasFocus){ 
     // do smoothScrollTo(...); 
    } 
} 

jedoch in einem Fragment, diese Methode wird oben nicht funktionieren. Ich habe es nur geschrieben, um einen Hinweis zu geben, um das Konzept zu verstehen. Um das gleiche Verhalten in Fragment zu haben, müssen Sie nur eine Runnable machen, die die Zeit zu Ihrer UI anzeigt. Dann tun dies mit einem LinearLayout zu horizontal orientierten:

// Init variables 
HorizontalScrollView mHS; 
LinearLayout mLL; 

// onCreateView method 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.layout_container, container, false); 

    // Find your views 
    mHS = (HorizontalScrollView)view.findViewById(R.id.hscrollview); 
    mLL = (LinearLayout)view.findViewById(R.id.hscrollview_container); 

    // Do a Runnable on the inflated view 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      Log.v("","Left position of 12th child = "+mLL.getChildAt(11).getLeft()); 
      mHS.smoothScrollTo(mLL.getChildAt(11).getLeft(), 0); 
     } 
    }); 
    return view; 
} 

Mittel HorizontalScrollView:

Ihre Frage war, bis Ihr 12. Kind Autoscroll. Allerdings, in den Kommentaren unten, fragen Sie mich, um automatisch in der Mitte der HorizontalScrollView zu scrollen, nehme ich auf jedem Gerät an. Sie müssen die Breite des Bildschirms, die Gesamtbreite des Containers berechnen und wie viele Kinder innerhalb der Gerätebreite angezeigt werden. Hier ist eine einfache Code:

// Auto scroll to the middle (regardless of the width screen) 
view.post(new Runnable() { 
    @Override 
    public void run() { 
     // Width of the screen 
     DisplayMetrics metrics = getActivity().getResources() 
           .getDisplayMetrics(); 
     int widthScreen = metrics.widthPixels; 
     Log.v("","Width screen total = " + widthScreen); 

     // Width of the container (LinearLayout) 
     int widthContainer = mLL.getWidth(); 
     Log.v("","Width container total = " + widthContainer); 

     // Width of one child (Button) 
     int widthChild = mLL.getChildAt(0).getWidth(); 
     Log.v("","Width child = " + widthChild); 

     // Nb children in screen  
     int nbChildInScreen = widthScreen/widthChild; 
     Log.v("","Width screen total/Width child = " + nbChildInScreen); 

     // Width total of the space outside the screen/2 (= left position) 
     int positionLeftWidth = (widthContainer 
           - (widthChild * nbChildInScreen))/2; 
     Log.v("","Position left to the middle = " + positionLeftWidth); 

     // Auto scroll to the middle 
     mHS.smoothScrollTo(positionLeftWidth, 0); 

    } 
}); 

/** 
    * Your value might be resumed by: 
    * 
    * int positionLeftWidth = 
    *  (mLL.getWidth() - (mLL.getChildAt(0).getWidth() * 
    *  (metrics.widthPixels/mLL.getChildAt(0).getWidth())))/2; 
    * 
**/ 

Mittel HorizontalScrollView mit ausgewähltem Wert:

Ich habe ein bisschen die reale Anforderung falsch verstehen. Eigentlich wollten Sie bis zu einer ausgewählten untergeordneten Ansicht automatisch blättern und diese Ansicht in der Mitte des Bildschirms anzeigen.
Dann änderte ich die letzte intpositionLeftWidth die nun an ihre Mutter die linke Position der gewählten Ansicht relativen bezieht sie, die Anzahl von Kindern in einem Bildschirm enthalten und die halbe Breite der gewählten Ansicht.So ist der Code das gleiche wie oben, mit der Ausnahme positionLeftWidth:

// For example the chosen value is 7 

// 7th Child position left  
int positionChildAt = mLL.getChildAt(6).getLeft(); 

// Width total of the auto-scroll (positionLeftWidth) 
int positionLeftWidth = positionChildAt - // position 7th child from left less 
       ((nbChildInScreen // (how many child contained in screen 
        * widthChild)/2) // multiplied by their width) divide by 2 
       + (widthChild/2); // plus (the child view divide by 2) 

// Auto-scroll to the 7th child 
mHS.smoothScrollTo(positionLeftWidth, 0); 

Dann was auch immer der Wert in getChildAt() Verfahren, und was auch immer die Breite Bildschirm, werden Sie immer die gewählte haben (in Ihrem Fall) Taste in der Mitte des Bildschirms.

+0

es funktioniert für mich. Es ist Bildlaufansicht linke Seite Aber ich versuche für die Anzeige in ** center ** –

+0

@RahulRawat was genau meinst du mit * "in der Mitte" * Möchten Sie automatisch in der Mitte der horizontalscrollview scrollen? – Fllo

+0

ja, ich möchte automatisch -scroll in der Mitte der horizontalscrollview –

2

Versuchen horizontalScrollView.smoothScrollBy(12, 0);

+0

funktioniert nicht –

+0

@RahulRawat Ich bearbeite meine Antwort. Versuchen. –

+0

sry funktioniert immer noch nicht –

3

Versuchen

horizontalScrollView.smoothScrollTo(horizontalScrollView.getChildAt(11).getRight(),0); 

erste patameter - X-Koord, zweite - Y.
Offset:

public final void smoothScrollBy (int dx, int dy) 

Absolut:

public final void smoothScrollTo (int x, int y) 
+0

bekommen null Zeiger Ausnahme. Mein Kind ist eines, das Linearlayout ist. und dieses Layout enthält alle 15 Elemente –

+0

gibt mir null Zeiger wieder :( –

+0

ja, das ist nützlich, aber ich bekomme 0 immer für getLeft(). Ich benutze Fragment. –

0

Versuchen Sie, dies ist Arbeitscode. Position wird sein, wo Sie

final HorizontalScrollView mHorizontalScrollView = (HorizontalScrollView) .findViewById(R.id.horizontalScrollView); 
     mHorizontalScrollView.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mHorizontalScrollView.scrollTo(position, 0); 
       mHorizontalScrollView.smoothScrollBy(1200, 0); 
      } 
     },100); 
Verwandte Themen