Vertikales (gedrehtes) Etikett in Android

Ich brauche 2 Möglichkeiten, vertikale Etiketten in Android zu sehen:

  1. Horizontales Etikett um 90 Grad gegen den Uhrzeigersinn (Briefe an der Seite)
  2. Horizontales Etikett mit Briefen untereinander (wie ein Schild)

Muss ich benutzerdefinierte Widgets für beide Fälle entwickeln (ein Fall), kann ich TextView machen, um diese Art und Weise zu rendern, und was wäre ein guter Weg, so etwas zu tun, wenn ich ganz gewohnt sein muss?

  • Wo ist die Warnansicht in Android Studio?
  • Android: RecyclerView in einem ScrollView
  • "Gradle dateien haben sich seit letzter projektsynchronisierung geändert" erscheint immer die meldung
  • Android Studio erkennt physisches Gerät als Null?
  • Konfiguriere IntelliJ IDEA so, dass die Quelle in git erkannt wurde, aber nicht registrierte Vcs-Wurzel erkannt wurde
  • Facebook-Anmeldung fehlschlägt auf einigen Geräten
  • Android Textansicht Umriss Text
  • Beenden Sie den App-Namen in der Titelleiste
  • Android-Bildschirmauflösungen
  • Wie benutzt man ScrollView in Android?
  • Statusleiste Farbe nicht angezeigt - 5.0 Lollipop Android Studio: (AppCompat-v7: r21)
  • Ausfall
  • 7 Solutions collect form web for “Vertikales (gedrehtes) Etikett in Android”

    Hier ist meine elegante und einfache vertikale Textimplementierung, die TextView erweitert. Dies bedeutet, dass alle Standardstile von TextView verwendet werden können, da es TextView erweitert wird.

    public class VerticalTextView extends TextView{ final boolean topDown; public VerticalTextView(Context context, AttributeSet attrs){ super(context, attrs); final int gravity = getGravity(); if(Gravity.isVertical(gravity) && (gravity&Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) { setGravity((gravity&Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP); topDown = false; }else topDown = true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } @Override protected boolean setFrame(int l, int t, int r, int b){ return super.setFrame(l, t, l+(bt), t+(rl)); } @Override public void draw(Canvas canvas){ if(topDown){ canvas.translate(getHeight(), 0); canvas.rotate(90); }else { canvas.translate(0, getWidth()); canvas.rotate(-90); } canvas.clipRect(0, 0, getWidth(), getHeight(), android.graphics.Region.Op.REPLACE); super.draw(canvas); } } 

    Standardmäßig ist der gedrehte Text von oben nach unten. Wenn Sie android: gravity = "bottom" setzen, dann ist es von unten nach oben gezeichnet.

    Technisch, es Narren zugrunde liegenden TextView zu denken, dass es normale Rotation (Swapping Breite / Höhe an wenigen Stellen), während Ziehen es gedreht. Es funktioniert auch bei Verwendung in einem XML-Layout.

    EDIT: Posting eine andere Version, oben hat Probleme mit Animationen. Diese neue Version funktioniert besser, verliert aber einige TextView-Features wie z. B. Festzelt und ähnliche Spezialitäten.

     public class VerticalTextView extends TextView{ final boolean topDown; public VerticalTextView(Context context, AttributeSet attrs){ super(context, attrs); final int gravity = getGravity(); if(Gravity.isVertical(gravity) && (gravity&Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) { setGravity((gravity&Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP); topDown = false; }else topDown = true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } @Override protected void onDraw(Canvas canvas){ TextPaint textPaint = getPaint(); textPaint.setColor(getCurrentTextColor()); textPaint.drawableState = getDrawableState(); canvas.save(); if(topDown){ canvas.translate(getWidth(), 0); canvas.rotate(90); }else { canvas.translate(0, getHeight()); canvas.rotate(-90); } canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop()); getLayout().draw(canvas); canvas.restore(); } } 

    Ich habe das für mein ChartDroid- Projekt implementiert . Erstellen Sie VerticalLabelView.java :

     public class VerticalLabelView extends View { private TextPaint mTextPaint; private String mText; private int mAscent; private Rect text_bounds = new Rect(); final static int DEFAULT_TEXT_SIZE = 15; public VerticalLabelView(Context context) { super(context); initLabelView(); } public VerticalLabelView(Context context, AttributeSet attrs) { super(context, attrs); initLabelView(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.VerticalLabelView); CharSequence s = a.getString(R.styleable.VerticalLabelView_text); if (s != null) setText(s.toString()); setTextColor(a.getColor(R.styleable.VerticalLabelView_textColor, 0xFF000000)); int textSize = a.getDimensionPixelOffset(R.styleable.VerticalLabelView_textSize, 0); if (textSize > 0) setTextSize(textSize); a.recycle(); } private final void initLabelView() { mTextPaint = new TextPaint(); mTextPaint.setAntiAlias(true); mTextPaint.setTextSize(DEFAULT_TEXT_SIZE); mTextPaint.setColor(0xFF000000); mTextPaint.setTextAlign(Align.CENTER); setPadding(3, 3, 3, 3); } public void setText(String text) { mText = text; requestLayout(); invalidate(); } public void setTextSize(int size) { mTextPaint.setTextSize(size); requestLayout(); invalidate(); } public void setTextColor(int color) { mTextPaint.setColor(color); invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { mTextPaint.getTextBounds(mText, 0, mText.length(), text_bounds); setMeasuredDimension( measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int measureWidth(int measureSpec) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { // We were told how big to be result = specSize; } else { // Measure the text result = text_bounds.height() + getPaddingLeft() + getPaddingRight(); if (specMode == MeasureSpec.AT_MOST) { // Respect AT_MOST value if that was what is called for by measureSpec result = Math.min(result, specSize); } } return result; } private int measureHeight(int measureSpec) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); mAscent = (int) mTextPaint.ascent(); if (specMode == MeasureSpec.EXACTLY) { // We were told how big to be result = specSize; } else { // Measure the text result = text_bounds.width() + getPaddingTop() + getPaddingBottom(); if (specMode == MeasureSpec.AT_MOST) { // Respect AT_MOST value if that was what is called for by measureSpec result = Math.min(result, specSize); } } return result; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float text_horizontally_centered_origin_x = getPaddingLeft() + text_bounds.width()/2f; float text_horizontally_centered_origin_y = getPaddingTop() - mAscent; canvas.translate(text_horizontally_centered_origin_y, text_horizontally_centered_origin_x); canvas.rotate(-90); canvas.drawText(mText, 0, 0, mTextPaint); } } 

    Und in attrs.xml :

     <resources> <declare-styleable name="VerticalLabelView"> <attr name="text" format="string" /> <attr name="textColor" format="color" /> <attr name="textSize" format="dimension" /> </declare-styleable> </resources> 

    Ein Weg, dies zu erreichen wäre:

    1. Schreiben Sie Ihre eigene benutzerdefinierte Ansicht und überschreiben onDraw (Canvas). Sie können den Text auf die Leinwand zeichnen und dann die Leinwand drehen.
    2. Gleich wie 1. außer dieser Zeit einen Pfad verwenden und Text mit drawTextOnPath zeichnen (…)
     check = (TextView)findViewById(R.id.check); check.setRotation(-90); 

    Das hat für mich gearbeitet, ganz gut. Wie für die vertikal hinunter Briefe – ich weiß nicht.

    Es gibt einige kleinere Dinge müssen aufgepasst werden.

    Es hängt von der Zeichensatz bei der Wahl der Rotation oder der Weg Wege. Zum Beispiel, wenn der Ziel-Zeichensatz englisch ist und der erwartete Effekt aussieht,

     a b c d 

    Sie können diesen Effekt erhalten, indem Sie jedes Zeichen eins nach dem anderen zeichnen, kein Drehen oder Pfad benötigt.

    Bildbeschreibung hier eingeben

    Sie müssen möglicherweise drehen oder Pfad, um diesen Effekt zu erhalten.

    Der heikle Teil ist, wenn Sie versuchen, Zeichensatz wie Mongolisch zu machen. Die Glyphe in der Schriftart muss um 90 Grad gedreht werden, so drawTextOnPath () wird ein guter Kandidat zu verwenden.

    Versuchte beide VerticalTextView Klassen in der genehmigten Antwort, und sie arbeiteten recht gut.

    Aber egal was ich versuchte, konnte ich diese VerticalTextViews nicht in der Mitte des enthaltenden Layouts positionieren (ein RelativeLayout, das Teil eines für einen RecyclerView aufgeblasenen Elements ist).

    FWIW, nachdem ich mich umgesehen habe, habe ich yoog568's VerticalTextView Klasse auf GitHub gefunden:

    https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java

    Die ich wie gewünscht positionieren konnte.

    Nach der Antwort von Pointer Null konnte ich den Text horizontal durch die Änderung der onDraw Methode auf diese Weise onDraw :

     @Override protected void onDraw(Canvas canvas){ TextPaint textPaint = getPaint(); textPaint.setColor(getCurrentTextColor()); textPaint.drawableState = getDrawableState(); canvas.save(); if(topDown){ canvas.translate(getWidth()/2, 0); canvas.rotate(90); }else{ TextView temp = new TextView(getContext()); temp.setText(this.getText().toString()); temp.setTypeface(this.getTypeface()); temp.measure(0, 0); canvas.rotate(-90); int max = -1 * ((getWidth() - temp.getMeasuredHeight())/2); canvas.translate(canvas.getClipBounds().left, canvas.getClipBounds().top - max); } canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop()); getLayout().draw(canvas); canvas.restore(); } 

    Möglicherweise müssen Sie einen Teil der TextView selectedWidth hinzufügen, um einen mehrzeiligen Text zu zentrieren.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.