web-dev-qa-db-ja.com

Androidのtextviewに縦書きすることは可能ですか?

「Stackoverflow」が記述された通常のTextViewがあるとします。TextViewを-90°回転させて、画面の下部にS、上部にWを表示することはできますか?もちろん、テキストを画像として書き、回転してそのように使用することもできますが、今はテキストに興味があります。ありがとう。

28
Sephy

通常どおりにテキストビューを設定できます

例えば:

 <TextView Android:id="@+id/txtview"
    Android:layout_height="fill_parent"
    Android:layout_width="wrap_content" />

アクティビティに関数を記述して

  • テキストの文字を逆にします
  • すべての文字の後に\nを挿入します

次に、テキストをTextViewに設定します。

\nを挿入したくない場合は、Android:layout_widthのサイズを設定し、同じ行に2文字が収まらず、切り捨てられないようにフォントサイズを変更する必要があります。

編集私があなたを正しく理解していれば、アニメーションを使ってあなたが望むものを手に入れることができます。

例えば

res/anim/myanim.xmlの下:

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

このファイルを操作して、テキストビューを配置する場所を定義する必要があります。

あなたの活動では:

  TextView t = (TextView)findViewById(R.id.txtview);
  String txt = "Stackoverflow";         
  t.setText(txt);

  RotateAnimation ranim = (RotateAnimation)AnimationUtils.loadAnimation(this, R.anim.myanim);
  ranim.setFillAfter(true); //For the textview to remain at the same place after the rotation
  t.setAnimation(ranim);
38
ccheneson

私のために働いた:

public class VerticalTextView extends TextView {

    private int _width, _height;
    private final Rect _bounds = new Rect();

    public VerticalTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

    public VerticalTextView(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        // vise versa
        _height = getMeasuredWidth();
        _width = getMeasuredHeight();
        setMeasuredDimension(_width, _height);
    }

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

        canvas.translate(_width, _height);
        canvas.rotate(-90);

        TextPaint Paint = getPaint();
        Paint.setColor(getTextColors().getDefaultColor());

        String text = text();

        Paint.getTextBounds(text, 0, text.length(), _bounds);
        canvas.drawText(text, getCompoundPaddingLeft(), (_bounds.height() - _width) / 2, Paint);

        canvas.restore();
    }

    private String text() {
        return super.getText().toString();
    }
}

xml:

<VerticalTextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="left|center_vertical"
            Android:background="@color/feedback_background"
            Android:padding="4dip"
            Android:text="@string/feedback"
            Android:textColor="@color/feedback_text_color"
            Android:textSize="@dimen/text_xlarge" />
18
Yura Shinkarev

これを試して。それは私にとってはうまくいきます。 1行のテキストを垂直に表示できますが、1行だけ表示できます。色、サイズ、パディング、マージン、背景はすべて正常に機能します。

public class VerticalTextView extends TextView {

    public VerticalTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

    public VerticalTextView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        final ColorStateList csl = getTextColors();
        final int color = csl.getDefaultColor();
        final int paddingBottom = getPaddingBottom();
        final int paddingTop = getPaddingTop();
        final int viewWidth = getWidth();
        final int viewHeight = getHeight();
        final TextPaint Paint = getPaint();
        Paint.setColor(color);
        final float bottom = viewWidth * 9.0f / 11.0f;
        Path p = new Path();
        p.moveTo(bottom, viewHeight - paddingBottom - paddingTop);
        p.lineTo(bottom, paddingTop);
        canvas.drawTextOnPath(getText().toString(), p, 0, 0, Paint);
    }
}
8
alexhilton

API 11以降を使用している場合は、以下をお試しください。

TextView t = (TextView) findViewById(R.id.txtview);
String txt = "Stackoverflow";         
t.setText(txt);
t.setRotation(90); // 90 degree rotation
5
Chris623

XMLビューで回転を設定できます

 <TextView Android:id="@+id/txtview"
        Android:rotation="-90"
        Android:text="123"
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content" />
4
EminenT

回転したTextViewを含むカスタムの垂直ボタンの例を紹介します。

<!--Undo button-->
<LinearLayout
    Android:id="@+id/undo_points_pr_a"
    Android:layout_width="@dimen/zero_dp"
    Android:gravity="center"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:layout_weight="1"
    Android:background="@color/timerUndoButton">

    <ImageView
        Android:layout_width="@dimen/large"
        Android:layout_height="@dimen/large"
        Android:src="@drawable/undo_icon"
        Android:rotation="-90"
        Android:layout_marginBottom="@dimen/medium"/>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/undo"
        Android:textSize="@dimen/small_medium_text"
        Android:rotation="-90"/>

</LinearLayout>

これは、Android Studioでの表示です。

And this is how it looks in Android Studio:

そしてもちろん、このコードを修正して機能させる必要があります。 (Android:layout_width、Android:layout_heightなどの属性で)

2
Andrij

「Stackoverflow」を縦に書くという質問に対する最も簡単な答えは、通常のTextViewを使用することだと思います。テキストを狭めると次の行に折り返されるため、TextViewの幅で遊んで、それぞれに文字が1つあるようにします行、およびバッファーとしてEdgeにさらにスペースが必要な場合は、TextViewの「パディング」または「マージン」を増やします。

0
Cameron A

別のStackOverflow question でソリューションを提供しました。 Viewから拡張し、そのonMeasure()およびonDraw()メソッドをオーバーライドすることにより、垂直方向のTextViewを取得できます。ただし、TextViewのすべての機能をサポートするわけではなく、パディング、サイズ、色、フォントなどの主要な機能をサポートします。

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);
        }
    }
}
0
Ayaz Alifov