效果如图

当单个view超出屏幕宽度后截取部分,textview则显示省略号

代码

WordWrapView代码:

public class WordWrapView extends ViewGroup {private static final int PADDING_HOR = 10;//子view水平方向paddingprivate static final int PADDING_VERTICAL = 10;//子view垂直方向paddingprivate static final int TEXT_MARGIN_HOR = 20;//子view之间的水平间距private static final int TEXT_MARGIN_VERTICAL = 20;//行间距private int num = 0;//最多字个数/*** @param context*/public WordWrapView(Context context) {super(context);}/*** @param context* @param attrs* @param defStyle*/public WordWrapView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}/*** @param context* @param attrs*/public WordWrapView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {int childCount = getChildCount();int autualWidth = r - l;//当前容器宽度int x = 0;// 横坐标开始int y = 0;//纵坐标开始int rows = 1;for (int i = 0; i < childCount; i++) {View view = getChildAt(i);int width = view.getMeasuredWidth();int height = view.getMeasuredHeight();x += width + TEXT_MARGIN_HOR;if (x > autualWidth - TEXT_MARGIN_HOR) {//判断累积高度if (i != 0) {x = width + TEXT_MARGIN_HOR;rows++;}//当一个子view长度超出父view长度时if (x > autualWidth - TEXT_MARGIN_HOR) {//判断单个高度//如果子view是textview的话处理文字if (view instanceof TextView) {TextView tv = ((TextView) view);if (num == 0) {//只计算一次int wordNum = tv.getText().toString().length();num = wordNum * (autualWidth - 2 * TEXT_MARGIN_HOR) / width - 1;}String text = tv.getText().toString();text = text.substring(0, num) + "...";tv.setText(text);}x = autualWidth - TEXT_MARGIN_HOR;width = autualWidth - (2 * TEXT_MARGIN_HOR);}}y = rows * (height + TEXT_MARGIN_VERTICAL);view.layout(x - width, y - height, x, y);}}public float getCharacterWidth(String text, float size) {if (null == text || "".equals(text))return 0;float width = 0;Paint paint = new Paint();paint.setTextSize(size);float text_width = paint.measureText(text);// 得到总体长度width = text_width / text.length();// 每一个字符的长度return width;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int x = 0;//横坐标int y = 0;//纵坐标int rows = 1;//总行数int specWidth = MeasureSpec.getSize(widthMeasureSpec);int actualWidth = specWidth;//实际宽度int childCount = getChildCount();for (int index = 0; index < childCount; index++) {View child = getChildAt(index);child.setPadding(PADDING_HOR, PADDING_VERTICAL, PADDING_HOR, PADDING_VERTICAL);child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);int width = child.getMeasuredWidth();int height = child.getMeasuredHeight();x += width + TEXT_MARGIN_HOR;if (x > actualWidth - TEXT_MARGIN_HOR) {//换行if (index != 0) {x = width + TEXT_MARGIN_HOR;rows++;}}y = rows * (height + TEXT_MARGIN_VERTICAL);}setMeasuredDimension(actualWidth, y + TEXT_MARGIN_VERTICAL);}
}

调用:

public class MainActivity extends AppCompatActivity {private WordWrapView wordWrapView;String[] word = {"大叔大婶", "的点点滴滴多多多多", "打赏", "大叔大", "打扫的", "大大大啊", "sas撒飒飒", "打撒所多所所多", "打死打死打死打死", "4545sd5s45s4d5sd", "qqqqqq", "啊飒飒"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wordWrapView = ((WordWrapView) findViewById(R.id.wordwrap));for (int i = 0; i < word.length; i++) {final TextView textview = new TextView(getApplicationContext());textview.setBackgroundColor(Color.parseColor("#a0a0a0"));textview.setTextSize(14);textview.setText(word[i]);final int finalI = i;textview.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), word[finalI], Toast.LENGTH_SHORT).show();}});wordWrapView.addView(textview);}}
}

布局:

<test.hhx.com.wordwrapdemo.WordWrapViewandroid:id="@+id/wordwrap"android:layout_width="match_parent"android:layout_height="wrap_content" />

Demo下载地址

Android实现View排列自动换行相关推荐

  1. Android 自定义View

    [Android 自定义View] Android 自定义View 自定义View基础 自定义TextView 继承View重写onDraw方法 View的构造方法 自定义属性 创建attrsxml文 ...

  2. android多行文字正中间显示,Android自定义View五(绘制文本大小、多行多列居中)...

    一.绘制文本 在Canvas中绘制文本,使用前面文章的坐标系 1.drawText的几种方法 public void drawText (String text, float x, float y, ...

  3. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  4. Android自定义View精品(LimitScrollerView-仿天猫广告栏上下滚动效果)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.分析 2.定义组合控件布局 3.继承最外层控件 4.自定义属性 5.重写onMeasure 6 ...

  5. Android自定义View,你必须知道的几点

    为什么我们觉得自定义View是学习Android的一道坎? 为什么那么多Android大神却认为自定义View又是如此的简单? 为什么google随便定义一个View都是上千行的代码? 以上这些问题, ...

  6. Android自定义View注意事项

    Android自定义View系列 Android自定义View之Paint绘制文字和线 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义V ...

  7. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  8. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  9. Android之View绘制流程源码分析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于稍有自定义View经验的安卓开发者来说,onMeasure,onLayout,onDraw这三个方法都不会陌生,起码多少都有所接触吧. 在安卓中 ...

最新文章

  1. zabbix 客户端安装
  2. BSCI—9:配置OSPF认证
  3. 利用Matlab优化工具箱解数独问题
  4. Execl导入问题之文本转换
  5. 如何理解 Linux 中的 load averages
  6. matlab热度图确定色标_C++实现类似Matlab的colormap Jet(灰度图生成彩色热度图)
  7. Spring Boot文档阅读笔记-对Messaging with RabbitMQ解析
  8. Matlab--获取300dpi或600dpi图形插入word2010中
  9. seL4操作系统基础05:event interface与seL4Notification connector
  10. 01. 慎重选择容器类型
  11. 爆竹声中一岁除,春风送暖入屠苏
  12. 深入理解java的异常处理机制
  13. 七周成为数据分析师(秦路)-第一周-数据分析思维
  14. python-爬取东方财富网期货市场大商所数据
  15. 【K-近邻】K-NN 实战分析 Facebook V Results: Predicting Check Ins
  16. 图解Redis中的9种数据结构(高级面试,必备)
  17. 如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)
  18. 制图操作案例:在Pro画水墨画
  19. QQ 键盘加密保护分析
  20. Win7如何打开软键盘?Win7打开软键盘的方法

热门文章

  1. 2021-09-13-域名和IP相互转换
  2. python任务计划 0x1_从任务调度器执行python脚本时出现0x1错误(Windows 10)
  3. 开工了,给大家送一个新款iPad!
  4. 2013年5月18日北京园博园之旅
  5. java中的多态是什么_java中多态是什么意思?
  6. 三年级下册语文计算机之父教案,三年级下册教案(二)《和时间赛跑 24.计算机之父的童年故事》 教案教学设计...
  7. 【2020祥云杯】misc-到点了
  8. Problem B: 第K位数字
  9. iHover鼠标悬停效果包推荐
  10. 从内部失衡到外部失衡-中国视角下的宏观经济