vertical texto studio programacion poner móviles letras las escribir desarrollo curso cuadro como aplicaciones android textview vertical-text

texto - curso android desarrollo de aplicaciones móviles pdf



¿Es posible escribir verticalmente en una vista de texto en Android? (6)

Digamos que tiene un TextView normal, con "Stackoverflow" escrito en él, ¿es posible girar el TextView por -90 °, para tener la S en la parte inferior y la W en la parte superior de la pantalla? Por supuesto, podría escribir mi texto como una imagen, rotarlo y usarlo de esa manera, pero ahora estoy interesado en el texto. Gracias.


Podemos establecer la rotación con vista XML

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


Proporcioné una solución en otra question . Puede obtener TextView vertical al extender desde Ver y anular sus onMeasure() y onDraw() . Sin embargo, no admitirá todas las funciones de TextView, sino las principales, como el relleno, el tamaño, el color y la fuente.

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


Prueba esto. Funciona bien para mí. Puede mostrar una línea de texto verticalmente, pero solo una línea. los colores, el tamaño, los almohadones, los márgenes y el fondo funcionan bien.

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


Puede configurar su vista de texto como lo haría normalmente

por ejemplo:

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

y escribe una función en tu actividad para

  • invierte los caracteres en tu texto
  • insertar /n después de cada caracter

y luego establece el texto en TextView.

Si no desea insertar el /n , tendrá que establecer el tamaño de android:layout_width y jugar con el tamaño de fuente para no tener dos caracteres que se ajusten en la misma línea y sin truncamiento.

Editar Si te he entendido correctamente, puedes obtener lo que deseas usando la animación.

Por ejemplo

En res/animation/myanim.xml :

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

Tendrá que jugar con este archivo para definir dónde desea colocar su vista de texto.

En tu actividad:

TextView t = (TextView)findViewById(R.id.txtview); String txt = ""; 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);


Si está utilizando API 11 o posterior, puede intentar:

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


Trabajó para mi:

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" />