Android'de dikey (döndürülmüş) etiket


110

Android'de dikey etiketi göstermenin 2 yoluna ihtiyacım var:

  1. Yatay etiket saat yönünün tersine 90 derece döndürüldü (yandaki harfler)
  2. Üst üste harflerin bulunduğu yatay etiket (mağaza işareti gibi)

Her iki durum için de özel widget'lar geliştirmem gerekiyor mu (tek durum), TextView'i bu şekilde oluşturabilir miyim ve tamamen özelliğe gitmem gerekirse böyle bir şeyi yapmanın iyi bir yolu nedir?


API 11'den (Android 3.0) itibaren bunu XML'de yapmak mümkündür. stackoverflow.com/questions/3774770/…
chobok

Yanıtlar:


239

İşte benim zarif ve basit dikey metin uygulamam, TextView'i genişletiyor. Bu, genişletilmiş TextView olduğundan tüm standart TextView stillerinin kullanılabileceği anlamına gelir.

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+(b-t), t+(r-l));
   }

   @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);
   }
}

Varsayılan olarak, döndürülmüş metin yukarıdan aşağıya doğrudur. Android: gravity = "bottom" olarak ayarlarsanız, aşağıdan yukarıya doğru çizilir.

Teknik olarak, TextView'ı döndürürken çizerken normal dönüş olduğunu düşünmek (birkaç yerde genişlik / yükseklik değiş tokuşu) temelde yatan TextView'ı kandırır. Bir xml düzeninde kullanıldığında da iyi çalışır.

DÜZENLEME: başka bir sürüm yayınlamak, yukarıda animasyonlarla ilgili sorunlar var. Bu yeni sürüm daha iyi çalışır, ancak seçim çerçevesi ve benzer özellikler gibi bazı TextView özelliklerini kaybeder.

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();
  }
}

Kotlin sürümünü DÜZENLE :

import android.content.Context
import android.graphics.Canvas
import android.text.BoringLayout
import android.text.Layout
import android.text.TextUtils.TruncateAt
import android.util.AttributeSet
import android.view.Gravity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.graphics.withSave

class VerticalTextView(context: Context, attrs: AttributeSet) : AppCompatTextView(context, attrs) {
    private val topDown = gravity.let { g ->
        !(Gravity.isVertical(g) && g.and(Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM)
    }
    private val metrics = BoringLayout.Metrics()
    private var padLeft = 0
    private var padTop = 0

    private var layout1: Layout? = null

    override fun setText(text: CharSequence, type: BufferType) {
        super.setText(text, type)
        layout1 = null
    }

    private fun makeLayout(): Layout {
        if (layout1 == null) {
            metrics.width = height
            paint.color = currentTextColor
            paint.drawableState = drawableState
            layout1 = BoringLayout.make(text, paint, metrics.width, Layout.Alignment.ALIGN_NORMAL, 2f, 0f, metrics, false, TruncateAt.END, height - compoundPaddingLeft - compoundPaddingRight)
            padLeft = compoundPaddingLeft
            padTop = extendedPaddingTop
        }
        return layout1!!
    }

    override fun onDraw(c: Canvas) {
        //      c.drawColor(0xffffff80); // TEST
        if (layout == null)
            return
        c.withSave {
            if (topDown) {
                val fm = paint.fontMetrics
                translate(textSize - (fm.bottom + fm.descent), 0f)
                rotate(90f)
            } else {
                translate(textSize, height.toFloat())
                rotate(-90f)
            }
            translate(padLeft.toFloat(), padTop.toFloat())
            makeLayout().draw(this)
        }
    }
}

2
Çözümünüz içindeki bağlantıları devre dışı bırakır TextView. Aslında bağlantıların altı çizilidir, ancak tıklandığında yanıt vermez.
Gurnetko

5
bunun çok satırlı ve kaydırma çubuklarıyla ilgili sorunları var.
Cynichniy Bandera

1
Temel sorum için özür dilerim, Bir TextView (XML dosyasında) aldıysam ve onu döndürmek istersem, VerticalTextView sınıfını nasıl çağırmalıyım?
blackst0ne

2
<TextView> etiketleri yerine @ blackst0ne, özel bir görünüm etiketi kullanın: <com.YOUR_PACKAGE_NAME.VerticalTextView>
Daiwik Daarun

1
harika çalışıyor, benim durumumda stil özniteliğimi çalışır hale getirmek için TextView yerine android.support.v7.widget.AppCompatTextView'ı genişletmek zorunda kaldım
Louis

32

Bunu ChartDroid projem için uyguladım . Oluştur 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);
    }
}

Ve içinde 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>

Çok kullanışlı. İşte projenizin ana sürümüne bir bağlantı code.google.com/p/chartdroid/source/browse//trunk/core/…
rds

Yararlı değil, metin tam olarak gösterilmiyor .. sondan ve baştan kesilmiş.
Siddarth G

Yukarıdaki 28 android sürümünde de çalıştı
Ajeet Choudhary

Sürümünüz projem için en iyi seçenek ama setTextColor çalışmıyor, ayrıca bir stil uygulamak istiyorum (background ve fontFamily) bunu yapmak mümkün mü?
Pablo R.

9

Bunlara ulaşmanın bir yolu şudur:

  1. Kendi özel görünümünüzü yazın ve onDraw (Canvas) üzerine yazın. Metni tuval üzerine çizebilir ve ardından tuvali döndürebilirsiniz.
  2. 1. ile aynı, ancak bu sefer bir Yol kullanın ve drawTextOnPath (...) kullanarak metin çizin.

Bu rotaya gitmeden önce (TextView için onDraw yöntemine baktım - bu çok büyük) TextView ile genişletme Button arasındaki tüm farkın dahili bir stil kimliği olduğunu fark ettim (com.android.internal.R.attr.buttonStyle) Mümkün olabilir mi özel bir stil tanımlamak ve TextView'i Button'a benzer şekilde genişletmek için? Metni dikey düzende düzenlemek muhtemelen mümkün olmadığından cevabın hayır olacağını tahmin ediyorum
Bostone

Bu yaklaşım gerçekten işe yarıyor mu? Başaramadım
nategood

1
2. drawTextOnPath (), 1'de olduğu gibi metni döndürülmüş gibi çizer. Harfleri birbirinin altına yazmak için, \nher karakterden sonra kullanın veya sabit genişlikte bir yazı tipiniz varsa, TextView genişliğini yalnızca bir karaktere sığacak şekilde sınırlayın.
2013,

8

Onaylanan yanıtta her iki VerticalTextView sınıfını da denedim ve oldukça iyi çalıştılar.

Ama ne denersem deneyeyim, bu VerticalTextViews'ı içeren düzenin (RecyclerView için şişirilmiş bir öğenin parçası olan bir RelativeLayout) ortasına yerleştiremedim.

FWIW, etrafa baktıktan sonra yoog568'in VerticalTextView sınıfını GitHub'da buldum:

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

istediğim gibi konumlandırabildim. Ayrıca projenize aşağıdaki öznitelik tanımlarını da eklemeniz gerekir:

https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml


1
Bu uygulamayı gerçekten çok kolay buldum!
Hashim Akhtar

4
check = (TextView)findViewById(R.id.check);
check.setRotation(-90);

Bu benim için çalıştı, gayet iyi. Dikey olarak aşağı inen harflere gelince - bilmiyorum.


7
ancak alanı yatay olarak kaplar ve dikey olarak döndürür
Prabs

3

Dikkat edilmesi gereken bazı küçük şeyler var.

Döndürmeyi veya yol yollarını seçerken karakter setine bağlıdır. örneğin, hedef karakter seti İngilizce gibiyse ve beklenen efekt şöyle görünüyorsa,

a
b
c
d

bu efekti, her karakteri tek tek çizerek elde edebilirsiniz, döndürme veya yol gerekmez.

görüntü açıklamasını buraya girin

bu efekti elde etmek için döndürmeye veya yola ihtiyacınız olabilir.

işin zor kısmı, Moğolca gibi karakter kümesini oluşturmaya çalıştığınız zamandır. Yazı Biçimindeki glifin 90 derece döndürülmesi gerekir, bu nedenle drawTextOnPath () kullanmak için iyi bir aday olacaktır.


Soldan Sağ Tarafa başka bir yoldan nasıl yapılabilir
Rakesh

3
textview.setTextDirection (View.TEXT_DIRECTION_RTL) veya textview.setTextDirection (View.TEXT_DIRECTION_ANY_RTL), API seviyesi 17'nin üzerinde çalışabilir. test edebilirsiniz.
Zephyr

akıllı ve basit
Abdulrahman Abdelkader

1

Pointer Null'un cevabının ardından , onDrawyöntemi şu şekilde değiştirerek metni yatay olarak ortalayabildim :

@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();
}

Çok satırlı bir metni ortalamak için TextView measureWidth'in bir bölümünü eklemeniz gerekebilir.


1

TextView veya diğer View xml rotasyon değerinize ekleyebilirsiniz. Bu en kolay yol ve benim için doğru çalışmak.

<LinearLayout
    android:rotation="-90"
    android:layout_below="@id/image_view_qr_code"
    android:layout_above="@+id/text_view_savva_club"
    android:layout_marginTop="20dp"
    android:gravity="bottom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

   <TextView
       android:textColor="@color/colorPrimary"
       android:layout_marginStart="40dp"
       android:textSize="20sp"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Дмитриевский Дмитрий Дмитриевич"
       android:maxLines="2"
       android:id="@+id/vertical_text_view_name"/>
    <TextView
        android:textColor="#B32B2A29"
        android:layout_marginStart="40dp"
        android:layout_marginTop="15dp"
        android:textSize="16sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/vertical_text_view_phone"
        android:text="+38 (000) 000-00-00"/>

</LinearLayout>

Sonuç


0

Dikey bir LinearLayout içinde dikey metin oluşturmak için ilk yaklaşımım aşağıdaki gibiydi (bu Kotlin, Java kullanımında setRoatationvb.):

val tv = TextView(context)
tv.gravity = Gravity.CENTER
tv.rotation = 90F
tv.height = calcHeight(...)
linearLabels.addView(tv)

yaklaşım 1

Gördüğünüz gibi, sorun TextView'in dikey olarak gitmesi, ancak genişliğine yatay olarak yönlendirilmiş gibi davranmasıdır! = /

Bu nedenle, 2 numaralı yaklaşım, bunu hesaba katmak için ek olarak genişlik ve yüksekliği manuel olarak değiştirmekten oluşuyordu:

tv.measure(0, 0)
// tv.setSingleLine()
tv.width = tv.measuredHeight
tv.height = calcHeight(...)

yaklaşım 2

Ancak bu setSingleLine, nispeten kısa genişlikten sonra etiketlerin bir sonraki satıra sarılmasına (veya eğer sizseniz kırpılmasına ) neden oldu. Yine, bu, x'i y ile karıştırmaya indirgiyor.

Benim yaklaşımım # 3, TextView'i RelativeLayout'ta sarmalamaktı. Buradaki fikir, TextView'e istediği genişliğe, onu sola ve sağa genişleterek izin vermektir (burada, her iki yönde 200 piksel). Ancak daha sonra, dar bir sütun olarak çizilmesini sağlamak için RelativeLayout negatif kenar boşluklarını veriyorum. İşte bu ekran görüntüsü için tam kodum:

val tv = TextView(context)
tv.text = getLabel(...)
tv.gravity = Gravity.CENTER
tv.rotation = 90F

tv.measure(0, 0)
tv.width = tv.measuredHeight + 400  // 400 IQ
tv.height = calcHeight(...)

val tvHolder = RelativeLayout(context)
val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT)
lp.setMargins(-200, 0, -200, 0)
tvHolder.layoutParams = lp
tvHolder.addView(tv)
linearLabels.addView(tvHolder)

val iv = ImageView(context)
iv.setImageResource(R.drawable.divider)
linearLabels.addView(iv)

yaklaşım 3

Genel bir ipucu olarak, bu görünümün başka bir görünümü "tutmasına" sahip olma stratejisi, Android'deki şeyleri konumlandırmada benim için gerçekten yararlı oldu! Örneğin, ActionBar'ın altındaki bilgi penceresi aynı taktiği kullanır!

Mağaza işareti gibi görünen metin için her karakterden sonra yeni satırlar ekleyin, örneğin "N\nu\nt\ns":

mağaza işareti örneği


-1

@ Kostmo'nun yaklaşımını beğendim. Biraz değiştirdim, çünkü bir sorunum vardı - parametrelerini olarak ayarladığımda dikey olarak döndürülmüş etiketi kesmek WRAP_CONTENT. Böylece bir metin tam olarak görünmüyordu.

Ben böyle çözdüm:

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Build;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class VerticalLabelView extends View
{
    private final String LOG_TAG           = "VerticalLabelView";
    private final int    DEFAULT_TEXT_SIZE = 30;
    private int          _ascent           = 0;
    private int          _leftPadding      = 0;
    private int          _topPadding       = 0;
    private int          _rightPadding     = 0;
    private int          _bottomPadding    = 0;
    private int          _textSize         = 0;
    private int          _measuredWidth;
    private int          _measuredHeight;
    private Rect         _textBounds;
    private TextPaint    _textPaint;
    private String       _text             = "";
    private TextView     _tempView;
    private Typeface     _typeface         = null;
    private boolean      _topToDown = false;

    public VerticalLabelView(Context context)
    {
        super(context);
        initLabelView();
    }

    public VerticalLabelView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        initLabelView();
    }

    public VerticalLabelView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        initLabelView();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public VerticalLabelView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
        initLabelView();
    }

    private final void initLabelView()
    {
        this._textBounds = new Rect();
        this._textPaint = new TextPaint();
        this._textPaint.setAntiAlias(true);
        this._textPaint.setTextAlign(Paint.Align.CENTER);
        this._textPaint.setTextSize(DEFAULT_TEXT_SIZE);
        this._textSize = DEFAULT_TEXT_SIZE;
    }

    public void setText(String text)
    {
        this._text = text;
        requestLayout();
        invalidate();
    }

    public void topToDown(boolean topToDown)
    {
        this._topToDown = topToDown;
    }

    public void setPadding(int padding)
    {
        setPadding(padding, padding, padding, padding);
    }

    public void setPadding(int left, int top, int right, int bottom)
    {
        this._leftPadding = left;
        this._topPadding = top;
        this._rightPadding = right;
        this._bottomPadding = bottom;
        requestLayout();
        invalidate();
    }

    public void setTextSize(int size)
    {
        this._textSize = size;
        this._textPaint.setTextSize(size);
        requestLayout();
        invalidate();
    }

    public void setTextColor(int color)
    {
        this._textPaint.setColor(color);
        invalidate();
    }

    public void setTypeFace(Typeface typeface)
    {
        this._typeface = typeface;
        this._textPaint.setTypeface(typeface);
        requestLayout();
        invalidate();
    }

    @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));
        }
    }

    @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);

            float rotateDegree = -90;
            float y = 0;

            if (this._topToDown)
            {
                rotateDegree = 90;
                y = this._measuredWidth / 2;
            }

            canvas.rotate(rotateDegree);
            canvas.drawText(this._text, 0, y, this._textPaint);
        }
    }
}

Yukarıdan aşağıya bir metin olmasını istiyorsanız, topToDown(true)yöntemi kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.