package com.zhangyue.iReader.common.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View; import com.zhangyue.iReader.common.util.Util; import java.util.List; /**
* =======================================================================================
* 作 者:caoxinyu
* 创建日期:2018/4/27.
* 类的作用:多行textVIew
* 修订历史:
* =======================================================================================
*/
public class MultiItemTextView extends View{ private Paint mLinePaint;//划线的paint
private Paint mTextPaint;// 文字画笔
private Paint.FontMetricsInt mFontMetricsInt; private List<String> mStrList;
private int mHeight =0;
private int mLineHeight;
private int mPaddingTB;
private int[] mBeforHeight;//之前所有的item列表的高度
private int[] mCurItemHeight;// 当前item 的高度
private int[] mCurItemTextHeight;// 当前文字的高度
private int[] mCurItemLineNum;//当前item 的行号
private Rect mTempBounds;
private int mMaxText;// 当前一行可以放多少个文字
private int mLineSpace;//多行的时候 两行之间的间距
private int mRightPadding = 0;
public MultiItemTextView(Context context) {
super(context);
init(context);
} public MultiItemTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
} public MultiItemTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
} private void init(Context context) {
initPaint(context);
initDistance(context);
} private void initPaint(Context context) {
mLinePaint = new Paint();
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(Util.dipToPixel2(getContext(),13));
mFontMetricsInt = mTextPaint.getFontMetricsInt();
mLinePaint.setAntiAlias(true);
mLinePaint.setColor(Color.parseColor("#EEEEEE"));
mTextPaint.setColor(Color.parseColor("#FF222222"));
mLineHeight = Util.dipToPixel(getContext(), 0.67f);
} private void initDistance(Context context) {
mTempBounds = new Rect();
mLineSpace = Util.dipToPixel(context,2);
mPaddingTB = Util.dipToPixel(getContext(), 16);
mRightPadding = Util.dipToPixel2(context,10);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int startY;
if (mStrList == null) {
return;
}
for (int i = 0; i < mStrList.size(); i++) {
if (i ==0) {
startY = 0;
}else {
startY = mBeforHeight[i-1];
}
canvas.drawLine(0, startY,getWidth(),mLineHeight+ startY,mLinePaint); int textStartY = startY+ mCurItemHeight[i] / 2 + mCurItemTextHeight[i] / 2 - mFontMetricsInt.descent;
String text = mStrList.get(i);
if (mCurItemLineNum[i] >1) {
for (int j = 0; j < mCurItemLineNum[i]; j++) {
textStartY = startY+ mPaddingTB +(mTempBounds.height())*(j+1)+j* mLineSpace - mFontMetricsInt.descent;
String substring = text.substring(j * mMaxText, mMaxText*(j+1) > text.length() ? text.length(): mMaxText*(j+1));
canvas.drawText(substring,0,textStartY,mTextPaint);
}
}else {
canvas.drawText(text,0,textStartY,mTextPaint);
}
if (i == mStrList.size()-1){
canvas.drawLine(0,mHeight-mLineHeight,getWidth(),mHeight,mLinePaint);
}
}
} public void setTextSize(int textSize) {
mTextPaint.setTextSize(Util.dipToPixel2(getContext(), textSize));
} public void setTextColor(int color) {
mTextPaint.setColor(color);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec) -mRightPadding;
if (width ==0) {
return;
} for (int i = 0; i < mStrList.size(); i++) {
String text = mStrList.get(i);
mTextPaint.getTextBounds(text,0, text.length(), mTempBounds);
float textWidth = mTextPaint.measureText(text); int line =1;
if (textWidth > width) {
float oneCharLength = textWidth / text.length();
mMaxText = (int) (width / oneCharLength);//一行最大可以放置的文字数
line= text.length() / mMaxText;
if (text.length() % mMaxText !=0) {//如果不能整除 说明还剩余一行
line+=1;
}
int itemHeight = mPaddingTB * 2 + mTempBounds.height()*line +(line-1)* mLineSpace;
mCurItemHeight[i] =itemHeight;
mCurItemTextHeight[i] = mTempBounds.height()*line;
mHeight += itemHeight;
mBeforHeight[i]=mHeight;
}else {
int itemHeight = mPaddingTB * 2 + mTempBounds.height();
mCurItemHeight[i] =itemHeight;
mCurItemTextHeight[i] = mTempBounds.height();
mHeight += itemHeight;
mBeforHeight[i]=mHeight;
}
mCurItemLineNum[i] = line;
}
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),mHeight);
} public void setStrList(List<String> strList) {
if (strList == null && strList.size()==0) {
return;
}
mStrList = strList;
mBeforHeight =new int[mStrList.size()];
mCurItemHeight =new int[mStrList.size()];
mCurItemTextHeight =new int[mStrList.size()];
mCurItemLineNum =new int[mStrList.size()];
invalidate();
}
}

直接调用setStrList 设置字符串就可以了。

android 多行文本显示的textView的更多相关文章

  1. Android 使用Font Awesome 显示文字图标

    Android 使用Font Awesome 显示文字图标 简单几步就可以完成 简单的效果图: 1. 创建 assets 文件夹 在Android Studio 上的创建步骤为: 在 src/main ...

  2. Android控件_TextView(显示文本框控件)

    一.TextView控件的常用属性  1.android:id——控件的id   2.android:layout_width——设置控件的宽度 wrap_content(包裹实际文本内容) fill ...

  3. Android EditText多行显示及所有属性

    android:id="@+id/editSms" android:layout_width="fill_parent" android:layout_heig ...

  4. Android textAppearance的属性设置及TextView属性详解

    textAppearance的属性设置 android:textAppearance="?android:attr/textAppearanceSmall" android:tex ...

  5. Android开发8:UI组件TextView,EditText,Button

    版本:Android4.3 API18 学习整理:liuxinming TextView 概述 TextView直接继承了View(EditText.Button两个UI组件类的父类) TextVie ...

  6. Android View绘制和显示原理简介

    现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章--<Android应用流畅度测 ...

  7. Android实现小圆点显示未读功能

    代码地址如下:http://www.demodashi.com/demo/13541.html 前言 以前我们实现这个功能都是用 BadgeView.java,大体就是将这个java类复制到自己的项目 ...

  8. Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果

    一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...

  9. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...

随机推荐

  1. 整理齐全 - Vultr VPS自定义安装Windows ISO(2003/2012/2008/WIN7)

    最近公司有几个项目是需要在Windows VPS服务器中运行调试的,但是公司给予的成本有限,所以只能在Linux VPS中考虑,毕竟Linux服务器相比Windows系统便宜很多.开始我们运维部门考虑 ...

  2. 51nod 1366 贫富差距

    题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个国家有N个公民,标记为0,1,2,...,N-1,每个公民有一个存款额.已知每个公 ...

  3. graphql 数据增删改查分页及关联操作(三)

    说明: 接第二篇文章,代码也是在第二篇文章之上 本文只是针对mondodb来操作 一.添加相关的包 yarn add Mongoose 二.初始化Mongodb 修改server.ts 导入 impo ...

  4. ffmpeg控制台上不能输出信息的解决办法

    最近遇到下面类似的问题 我下载了最新版本(1.1.2)版本的ffmpeg,在windows平台下使用msys+mingw编译成功后,我输入命令后,一点输出信息都没有,例如: ffmpeg -v 这时候 ...

  5. Selenium入门19 捕获异常

    脚本出现异常时会中断执行,想要继续执行就要做异常处理: 1 try ... except .... else   遇到异常显示异常信息: 没有异常继续执行else后面的脚本 2 try ... exc ...

  6. selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH. 错误处理方法

    首次使用selenium webdriver,webdriver.Firefox() 报错selenium.common.exceptions.WebDriverException: Message: ...

  7. git 分之合并和冲突解决

    Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支 ...

  8. 2017.11.22 mysql数据库实现关联表更新sql语句

    比如有两张表,其中一张表某个字段的值要关联另一张表进行统计,就要用到mysql的update方法,并且left join另一张表进行联合查询. mysql关联表更新统计 sql语句如下: 代码如下 复 ...

  9. glocktop

    glocktop: Display or print active GFS2 locks. Index of glocktop man page Read glocktop man page on L ...

  10. Thinkphp 5 使用DOMDocument

    每一个载入浏览器都会生成一个 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问.Document 对象是 Window 对象的一部分. 我们项目 ...