Android TextView,EditText要求固定行数自动调整TextSize
最近项目有个需求要求文本最多显示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的更多相关文章
- EditText 几种显示方式,固定行数,自适应行数
1.显示7行,超过7行自动向下补充行数 <EditText android:id="@+id/edt_content" android:layout_width=" ...
- Grid++Report设置显示固定行数
一.要实现的功能打印的报表显示固定的行数,并且设置字段的文字可以自动换行二.设置步骤1.鼠标左键单击“明细网格”栏,在右侧属性窗口中设置“追加空白行”属性值为:是:“追加空白行在后”属性值为:是.2. ...
- FastReport之实现打印固定行数,不足补打空白行的办法
在设置单据的打印模板的时候,我们有时候会遇到这样的情况:单据的内容很少,打印出来的效果不理想的情况,例如1.单据体与单尾之间有大量的空白: 2.单据体跟单尾连在一起,单尾后面的空白篇幅太大: 以上这两 ...
- oracle取随机数,取固定行数的数
首先建一张测试表: create table DIM_IA_TEST5 ( NAME ), OTHERNAME ), NUM NUMBER, TIMES NUMBER ) 然后插入数据,现在的表数据为 ...
- Oracle 行转列(不固定行数的行转列,动态)(转)
http://bbs.csdn.net/topics/330039676 SQLSERVER :行列转换例子: http://www.cnblogs.com/gaizai/p/3753296.htm ...
- 纯css实现不固定行数的文本在一个容器内垂直居中
项目中要实现的效果如图: html代码 及 css代码: <!DOCTYPE html> <html> <head> <meta charset=" ...
- python pandas使用chunksize异步拆分固定行数的文件
import pandas as pd import asyncio from collections import defaultdict collect = defaultdict(list) # ...
- Android studio如何显示代码行数
1.首先打开as:File-->Settings... 2.Editor-->General-->Appearence 3.右边show line numbers 4.依次点击app ...
- Android中获取TextView行数
项目中发现,如果直接通过TextView.getLineCount()方法获取行数时,总是0,研究发现,setText()后立即调用getLineCount(), 这时TextView还未完成meas ...
随机推荐
- 3/21 Django框架 模板路径及模板过滤器 1.模板路径查找
3/21 Django框架 模板路径及模板过滤器 1.模板路径查找 先找settings.py里的TEMPLATES列表下的DIRS路径.如果APP_DIRS为True,还会到注册了的APP文件夹下依 ...
- itchat转发指定的微信群里某个用户的发言到指定的群
复读机功能, 如果有比较多的用户,超出500人,那就得分开至少两个群,如何把一些消息自动复制到另一个群呢. 自动转发指定用户的发言,转发到别的群 # !/usr/bin/env python # -* ...
- 洛谷——P1101 单词方阵
https://www.luogu.org/problem/show?pid=1101#sub 题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放 ...
- 解决XCODE配置LLVM环境出现的问题
问题描写叙述:在LLVM整合进XCODE的过程中出现符号没有定义导致出现未决函数或方法.但使用终端编译链接生成程序没有问题. 问题产生原因:未引用响应的LLVM库与系统库,以及编译器设置.连接器设置不 ...
- setInterval()第一个参数带引号和不带引号的区别
setInterval()第一个参数带引号和不带引号的区别:关于定时函数setInterval()的基本用法这里就不做介绍了,查阅相关教程即可,这里主要介绍一下setInterval()函数的第一个参 ...
- JS/CSS 全屏幕导航 – 从上到下动画
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- Mongodb总结3-稍微封装一下
上次发表的2,纯粹是Demo,演示API的用法. 今天,稍微封装了下,看得更清楚. 考虑到不容易做得很有通用性,所以封装的一般,换种场景需要直接修改代码,但是有一部分是可以复用的. 最近项目,很可能只 ...
- 洛谷 P2755 洗牌问题
P2755 洗牌问题 题目描述 给你2N张牌,编号为1,2,3..n,n+1,..2n.这也是最初的牌的顺序. 一次洗牌是把序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n.可以证 ...
- Android利用FTP实现与PC的上传和下载,实现二维码扫描下载
之前给老板所带的本科生课程实验所写的代码,拿出来分享一下. 下载地址: https://github.com/smartshuai/ConnectHelper.git
- 怎样在一个fragment or 随意类中操作还有一个fragment中的方法
1 怎样在acitivty中运行fragment中的方法: 首先获得这个Fragment的对象 xxxFragment fragmentObject = (xxxFragment) getFragme ...