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?
risposta
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.
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
Grande! Funziona perfettamente, grazie! – Tom
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.
Per i temi olo che utilizzano
È ancora più semplice. Puoi semplicemente chiamare il seguente metodo e quindi è ruotato e funziona esattamente come volevi.
progressBar.setRotation(180);
Un esempio:
grazie per la risposta –
dovrebbe essere la migliore risposta finora –
incidente mia app ... – Hamidreza
Cos sono pigro ho solo aggiungere queste due righe al seekbar
xml:
android:layoutDirection="rtl"
android:mirrorForRtl="true"
aspetti negativi a questo?
È 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"/>
Questa dovrebbe essere la migliore risposta –
<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" />
Che lingua? Quale piattaforma? Quale API? – EboMike
Perché hai bisogno di una barra di avanzamento RTL? Tutte le barre di avanzamento che ho visto vanno da sinistra a destra. –
Possiamo solo rispondere a domande pseudocodice con pseudocodice ... altrimenti si prega di specificare almeno cosa chiede il commento di EboMike. – BoltClock