垂直的TextView
所先声明一下这个类是我从网上找到的一篇文章,只是保留并没有侵权的意思。
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 引用这个路径比如:
<com.testapp.view.TextViewVertical
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#dd00"
android:textSize="20sp" />
垂直的TextView的更多相关文章
- Android之垂直显示TextView
Android之垂直显示TextView 1因为界面需求原因,需要TextView垂直显示,话不多说,看代码,我也是搜的例子,在此感谢写这个例子的大神,在此做个笔记和分享给大家 2.用到了自定义控件的 ...
- 简易实现 TextView单行文本水平触摸滑动效果
为了方便查看,已使用markdown编辑形成新博文. 本文Mardown地址 近期做应用的时候实用到TextView单行长文本,当文本内容过长时候又想实现触摸水平滑动效果. 网上找了非常多,都没有看到 ...
- AndroidManifest.xml相关知识
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest ...
- 【Android开发学习笔记】【第七课】五大布局-上
概念 Android程序各式各样,依靠的就是布局,先来看看布局都是怎么来的: 白色部分就是我们经常用的几种布局,主要说说介绍下面五大布局 FrameLayout AbsoluteLayout Line ...
- android -------- ConstraintLayout 宽高比和偏移量比(三)
前面的文章 ConstraintLayout 介绍 (一) ConstraintLayout约束属性 (二) 此博文主要讲解: app:layout_constraintHorizontal_bias ...
- 2019最新Android常用开源库总结(附带github链接)
前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 1.TextView HTextView ...
- Android 常用开源库总结(持续更新)
前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...
- Android常用开源库(转)
一 .基本控件 TextView HTextView 一款支持TextView文字动画效果的Android组件库. ScrollNumber 滚动数字控件 ticker 滚动数字控件 ReadMore ...
- Andriod中textview垂直水平居中及LinearLayout内组件的垂直布局
1.textview 垂直水平居中的设置 Android:gravity="center_vertical|center" 2.LinearLayout中设置控件垂直布局,默认的是 ...
随机推荐
- MongoDB 管理工具:Robomongo
http://www.open-open.com/lib/view/open1383029577546.html
- Java-马士兵设计模式学习笔记-观察者模式-AWT简单例子
1.AWT简单例子 TestFrame.java import java.awt.Button; import java.awt.Frame; import java.awt.event.Action ...
- YII2配置多语言
我的YII2版本是2.0.7, 设置多语言时和其他教程有不同的地方, 所以整理如下 1. 在一个controller里面写一个调用i18n的语句, 比如actionIndex echo \Yii::t ...
- [iOS]SourceTree+oschina实现代码远程托管
在iOS开发, 涉及到多人协同开发的时候, 这个时候, 我们就得利用版本控制系统(例如GIT), 来合并和管理代码了, 今天我们来讲一下, 利用 SourceTree+oschina进行版本控制 先来 ...
- MVC+EF+Spring.Net代码生成器
最近研究学习了MVC.EF等相关技术,写了一套项目架构.只要更改EF模型,生成数据库并转换T4模版.数据层和业务层就可以自动生成了. 主要用到的技术: 1.EF实体框架. 2.Spring.Net依赖 ...
- Oracle ->> 变量赋值 Demo
刚学Oracle,学习学习别人的代码.这段代码时从下面的博文中摘取的:http://www.cnblogs.com/mq0036/p/4155774.html declare l_dept ; cur ...
- Spring AOP基础知识
Spring AOP使用动态代理技术在运行期织入增强的代码,两种代理机制包括:一是基于JDK的动态代理,另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的 ...
- sql语句的基本操作
建立一个数据库 create DATABASE mydatabase; 建立一张数据表: ##创建一个员工表##create table employee( eid int not NULL PRIM ...
- thrift 安装介绍
一.About thrift thrift是一种可伸缩的跨语言服务的发展软件框架.它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C + +,C#,Ja ...
- URAL 1200 Horns and Hoofs 枚举
设horns和hoofs的数量分别为 x 和 y ,题目要求: 满足 x+y <= K,使得A*x + B*y - x*x - y*y 最大. 枚举 i 从0~K,直接解方程得对称轴 x = ( ...