最近项目有个需求要求文本最多显示3行,继续输入则字体变小,删除已经输入的文字,那么字体变大,不管变大变小都不能超过3行。网上怎么找也找不到相关的解决方案,自己动手,丰衣足食了!

说一下算法思路,后面给出demo。

 第一步 获取当前的行数

我们需要知道目前文本多少行了,之前我采用TextView.getPaint().measureText("your text")这种方法来获取文字的总长度,然后再除以每行的宽度,得到行数,其实这个算法也是可行,不过我采用更简单的方法了。采用view.post方法里面可以通过lineCount = textView.getLineCount();获取正确的行数,否则getLineCount()一直等于0。

   第二步 训练小于多少个字数的时候使用多大的字体

    比如0~30个字数的时候,字体大小是50sp不会超过3行,31~50个字数的时候,字体大小是40sp不会超过3行,51~80个字数的时候,字体大小是30sp不会超过3行。那么这个数据需要记录,因为,删除文字的时候,删到哪个位置需要知道改用多大的字体。而且取得当前当前位置使用多大的字体的时候,需要删除这个字数和字体大小对应关系的数据,因为,这个数据,我们需要不断的训练更新,因为大小写,字符,不同的语言,得到到文字length是不同的。

有了上面两步的分析,我们就可以动态的调整文字的TextSize了。

给出完整的Demo

1、页面设计,简单的就一个输入框和一个文本框,输入框输入上面文本框就显示什么

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.figo.study.activity.TextActivity"><TextViewandroid:id="@+id/txt_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/et_msg"android:text="@string/hello_world"android:textColor="#ffffff" /><EditTextandroid:id="@+id/et_msg"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_marginBottom="141dp" /></RelativeLayout>

 2、Activity编写

package com.figo.study.activity;import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextPaint;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import com.figo.study.R;
import com.figo.study.utils.CommonUtil;
import java.util.ArrayList;/*** 控制在3行,自动调整textSize*/
public class TextActivity extends Activity {TextView mTxt;EditText mEt;int mDefaultTextSize = 50;int lineCount = 0;int lastTextLength = 0;boolean isMinus = false;int maxTextSize = 50;int minTextSize = 6;ArrayList<PositionTextSize> arrayListPts = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_text);initView();}private void initView() {mTxt = (TextView) findViewById(R.id.txt_msg);mTxt.setMaxWidth(600);mTxt.setTextSize(mDefaultTextSize);mEt = (EditText) findViewById(R.id.et_msg);mEt.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {mTxt.setText(s.toString());resizeTextSize(mTxt);}});}private void resizeTextSize(final TextView textView) {textView.post(new Runnable() {@Overridepublic void run() {TextPaint textPaint = textView.getPaint();float currentTextSize = CommonUtil.px2sp(TextActivity.this, textPaint.getTextSize());float newTextSize = currentTextSize;lineCount = textView.getLineCount();int currentTextLength = textView.getText().length();if (currentTextLength > lastTextLength) {isMinus = false;} else {//说明是在减isMinus = true;}lastTextLength = currentTextLength;if (lineCount > 3) {if (currentTextSize > minTextSize) {newTextSize = currentTextSize - 10;}PositionTextSize pts = new PositionTextSize();pts.textSize = currentTextSize;pts.position = currentTextLength;arrayListPts.add(pts);}if (isMinus) {newTextSize = findPositionTextSize(currentTextLength);}if ((newTextSize != currentTextSize) && newTextSize > 0) {textView.setTextSize(newTextSize);}Log.i("TextActivity", "getLineCount:" + lineCount);Log.i("TextActivity", "textSize:" + currentTextSize);Log.i("TextActivity", "textLength:" + currentTextLength);Log.i("TextActivity", "ArraryTextSize:" + arrayToString(arrayListPts));}});}private String arrayToString(ArrayList<PositionTextSize> arrPts) {StringBuffer buffer = new StringBuffer();for (PositionTextSize pts : arrPts) {buffer.append("position:" + pts.position);buffer.append(",textSize:" + pts.textSize + "|");}return buffer.toString();}private float findPositionTextSize(int position) {float textSize = 0;PositionTextSize result = null;int size = arrayListPts.size();for (int p = size - 1; p >= 0; p--) {if (arrayListPts.get(p).position > position) {result = arrayListPts.get(p);textSize = result.textSize;arrayListPts.remove(result);//删除重新训练
            }}return textSize;}public class PositionTextSize {int position;float textSize;}
}

Android TextView,EditText要求固定行数自动调整TextSize相关推荐

  1. Excel按照固定行数拆分为多个文件

    工作需要,需要把Excel按照固定行数拆分,生成多个Excel. 1.打开Excel,鼠标不要任何选择.按"Alt"+"f11". 在sheet1贴上以下代码, ...

  2. 打印倒三角形——固定行数与键盘输入行数

    打印倒三角形 一.固定行数-5行 思路:将整个三角形分成三部分,图中已分别用1.2.3标明.代码中要使用3个for循环,第一个for循环打印内容以"空格"形式展示,即左边的直角三角 ...

  3. ReportViewer单据票据打印,自动分页,每页显示固定行数,每页都显示表头

    报表工具用来用去,其实还是微软自带的ReportViewer比较轻量好用,一般需求完全够用.只是由于不常用,总会有解决一个问题过段时间又忘了怎么解决的问题.索性整理一下,当作笔记了. 在票据打印的时候 ...

  4. android studio统计方法数,android studio如何统计代码行数

    1.首先打开Android Studio开发工具. 2.FileSettings选项或者单击快捷菜单里的settings设置图标. 3.弹出settings对话框,搜索框输入 line 敲回车搜索. ...

  5. android ellipsize 多行,详解Android TextView属性ellipsize多行失效的解决思路

    本文介绍了Android TextView属性ellipsize多行失效的解决思路,分享给大家,具体如下: 多余文字显示省略号的常规做法 android:ellipsize="end&quo ...

  6. excel按照固定行数拆分多个

    1 背景: 工作需要,需要把Excel按照固定行数拆分. 解决办法: 1. 生成是提前处理: 简单来说就是按照行数生成多个Excel. 大概逻辑如下: if(list.size< limit) ...

  7. oracle列转行 空行,Oracle 行转列(不固定行数的行转列,动态)(转)

    SQLSERVER :行列转换例子:  http://www.cnblogs.com/gaizai/p/3753296.html#_labelFour 1. Oracle 11g之后新增了行列转换的函 ...

  8. 基于Android的计算器(代码行数足够用来交大作业)

    这是计算器界面的截图,做的和iPhone上的计算器一样 这下面就全是代码了~ ,工程链接如下 链接:https://pan.baidu.com/s/1epUdoX5yLXOSTXBKJb6_OA  提 ...

  9. android高度混淆,android – TextView与ImageSpan混淆行高

    我有一个文本填充文本,应该包含一些 ImageSpan对象.图像可能高于法线高度,导致以下问题: >如果图像是一行的最后一个对象,则以下行的高度是正确的 >如果最后一个对象不是图像,则以下 ...

最新文章

  1. 为什么程序员总是发现不了自己的Bug?
  2. 李沐团队提出最强ResNet改进版,多项任务达到SOTA | 已开源
  3. 恢复快速启动中的“显示桌面”按钮
  4. 文本分类之特征简约算法说明
  5. 杭电oj1176,2084java实现
  6. 天谕手游会长大人与司空望月,谁的人气更高?都是NPC,别比了
  7. 数据库-日期计算-获取年月日
  8. 菜鸟超级进口大仓618首度亮相!跨境商品也能当日次日达
  9. 光纤收发器具体是怎么分类的?
  10. list control 应用(转载)
  11. 学习重要,还是学会学习重要
  12. 计算机网络自顶向下-应用层
  13. 死磕Android_App 启动过程(含 Activity 启动过程)
  14. 运筹优化(四)--线性规划之对偶问题和灵敏度分析
  15. 别再骂中年人了,对他们好点吧~
  16. java scala中传递变长参数
  17. 【122天】尚学堂高琪Java300集视频精华笔记(43-46)
  18. 每个数据科学家都应该知道的10种机器学习方法
  19. Jenkins实现微服务自动化部署_Jenkins环境设置完整版 (二)
  20. 线性代数--1.2 行化简与阶梯形矩阵

热门文章

  1. activiti7 和业务_华电集团电子商务平台非招标业务操作指南
  2. Jmeter上传文件
  3. mac android sdk manager速度慢,android - SDK Manager无法在Mac上打开 - 堆栈内存溢出
  4. java怎么求两组整数的或集_Java面试题(判断集合中是否有两个数的和等于某个给定整数)...
  5. oracle 12 if,Oracle 12.1 RAC 系列 – 配置第二个网络和相应的SCAN2
  6. python嵌套html开发gui_如何在Python Tkinter GUI中嵌入Cartopy?
  7. 那些汽车搭载鸿蒙,首台搭载鸿蒙OS的汽车要来了?
  8. html设置布局颜色设置,css布局中置背景颜色
  9. 马士兵java教程笔记_马士兵java教程笔记4
  10. 安卓学习笔记40:基于套接字网络编程