2012-01-22 21 views
27

Ho una situazione nella pagina Graph dove LinearLayout dovrebbe visualizzare il TextView ruotato di 90 gradi.Come ruotare TextView 90 gradi e visualizzare

+0

http://stackoverflow.com/questions/1258275/vertical-rotated-label-in-android verificato questo e risolto il mio problema – sakshi

+0

È possibile farlo in XML a partire da API 11 (Android 3.0). http://stackoverflow.com/questions/3774770/sideways-view-with-xml-android – chobok

risposta

35

Il modo più veloce e più conveniente è quella di Rotate da Animation

uso ruotare l'animazione sul tuo TextView regolare in questo modo.

rotateAnimation.xml:

<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
      android:fromDegrees="0" 
      android:toDegrees="-90" 
      android:pivotX="50%" 
      android:duration="0" 
      android:fillAfter="true" /> 

del codice Java:

TextView text = (TextView)findViewById(R.id.txtview);  
    text.setText("rotated text here"); 

    RotateAnimation rotate= (RotateAnimation)AnimationUtils.loadAnimation(this,R.anim.rotateAnimation); 
    text.setAnimation(rotate); 
+0

Questo è buono ma non mi ha aiutato molto a controllare questo http://stackoverflow.com/questions/1258275/vertical-rotated-label -in-android mi ha aiutato molto nella mia cs – sakshi

12

in Android per qualsiasi nuova vista non c'è un metodo chiamato setRotation(float) è possibile utilizzarlo

textview.setRotation(float); 

ma per favore si noti che questo metodo è aggiunto in livello API 11

quindi se si vuole sostenere che è possibile utilizzare questo

if (Build.VERSION.SDK_INT < 11) { 

    RotateAnimation animation = new RotateAnimation(oldAngel, newAngel); 
    animation.setDuration(100); 
    animation.setFillAfter(true); 
    watermarkText.startAnimation(animation); 
} else { 

    watermarkText.setRotation(progress); 
} 
+1

Un po 'più di spiegazione sarebbe carino. –

+0

Ho modificato la risposta per ulteriori informazioni –

39

Prova questa ::

<TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:rotation="-95" 
       android:text="2" 
       /> 
+1

FYI. Il problema è necessario in Build.VERSION.SDK_INT> 11 – MilapTank

+2

in cui la larghezza non cambia. Qualche idea su come superare questo? – abh22ishek

3

[risolto] Dopo un anno di questo essere sulla mia lista, senza alcuna adeguata risposte sui forum ho finalmente risolto questo!

Il trucco qui è quello di codificare in modo rigido layout_width e layout_height di TextView più grandi di quanto il testo sia mai stato, ad es. 100dp x 100dp.

Quindi posizionare il TextView in un FrameLayout e ruotare tagliando per il FrameLayoutandroid:clipChildren="false" e clip per imbottitura off per il TextView android:clipToPadding="false":

TextView with hard-coded height and width

Il TextView verrà ora fluttuare FrameLayout. Usa le impostazioni di gravità TextView per spostare il testo all'interno del suo limite.

Quindi utilizzare le impostazioni layout_gravity per spostare il riquadro all'interno del genitore FrameLayout all'interno di esso:

Ecco un esempio di destra e testo allineato in basso ruotato di -90 gradi:

Solution example

[AGGIORNAMENTO] Esempio di XML per un testo a riquadri di riquadri:

 <FrameLayout 
      android:layout_width="@dimen/item_col_width_val" 
      android:layout_height="match_parent" 
      android:layout_weight="0.25" 
      android:padding="@dimen/table_header_margin"> 
      <TextView 
       android:layout_width="@dimen/table_title_row_height" 
       android:layout_height="@dimen/table_title_row_height" 
       android:layout_gravity="bottom|end" 
       android:gravity="bottom" 
       android:rotation="-90" 
       android:text="@string/asm_col_title_in_stock" 
       android:textColor="@color/colorGood" /> 
     </FrameLayout> 
+0

Si prega di condividere il codice xml in modo che possiamo capire più rapidamente la tua spiegazione della risposta. – ProgDevCode

+0

@ProgDevCode ha aggiunto un codice XML come richiesto. – user7653815

4
<TextView 
      android:id="@+id/rotated_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:alpha=".3" 
      android:background="@drawable/grey_capsule" 
      android:gravity="center" 
      android:textColor="@android:color/white" 
      android:textSize="14sp" 
      android:padding="4dp" 
      android:layout_marginLeft="-50dp" 
      android:rotation="-90" 
      android:text="Andrew Coder" /> 
+0

Grazie ........... –

0

Se non è necessaria l'animazione, è possibile provare una soluzione fornita in un modello simile question. Un testo verrà scritto dal basso verso l'alto.

Supporta tutte le funzionalità TextView base:

  • dimensione del testo
  • colore del testo
  • carattere del testo
  • imbottitura testo
  • utilizzo tramite XML

punto principale è quello di override onDraw() e onMeasure() metodi basati su parametri di testo:

@Override 
    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 

     if (!this._text.isEmpty()) 
     { 
      float textHorizontallyCenteredOriginX = this._measuredHeight/2f; 
      float textHorizontallyCenteredOriginY = this._ascent; 

      canvas.translate(textHorizontallyCenteredOriginY, textHorizontallyCenteredOriginX); 
      canvas.rotate(-90); 
      canvas.drawText(this._text, 0, 0, this._textPaint); 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     try 
     { 
      this._textPaint.getTextBounds(this._text, 0, this._text.length(), this._textBounds); 

      this._tempView = new TextView(getContext()); 
      this._tempView.setPadding(this._leftPadding, this._topPadding, this._rightPadding, this._bottomPadding); 
      this._tempView.setText(this._text); 
      this._tempView.setTextSize(TypedValue.COMPLEX_UNIT_PX, this._textSize); 
      this._tempView.setTypeface(this._typeface); 

      this._tempView.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

      this._measuredWidth = this._tempView.getMeasuredHeight(); 
      this._measuredHeight = this._tempView.getMeasuredWidth(); 

      this._ascent = this._textBounds.height()/2 + this._measuredWidth/2; 

      setMeasuredDimension(this._measuredWidth, this._measuredHeight); 
     } 
     catch (Exception e) 
     { 
      setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); 
      Log.e(LOG_TAG, Log.getStackTraceString(e)); 
     } 
    } 

prega, dare un'occhiata a Vertical (rotated) label in Android per vedere il codice sorgente completo.

Problemi correlati