「Stackoverflow」が記述された通常のTextViewがあるとします。TextViewを-90°回転させて、画面の下部にS、上部にWを表示することはできますか?もちろん、テキストを画像として書き、回転してそのように使用することもできますが、今はテキストに興味があります。ありがとう。
通常どおりにテキストビューを設定できます
例えば:
<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);
私のために働いた:
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" />
これを試して。それは私にとってはうまくいきます。 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);
}
}
API 11以降を使用している場合は、以下をお試しください。
TextView t = (TextView) findViewById(R.id.txtview);
String txt = "Stackoverflow";
t.setText(txt);
t.setRotation(90); // 90 degree rotation
XMLビューで回転を設定できます
<TextView Android:id="@+id/txtview"
Android:rotation="-90"
Android:text="123"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content" />
回転した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での表示です。
そしてもちろん、このコードを修正して機能させる必要があります。 (Android:layout_width、Android:layout_heightなどの属性で)
「Stackoverflow」を縦に書くという質問に対する最も簡単な答えは、通常のTextViewを使用することだと思います。テキストを狭めると次の行に折り返されるため、TextViewの幅で遊んで、それぞれに文字が1つあるようにします行、およびバッファーとしてEdgeにさらにスペースが必要な場合は、TextViewの「パディング」または「マージン」を増やします。
別の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);
}
}
}