所先声明一下这个类是我从网上找到的一篇文章,只是保留并没有侵权的意思。
[代码]java代码:
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | public class TextViewVertical extends View { public static final int LAYOUT_CHANGED = 1; private Paint paint; private int mTextPosx = 0;// x坐标 private int mTextPosy = 0;// y坐标 private int mTextWidth = 0;// 绘制宽度 private int mTextHeight = 0;// 绘制高度 private int mFontHeight = 0;// 绘制字体高度 private float mFontSize = 24;// 字体大小 private int mRealLine = 0;// 字符串真实的行数 private int mLineWidth = 0;//列宽度 private int TextLength = 0;//字符串长度 private int oldwidth = 0;//存储久的width private String text = "";//待显示的文字 private Handler mHandler = null; private Matrix matrix; BitmapDrawable drawable = (BitmapDrawable) getBackground();
public TextViewVertical(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
public TextViewVertical(Context context, AttributeSet attrs) { super(context, attrs); matrix = new Matrix(); paint = new Paint();//新建画笔 paint.setTextAlign(Paint.Align.CENTER);//文字居中 paint.setAntiAlias(true);//平滑处理 paint.setColor(Color.BLACK);//默认文字颜色 try { mFontSize = Float.parseFloat(attrs.getAttributeValue(null, "textSize"));//获取字体大小属性 } catch (Exception e) { } } //设置文字 public final void setText(String text) { this.text = text; this.TextLength = text.length(); if (mTextHeight > 0) GetTextInfo(); }
//设置字体大小 public final void setTextSize(float size) { if (size != paint.getTextSize()) { mFontSize = size; if (mTextHeight > 0) GetTextInfo(); } }
//设置字体颜色 public final void setTextColor(int color) { paint.setColor(color); }
//设置字体颜色 public final void setTextARGB(int a, int r, int g, int b) { paint.setARGB(a, r, g, b); }
//设置字体 public void setTypeface(Typeface tf) { if (this.paint.getTypeface() != tf) { this.paint.setTypeface(tf); } }
//设置行宽 public void setLineWidth(int LineWidth) { mLineWidth = LineWidth; }
//获取实际宽度 public int getTextWidth() { return mTextWidth; }
//设置Handler,用以发送事件 public void setHandler(Handler handler) { mHandler = handler; }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Log.v("TextViewVertical", "onDraw"); if (drawable != null) { //画背景 Bitmap b = Bitmap.createBitmap(drawable.getBitmap(), 0, 0, mTextWidth, mTextHeight); canvas.drawBitmap(b, matrix, paint); } //画字 draw(canvas, this.text); }
private void draw(Canvas canvas, String thetext) { char ch; mTextPosy = 0;//初始化y坐标 mTextPosx = mTextWidth - mLineWidth;//初始化x坐标 for (int i = 0; i < this.TextLength; i++) { ch = thetext.charAt(i); if (ch == '\n') { mTextPosx -= mLineWidth;// 换列 mTextPosy = 0; } else { mTextPosy += mFontHeight; if (mTextPosy > this.mTextHeight) { mTextPosx -= mLineWidth;// 换列 i--; mTextPosy = 0; } else { canvas.drawText(String.valueOf(ch), mTextPosx, mTextPosy, paint); } } }
//调用接口方法 //activity.getHandler().sendEmptyMessage(TestFontActivity.UPDATE); }
//计算文字行数和总宽 private void GetTextInfo() { Log.v("TextViewVertical", "GetTextInfo"); char ch; int h = 0; paint.setTextSize(mFontSize); //获得字宽 if (mLineWidth == 0) { float[] widths = new float[1]; paint.getTextWidths("正", widths);//获取单个汉字的宽度 mLineWidth = (int) Math.ceil(widths[0] * 1.1 + 2); }
Paint.FontMetrics fm = paint.getFontMetrics(); mFontHeight = (int) (Math.ceil(fm.descent - fm.top) * 0.9);// 获得字体高度
//计算文字行数 mRealLine = 0; for (int i = 0; i < this.TextLength; i++) { ch = this.text.charAt(i); if (ch == '\n') { mRealLine++;// 真实的行数加一 h = 0; } else { h += mFontHeight; if (h > this.mTextHeight) { mRealLine++;// 真实的行数加一 i--; h = 0; } else { if (i == this.TextLength - 1) { mRealLine++;// 真实的行数加一 } } } } mRealLine++;//额外增加一行 mTextWidth = mLineWidth * mRealLine;//计算文字总宽度 measure(mTextWidth, getHeight());//重新调整大小 layout(getLeft(), getTop(), getLeft() + mTextWidth, getBottom());//重新绘制容器 }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measuredHeight = measureHeight(heightMeasureSpec); //int measuredWidth = measureWidth(widthMeasureSpec); if (mTextWidth == 0) GetTextInfo(); setMeasuredDimension(mTextWidth, measuredHeight); if (oldwidth != getWidth()) {// oldwidth = getWidth(); if (mHandler != null) mHandler.sendEmptyMessage(LAYOUT_CHANGED); } }
private int measureHeight(int measureSpec) { int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); int result = 500; if (specMode == MeasureSpec.AT_MOST) { result = specSize; } else if (specMode == MeasureSpec.EXACTLY) { result = specSize; } mTextHeight = result;//设置文本高度 return result; }
} |
然后在xml 引用这个路径比如:
[代码]xml代码:
1 2 3 4 5 6 | <com.testapp.view.TextViewVertical android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#dd00" android:textSize="20sp" /> |
共同学习,写下你的评论
评论加载中...
作者其他优质文章