最近项目有个需求要求文本最多显示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"> <TextView
android: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" /> <EditText
android: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 = ;
int lineCount = ;
int lastTextLength = ;
boolean isMinus = false;
int maxTextSize = ;
int minTextSize = ;
ArrayList<PositionTextSize> arrayListPts = new ArrayList<>(); @Override
protected 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();
mTxt.setTextSize(mDefaultTextSize);
mEt = (EditText) findViewById(R.id.et_msg);
mEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override
public void afterTextChanged(Editable s) {
mTxt.setText(s.toString());
resizeTextSize(mTxt);
}
});
} private void resizeTextSize(final TextView textView) {
textView.post(new Runnable() {
@Override
public 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 > ) {
if (currentTextSize > minTextSize) {
newTextSize = currentTextSize - ;
}
PositionTextSize pts = new PositionTextSize();
pts.textSize = currentTextSize;
pts.position = currentTextLength;
arrayListPts.add(pts); }
if (isMinus) {
newTextSize = findPositionTextSize(currentTextLength);
}
if ((newTextSize != currentTextSize) && newTextSize > ) {
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 = ;
PositionTextSize result = null;
int size = arrayListPts.size();
for (int p = size - ; p >= ; 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. EditText 几种显示方式,固定行数,自适应行数

    1.显示7行,超过7行自动向下补充行数 <EditText android:id="@+id/edt_content" android:layout_width=" ...

  2. Grid++Report设置显示固定行数

    一.要实现的功能打印的报表显示固定的行数,并且设置字段的文字可以自动换行二.设置步骤1.鼠标左键单击“明细网格”栏,在右侧属性窗口中设置“追加空白行”属性值为:是:“追加空白行在后”属性值为:是.2. ...

  3. FastReport之实现打印固定行数,不足补打空白行的办法

    在设置单据的打印模板的时候,我们有时候会遇到这样的情况:单据的内容很少,打印出来的效果不理想的情况,例如1.单据体与单尾之间有大量的空白: 2.单据体跟单尾连在一起,单尾后面的空白篇幅太大: 以上这两 ...

  4. oracle取随机数,取固定行数的数

    首先建一张测试表: create table DIM_IA_TEST5 ( NAME ), OTHERNAME ), NUM NUMBER, TIMES NUMBER ) 然后插入数据,现在的表数据为 ...

  5. Oracle 行转列(不固定行数的行转列,动态)(转)

    http://bbs.csdn.net/topics/330039676 SQLSERVER :行列转换例子:  http://www.cnblogs.com/gaizai/p/3753296.htm ...

  6. 纯css实现不固定行数的文本在一个容器内垂直居中

    项目中要实现的效果如图: html代码 及 css代码: <!DOCTYPE html> <html> <head> <meta charset=" ...

  7. python pandas使用chunksize异步拆分固定行数的文件

    import pandas as pd import asyncio from collections import defaultdict collect = defaultdict(list) # ...

  8. Android studio如何显示代码行数

    1.首先打开as:File-->Settings... 2.Editor-->General-->Appearence 3.右边show line numbers 4.依次点击app ...

  9. Android中获取TextView行数

    项目中发现,如果直接通过TextView.getLineCount()方法获取行数时,总是0,研究发现,setText()后立即调用getLineCount(), 这时TextView还未完成meas ...

随机推荐

  1. 关于搭建Session服务器(转载)

    Session服务器配置指南与使用经验 一.摘要 所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Session共享问题.本文介绍.NET平台下建 ...

  2. 洛谷——P1823 音乐会的等待

    https://www.luogu.org/problem/show?pid=1823 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任 ...

  3. VA对于开发QT是神器,VA自动补全QT

    我怎么就忘了,VA也可以适用于VS下开发QT程序.其中QT的头文件自己增加,主要是: C:\Qt\4.8.6_2008\include 但还有一些特殊类不认识,所以还得继续增加: C:\Qt\4.8. ...

  4. CentOS搭建xfce桌面+VNC教程

    CentOS搭建xfce桌面+VNC教程 Linux的安全与性能向来为开发者所称道,你可以轻松地在搜索引擎中找到各种Linux优越性的说辞,其中不乏Linux的激进者.特别是当你步入VPS领域,更多地 ...

  5. HTML基础-第一讲

    转自:https://blog.csdn.net/likaier/article/details/326639?utm_source=blogxgwz9 HTML是网页主要的组成部分,基本上一个网页都 ...

  6. Spark应用程序部署工具Spark Submit

    不多说,直接上干货!  spark-submit在哪个位置 [spark@master ~]$ cd $SPARK_HOME/bin [spark@master bin]$ pwd /usr/loca ...

  7. MSDN上的异步socket 服务端例子

    MSDN上的异步socket 服务端例子 2006-11-22 17:12:01|  分类: 代码学习 |  标签: |字号大中小 订阅     Imports SystemImports Syste ...

  8. C# mongodb帮助类

    这是在C#连接MongoDB的帮助类,所使用的驱动是在Vs2015的Nuget管理器中下载的mongodb驱动. 下载第一个,会自动下载下面的两个,不要删除. 在配置文件中配置连接字符串connStr ...

  9. 安装配置Rancher管理docker

    原文:安装配置Rancher管理docker 版权声明:本文为博主原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu. https://blog.csdn ...

  10. apache-spark导入eclipse环境

    工作中用到了apache-spark,想深入了解一下,决定从源码开始. 先导入到常用的ide,eclipse吧: 准备工作 1.  下载Eclipse:http://scala-ide.org/ 2. ...