自定义View控件解决android文字排版和换行的问题

这篇博客主要介绍了如何通过自定义View控件来解决Android应用中文字排版和换行的难题,适合对Android开发感兴趣的读者。文中以通俗易懂的方式,结合实例进行讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

                import java.util.Vector;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;import android.util.AttributeSet;import android.view.View;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.TextView;public class MyView extends TextView {private final String namespace="http://www.nearmobile.net";private int resourceId=0;/* 声明Paint对象 */private Paint mPaint = null;/* 声明TextUtil对象 */private TextUtil mTextUtil = null;public  static  int m_iTextHeight;private WindowManager wm=null;private String string="";    public MyView(Context context, AttributeSet set) {        super(context,set);                resourceId=set.getAttributeResourceValue(namespace, "text", 0);                 if(resourceId==0)          string=set.getAttributeValue(null,"text");         else          string=this.getResources().getString(resourceId);          wm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);        /* 构建对象 */        m_iTextHeight=2000;  mPaint = new Paint();  mPaint.setColor(Color.RED);  mPaint.setStrokeWidth(40);  mPaint.setTextSize(20);      int m_iTextWidth=wm.getDefaultDisplay().getWidth();  FontMetrics fm = mPaint.getFontMetrics();    int m_iFontHeight = (int) Math.ceil(fm.descent - fm.top) + 4;  int line=0;  int istart=0;  int w=0;  for (int i = 0; i < string.length(); i++)  {   char ch = string.charAt(i);   float[] widths = new float[1];   String srt = String.valueOf(ch);   mPaint.getTextWidths(srt, widths);   if (ch == '/n')   {    line++;    istart = i + 1;    w = 0;   }   else   {    w += (int) (Math.ceil(widths[0]));    if (w > m_iTextWidth)    {     line++;     istart = i;     i--;     w = 0;    }    else    {     if (i == (string.length() - 1))     {      line++;     }    }   }  }  m_iTextHeight=(line+2)*m_iFontHeight+2;  //用反射机制得到     m_iTextHeight  值  /*  实例化TextUtil   mTextUtil = new TextUtil(string,5,25,wm.getDefaultDisplay().getWidth(),this.getHeight(),0x0,0xffffff,255,15);     初始化TextUtil   mTextUtil.InitText(string,5,25,wm.getDefaultDisplay().getWidth(),wm.getDefaultDisplay().getHeight(),0x0,0xffffff,255,15);*/    }                     @Override    protected void onDraw(Canvas canvas) {              super.onDraw(canvas);       /* 设置背景颜色 */    canvas.drawColor(Color.BLACK);        mPaint.setAntiAlias(true);       char ch;  int w = 0;  int istart = 0;  int m_iFontHeight;  int m_iRealLine=0;  int x=2;  int y=60;  Vector m_String=new Vector();  int m_iTextWidth=wm.getDefaultDisplay().getWidth();  FontMetrics fm = mPaint.getFontMetrics();    m_iFontHeight = (int) Math.ceil(fm.descent - fm.top) + 4;  //m_ipageLineNum = m_iTextHeight / m_iFontHeight;  for (int i = 0; i < string.length(); i++)  {   ch = string.charAt(i);   float[] widths = new float[1];   String srt = String.valueOf(ch);   mPaint.getTextWidths(srt, widths);   if (ch == '/n')   {    m_iRealLine++;    m_String.addElement(string.substring(istart, i));    istart = i + 1;    w = 0;   }   else   {    w += (int) (Math.ceil(widths[0]));    if (w > m_iTextWidth)    {     m_iRealLine++;     m_String.addElement(string.substring(istart, i));     istart = i;     i--;     w = 0;    }    else    {     if (i == (string.length() - 1))     {      m_iRealLine++;      m_String.addElement(string.substring(istart, string.length()));     }    }   }  }  m_iTextHeight=m_iRealLine*m_iFontHeight+2;  System.out.println("m_iTextHeight----->"+m_iTextHeight);  canvas.setViewport(m_iTextWidth, m_iTextWidth);  for (int i = 0, j = 0; i < m_iRealLine; i++, j++)  {   canvas.drawText((String) (m_String.elementAt(i)), x,  y+m_iFontHeight * j, mPaint);  }    }             protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {            int measuredHeight = measureHeight(heightMeasureSpec);              int measuredWidth = measureWidth(widthMeasureSpec);               this.setMeasuredDimension(measuredWidth, measuredHeight);       this.setLayoutParams(new LinearLayout.LayoutParams(measuredWidth,measuredHeight));       super.onMeasure(widthMeasureSpec, heightMeasureSpec);     }                             private int measureHeight(int measureSpec) {              int specMode = MeasureSpec.getMode(measureSpec);              int specSize = MeasureSpec.getSize(measureSpec);                             // Default size if no limits are specified.              int result = m_iTextHeight;              if (specMode == MeasureSpec.AT_MOST)               {              // Calculate the ideal size of your              // control within this maximum size.              // If your control fills the available              // space return the outer bound.              result = specSize;              }               else if (specMode == MeasureSpec.EXACTLY)               {              // If your control can fit within these bounds return that value.              result = specSize;              }              return result;              }                             private int measureWidth(int measureSpec) {              int specMode = MeasureSpec.getMode(measureSpec);              int specSize = MeasureSpec.getSize(measureSpec);                             // Default size if no limits are specified.              int result = 500;              if (specMode == MeasureSpec.AT_MOST)             {              // Calculate the ideal size of your control              // within this maximum size.               // If your control fills the available space              // return the outer bound.              result = specSize;             }               else if (specMode == MeasureSpec.EXACTLY)               {              // If your control can fit within these bounds return that value.              result = specSize;              }              return result;              }}           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值