android开发步步为营之106:TextView,EditText要求固定行数自动调整TextSize
来源:互联网 发布:金百福珠宝软件是什么 编辑:程序博客网 时间:2024/05/16 18:49
最近项目有个需求要求文本最多显示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 = 50; int lineCount = 0; int lastTextLength = 0; boolean isMinus = false; int maxTextSize = 50; int minTextSize = 6; 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(600); 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 > 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开发步步为营之106:TextView,EditText要求固定行数自动调整TextSize
- android开发步步为营之91:自定义AlertDialog
- android开发步步为营之107:android studio使用技巧之二(自动导入包和好用的插件介绍)
- Android Edittext自动换行及限制行数
- Android应用开发之UI组件(TextView;EditText)
- Android TextView TextSize适配问题
- Android TextView 属性 textsize 的单位是什么?
- android开发步步为营之88:基于LruCache和AsyncTask的网络相册开发
- android开发步步为营之96:android两种常用截图技术
- Android textview自适应宽度自动调整字体大小
- android开发步步为营之95:自定义dialog去掉白色边框
- android开发步步为营之99:使用自定义字体
- android开发步步为营之108:下载断点续传
- android开发步步为营之94:使用PathEffect画虚线和虚线框
- android开发步步为营之105:解决键盘弹起页面被顶上去问题
- android开发步步为营之86:关于对阿拉伯语页面文字从右往左的支持
- android开发步步为营之87:从sdcard或者data文件夹下读写数据
- android开发步步为营之104:文字加阴影效果和描边效果的实现
- 如何在窗口模式下演示ppt
- Android day7
- 打包时Fragment需要注意的一些问题
- JavaScript强化教程-动态实现创建row行col列的表格
- Android 点击空白页关闭软键盘
- android开发步步为营之106:TextView,EditText要求固定行数自动调整TextSize
- Boost 库 enable_shared_from_this 实现原理分析
- sqoop把mysql导入hive时报错:Could not load org.apache.hadoop.hive.conf.HiveConf.
- java对接mysql数据库
- nohup 和 &
- makefile 编译可执行文件
- Android Annotation框架初步实践
- ubuntu下的android studio jni生成c++动态库的调用方法及排错(ndk生成的动态库调用)
- 嵌入式系统中的目标识别技术