`
艳过留痕
  • 浏览: 40381 次
社区版块
存档分类

关于Android的文字排版和换行问题,彻底解决

 
阅读更多

package com.text.view;

import java.util.Arrays;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

public class MyView extends View {
 private Paint mPaint = new Paint();

 public MyView(Context context) {
  this(context,null);
 }

 
 public MyView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init();
 }

 public MyView(Context context, AttributeSet attrs) {
  this(context,attrs,0);
 }

 private void init() {
  mPaint.setAntiAlias(true);
  mPaint.setColor(Color.BLACK); 
  mPaint.setStyle(Style.STROKE);
  mPaint.setTextSize(getRawSize(TypedValue.COMPLEX_UNIT_DIP, 12));
  
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//  setMeasuredDimension(300, 200);
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  //canvas.drawColor(Color.WHITE);
  
  FontMetrics fm = mPaint.getFontMetrics();
  
  float baseline = fm.descent - fm.ascent; 
  float x = 0;
  float y =  baseline;

//注释掉的是当使用多段TextView时使用
  String txt1 = getResources().getString(com.middle.sport.R.string.more1);
  //String txt2 = getResources().getString(com.middle.sport.R.string.more2);
  //String txt3 = getResources().getString(com.middle.sport.R.string.more3);
  
  String[] text1s = autoSplit(txt1, mPaint, getWidth() - 15);
  //String[] text2s = autoSplit(txt2, mPaint, getWidth() - 15);
  //String[] text3s = autoSplit(txt3, mPaint, getWidth() - 15);
  
  System.out.printf("line indexs: %s\n", Arrays.toString(text1s));
  //System.out.printf("line indexs: %s\n", Arrays.toString(text2s));
  //System.out.printf("line indexs: %s\n", Arrays.toString(text3s));
  
  for(String text1 : text1s) { 
   canvas.drawText(text1, x, y, mPaint); 
   y += baseline + fm.leading; 
  }
     /* y += 20;
  for(String text2 : text2s) { 
   canvas.drawText(text2, x, y, mPaint); 
   y += baseline + fm.leading; 
  }
      y += 20;
  for(String text3 : text3s) { 
   canvas.drawText(text3, x, y, mPaint); 
   y += baseline + fm.leading; 
  }*/
 }
 private String[] autoSplit(String content, Paint p, float width) {
  int length = content.length();
  float textWidth = p.measureText(content);
  if(textWidth <= width) {
   return new String[]{content};
  }
  
  int start = 0, end = 1, i = 0;
  int lines = (int) Math.ceil(textWidth / width); 
  String[] lineTexts = new String[lines];
  while(start < length) {
   if(p.measureText(content, start, end) > width) {
    lineTexts[i++] = (String) content.subSequence(start, end);
    start = end;
   }
   if(end == length) { 
    lineTexts[i] = (String) content.subSequence(start, end);
    break;
   }
   end += 1;
  }
  return lineTexts;
 }
 public float getRawSize(int unit, float size) {
        Context c = getContext();
        Resources r;

        if (c == null)
            r = Resources.getSystem();
        else
            r = c.getResources();
        
        return TypedValue.applyDimension(unit, size, r.getDisplayMetrics());
    }
}

分享到:
评论

相关推荐

    自定义view解决android文本排版和换行问题

    自定义view解决android文本排版和换行问题自定义view解决android文本排版和换行问题自定义view解决android文本排版和换行问题自定义view解决android文本排版和换行问题自定义view解决android文本排版和换行问题...

    android textview 文字排版 换行

    本文将深入探讨`TextView`在处理文字排版和换行方面的知识,以及如何优化其性能。 ### 一、TextView的基础用法 1. **XML布局中声明TextView** 在布局文件中,我们通常通过以下方式声明一个`TextView`: ```xml ...

    Android开发TextView排版问题取消自动换行

    本文将详细讲解如何解决TextView的自动换行问题,并结合提供的`CustomTextView.java`源码和`textattr.xml`资源文件来深入理解这一技术。 首先,了解TextView的基本属性。TextView默认会根据其宽度自动进行换行,以...

    MTextView,解决Android TextView提前换行的问题

    MTextView是针对原生Android TextView进行优化的一个类,它专门处理了提前换行的问题,尤其是在处理含有图片、特殊符号或复杂排版的文本时。这个自定义视图通常会提供更精确的文本测量和布局计算方法,以确保文字...

    Android-TextView换行排版混乱-允许设置SpannableString

    在`MyTextView2`这个文件中,可能是作者提供了一个自定义的`TextView`类,扩展了标准的`TextView`功能,解决了自动换行和`SpannableString`的排版问题。这样的自定义`TextView`可能会覆盖`onDraw()`方法,或者提供...

    自定义TextView解决文字排版混乱方法

    android开发中的textview可以自动换行,但是对于显示纯英文文字来说很好用,如果夹杂了中文字符后,全角字符和半角字符混在一块儿,就会出现文字排版参差不齐,超级难看,这就需要重写textview来实现我们需要的显示...

    Android TextView 换行不对齐的问题

    然而,有时开发者会遇到一个棘手的问题,即`TextView`中的换行文字可能不会对齐,尤其是在多行显示时。这个问题通常表现为每一行的起始位置不一致,影响了整体布局的美观度。本文将深入探讨这个问题及其解决方案。 ...

    浅谈Android textview文字对齐换行的问题

    "浅谈Android textview文字对齐换行的问题" Android TextView 文字对齐换行的问题是一个常见的Android开发问题。...通过这两种方法,可以解决TextView 中文字对齐换行的问题,实现文字排版的整齐性和美观性。

    解决 TextView 中文、英文、数字、符号 排版问题

    总的来说,解决TextView的排版问题需要对Android的文本渲染机制有深入的理解,并灵活运用各种属性和工具。在项目中,应根据具体需求选择最合适的方法,以实现美观且易读的文本展示。`AlignTextView-master`可能提供...

    Android动态文字排版

    在Android开发中,动态文字排版是一个常见...以上就是关于“Android动态文字排版”的详细介绍,希望对你在Android开发中实现类似功能有所帮助。记得在实际项目中考虑性能优化和用户体验,使得排版切换过程平滑且高效。

    Android AutoWrapTextView中英文排版问题的解决方法

    总之,Android AutoWrapTextView的实现涉及到自定义视图的绘制、属性解析、文本处理等多个方面,它通过自定义的绘制逻辑解决了中英文排版问题,提供了更加美观和统一的显示效果。这种自定义组件的开发对于优化用户...

    Android文字竖直排版TextViewVertical(可横向滚动)(转)

    `TextViewVertical`是一个针对特定需求的自定义组件,它扩展了Android的`TextView`功能,实现了竖直文字排列和横向滚动,对于开发者来说,研究和掌握此类组件的实现,不仅有助于解决实际问题,也能加深对Android UI...

    解决DrawText中文字与字母之间自动换行

    总之,“解决DrawText中文字与字母之间自动换行”的核心在于理解和适配不同字符类型的排版规则,通过适当的算法和数据结构优化,可以在保持代码清晰的同时提高文本布局的效率和准确性。这不仅是Windows编程中的一个...

    vb.net 图片文字自动换行打印预览

    这个功能主要用于在打印文档时,不仅能够处理文本的自动换行以适应页面布局,还能结合图片进行混合排版,并且提供预览功能以便用户在正式打印前检查效果。以下将详细阐述这些知识点: 1. 图片处理: - `System....

    解决Itext生成PDF中文不换行的jar

    然而,在处理中文文本时,可能会遇到一个问题:中文字符不换行,这会给PDF的排版带来困扰。本篇文章将详细探讨这个问题以及如何解决。 首先,我们需要理解Itext库的工作原理。Itext库基于PDF规范,它提供了丰富的...

    英文自动换行怎样解决

    本文将探讨如何有效地实现英文自动换行,并通过CSS属性如`word-wrap`和`word-break`来解决这一问题。 #### 二、CSS中的换行控制属性 在CSS中,有几种属性可以用来控制文本的换行行为,包括`word-wrap`和`word-...

    android 动态文字排版 GridView与ArrayAdapter设计

    总之,`GridView`和`ArrayAdapter`是Android开发中的重要组件,通过它们,你可以轻松实现动态文字排版或其他复杂的数据展示。理解它们的工作原理,并熟练运用,将大大提高你的应用界面设计能力。在实际开发中,不断...

    StartUML 5.1.0的app.asar,解决了中日韩文本的自动换行问题

    该app.asar适用于StartUML 5.1.0,解决了中日韩文本的自动换行问题,也解决了文本的排版问题,保留原始文本中的空格数量,不把多个空格压缩为一个。 另外,规避显示时空行被删除的技巧:在空行中加入一个空格,避免...

    td 内容自动换行 table表格td设置宽度后文字太多自动换行

    在网页设计和排版的过程中,表格(table)是常用于数据展示和布局控制的一种HTML元素。在使用table展示内容时,经常会出现内容过长超出了单元格(td)的宽度,导致无法完整展示全部内容的情况。传统的table布局常常...

    Android中多行文本末尾添加图片排版问题的解决方法

    Android中多行文本末尾添加图片排版问题的解决方法需要理解TextView的绘制机制和SpannableString的使用,使用ImageSpan和SpannableString可以将图片放置在最后一行,并使用计算每一行能够容纳的字符个数来解决换行...

Global site tag (gtag.js) - Google Analytics