2010-10-07 23 views
13

Qualcuno sa come rendere una vista invertita, ho un ProgressBar orizzontale e lo voglio da destra a sinistra invece che da sinistra a destraProgressBar da destra a sinistra?

+1

Che lingua? Quale piattaforma? Quale API? – EboMike

+0

Perché hai bisogno di una barra di avanzamento RTL? Tutte le barre di avanzamento che ho visto vanno da sinistra a destra. –

+0

Possiamo solo rispondere a domande pseudocodice con pseudocodice ... altrimenti si prega di specificare almeno cosa chiede il commento di EboMike. – BoltClock

risposta

14

Creare una sottoclasse della normale barra di avanzamento e implementare il metodo onDraw per ruotare la tela prima di disegnarla:

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.save(); 
    canvas.rotate(180,<CenterX>,<CenterY>); 
    super.onDraw(canvas); 
    canvas.restore(); 
} 

Questo dovrebbe fare il trucco.

14
public class inverseSeekBar extends ProgressBar { 

public inverseSeekBar(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
} 

public inverseSeekBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 

public inverseSeekBar(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

@Override 
protected synchronized void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    canvas.save(); 

     //now we change the matrix 
     //We need to rotate around the center of our text 
     //Otherwise it rotates around the origin, and that's bad. 
     float py = this.getHeight()/2.0f; 
     float px = this.getWidth()/2.0f; 
     canvas.rotate(180, px, py); 

     //draw the text with the matrix applied. 
     super.onDraw(canvas); 

     //restore the old matrix. 
     canvas.restore(); 
}} 
    <com.hlidskialf.android.widget.inverseSeekBar 

     style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="200dip" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:progress="50" 
    android:secondaryProgress="75" 

/> 

mypackage: com.test.testProgressBar

+0

Grande! Funziona perfettamente, grazie! – Tom

8

Non è necessario ruotare l'intero View.

Basta usare a single xml attribute nella vostra my_progress_drawable.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@android:id/background" 
     android:drawable="@drawable/my_background"/> 
    <item android:id="@android:id/progress"> 
     <clip 
      android:drawable="@drawable/my_right_to_left_progress" 
      android:gravity="right" /> <!-- Clip the image from the RIGHT --> 
    </item> 

</layer-list> 

The documentation ci dice che gravity="right" fa questo:

inserire l'oggetto sul lato destro del suo contenitore, non cambiando la sua dimensione. Quando clipOrientation è "orizzontale", il ritaglio si verifica sul lato sinistro del drawable.

Non sovrascrivere onDraw(). Questa implementazione è più stabile tra le diverse versioni di Android.

Sfortunatamente, è impossibile impostare la gravità di un ClipDrawable a livello di codice senza richiamare il suo constructor.

+0

Per i temi olo che utilizzano piuttosto che , scaleGravity può essere utilizzato invece – FunkTheMonk

54

È ancora più semplice. Puoi semplicemente chiamare il seguente metodo e quindi è ruotato e funziona esattamente come volevi.

progressBar.setRotation(180); 

Un esempio: a normal progressbar and a RTL progressbar

+0

grazie per la risposta –

+0

dovrebbe essere la migliore risposta finora –

+1

incidente mia app ... – Hamidreza

1

Cos sono pigro ho solo aggiungere queste due righe al seekbar xml:

android:layoutDirection="rtl" 
android:mirrorForRtl="true" 

aspetti negativi a questo?

8

È possibile capovolgere una vista in XML utilizzando scaleX o scaleY attributi

<ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleX="-1"/> 
+1

Questa dovrebbe essere la migliore risposta –

1
<ProgressBar 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:layout_margin="8dp" 
    android:layoutDirection="rtl" 
    android:progress="80" /> 
Problemi correlati