当前位置:   article > 正文

自定义TextView实现竖排文本_textview竖排

textview竖排

最近有竖排文本的需求,整理了一些实现方式,最终自定义TextView绘制文本方式满足需求。

参考文档:

https://blog.csdn.net/Blue_Tong/article/details/123376013

英文纵向显示-竖版TextView_windroid之父的博客-CSDN博客

1.设置 android:ems="1" 属性即可

  1. <TextView
  2. android:text="我的应用"
  3. android:textSize="32sp"
  4. android:ems="1"
  5. android:layout_width="wrap_content"
  6. android:layout_height="wrap_content" />

效果:显示中文

显示英文:


 

特点:

  • 实现简单
  • 无需自定义view
  • 英文不满足需求

2.自定义 TextView 继承 android TextView, 用画笔绘制

  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Paint;
  4. import android.graphics.Rect;
  5. import android.graphics.Path;
  6. import android.graphics.Typeface;
  7. import android.util.AttributeSet;
  8. import android.widget.TextView;
  9. public class VerticalTextView2 extends TextView {
  10. private final static String TAG = "VerticalTextView2 ";
  11. protected int mTextColor = 0xFFFF0000;
  12. private String mText;
  13. private Paint mPaint;
  14. private Rect mBound;//绘制时控制文本绘制的范围
  15. private Path path;
  16. public VerticalTextView2(Context context) {
  17. super(context);
  18. init();
  19. }
  20. public VerticalTextView2(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. init();
  23. }
  24. public VerticalTextView2(Context context, AttributeSet attrs, int defStyle) {
  25. super(context, attrs, defStyle);
  26. init();
  27. }
  28. private void init() {
  29. mPaint = new Paint();//创建画笔
  30. mText = "我 的 应 用";// 初始化文本
  31. mPaint.setColor(mTextColor);//初始化画笔颜色
  32. mPaint.setAntiAlias(true);
  33. mPaint.setTextSize(32);//初始化文字大小
  34. mBound = new Rect();//显示区域
  35. mPaint.getTextBounds(mText, 0, mText.length(), mBound);
  36. mPaint.clearShadowLayer();
  37. initDisplay();
  38. path = new Path();
  39. path.lineTo(0, 500);
  40. }
  41. protected void initDisplay() {
  42. setTypeface(Typeface.SERIF);//风格设置
  43. }
  44. public boolean isChinese(char str) {
  45. Character.UnicodeBlock ub = Character.UnicodeBlock.of(str);
  46. if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
  47. || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
  48. || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
  49. || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
  50. || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
  51. || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
  52. return true;
  53. }
  54. return false;
  55. }
  56. @Override
  57. protected void onDraw(Canvas canvas) {
  58. super.onDraw(canvas);
  59. float a = mPaint.measureText("正正", 0, 1);
  60. float left = getWidth() / 2 - a / 2;
  61. float w;
  62. final int len = mText.length();
  63. float py = 0;
  64. for (int i = 0; i < len; i++) {
  65. char c = mText.charAt(i);
  66. w = mPaint.measureText(mText, i, i + 1);//获取字符宽度
  67. StringBuffer b = new StringBuffer();
  68. b.append(c);
  69. if (py > getHeight()) {//定义字的范围
  70. return;
  71. }
  72. if (isChinese(c)) {
  73. py += w;
  74. if (py > getHeight()) {
  75. return;
  76. }
  77. canvas.drawText(b.toString(), left, py, mPaint); //中文处理方法
  78. } else {
  79. canvas.drawTextOnPath(b.toString(), path, py, -left - 2, mPaint);//其他文字处理方法
  80. py += w;
  81. }
  82. }
  83. }
  84. }

xml中使用:

java中已经设置了文本,xml中就不再设置文本,否则会显示两个文本,也可以写到自定义属性

  1. <com.example.myapplication.VerticalTextView2
  2. android:id="@+id/vertical_text_2"
  3. android:textSize="32dp" />

效果:显示中文

 显示英文:

特点:

  • 支持中文和英文
  • 需要自定义TextView
  • 必须指定宽和高
  • 代码多
  • android5.0 之前文字间距不可控

3.直接旋转TextView

实现:
 

  1. package com.example.myapplication;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.text.TextUtils;
  5. import android.util.AttributeSet;
  6. import android.view.Gravity;
  7. import android.view.View;
  8. import android.widget.TextView;
  9. public class VerticalTextView1 extends TextView {
  10. private static final String TAG = "VerticalTextView1";
  11. final boolean topDown;
  12. public VerticalTextView1(Context context, AttributeSet attrs) {
  13. super(context, attrs);
  14. final int gravity = getGravity();
  15. if (Gravity.isVertical(gravity) && (gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) {
  16. setGravity((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP);
  17. topDown = false;
  18. } else
  19. topDown = true;
  20. setEllipsize(TextUtils.TruncateAt.MARQUEE);
  21. setMarqueeRepeatLimit(-1);
  22. setFocusable(true);
  23. setFocusableInTouchMode(true);
  24. setSingleLine();
  25. setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
  26. }
  27. @Override
  28. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  29. super.onMeasure(heightMeasureSpec, widthMeasureSpec);
  30. setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
  31. }
  32. @Override
  33. protected boolean setFrame(int l, int t, int r, int b) {
  34. return super.setFrame(l, t, l + (b - t), t + (r - l));
  35. }
  36. @Override
  37. public void onDraw(Canvas canvas) {
  38. if (topDown) {
  39. canvas.translate(getHeight(), 0);
  40. canvas.rotate(90);
  41. } else {
  42. canvas.translate(0, getWidth());
  43. canvas.rotate(-90);
  44. }
  45. canvas.clipRect(0, 0, getWidth(), getHeight(), android.graphics.Region.Op.REPLACE);
  46. super.onDraw(canvas);
  47. }
  48. }

效果:显示中文:

显示英文:

特点:

  • 中文文字会一起旋转
  • 支持英文
  • 无需自定义属性

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号