canvas教程

Android文本排版实现(5)

字号+ 作者:H5之家 来源:H5之家 2016-07-23 16:00 我要评论( )

改方案也需要先计算左边的最大占用宽度,来设置右边占用的大小,每一项的布局如下: ?xml version="1.0" encoding="utf-8"? LinearLayout === ".activity.Typography1Activity" TextView == "@color/color_black_99

       改方案也需要先计算左边的最大占用宽度,来设置右边占用的大小,每一项的布局如下:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout ===".activity.Typography1Activity"> <TextView =="@color/color_black_999999" android:textSize="@dimen/text_size_13"/> <TextView ==>

       每一行有两个TextView,左边宽度为自适应,右边占据剩下左右的位置,在计算出左边最大宽度后,重新设置左边每一个TextView占用的宽度。

方案6

       方式与1差不多,但是不在继承TextView,而是直接继承View:

{ private Paint leftPaint = new Paint(); private Paint rightPaint = new Paint(); private int fullWidth; private float textSize; private JSONArray array; private int middlePadding = 0; float maxLeftWidth = 0; int itemSize = 0; public TypographyView4(Context context) { super(context); init(); } public TypographyView4(Context context, AttributeSet attrs) { super(context, attrs); init(); } public TypographyView4(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } () { textSize = getResources().getDimensionPixelSize(R.dimen.text_size_13); leftPaint.setAntiAlias(true); leftPaint.setTextSize(textSize); leftPaint.setColor(getResources().getColor(R.color.color_black_999999)); rightPaint.setAntiAlias(true); rightPaint.setTextSize(textSize); rightPaint.setColor(getResources().getColor(R.color.color_black)); middlePadding = getResources().getDimensionPixelSize(R.dimen.padding_value); } (int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); fullWidth = getWidth();// 整个textView的宽度 } (JSONArray array) { this.array = array; if (array != null) { try { int size = itemSize = array.length(); for (int i = 0; i < size; ++i) { JSONArray o = (JSONArray) array.get(i); String key = o.getString(0); String value = o.getString(1); if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) { itemSize--; continue; } float curWidth = leftPaint.measureText(key); if (curWidth > maxLeftWidth) { maxLeftWidth = curWidth; } } maxLeftWidth = maxLeftWidth + middlePadding; invalidate(); } catch (Exception e) { } } } (Canvas canvas) { if (array == null) { return; } int lineCount = 0; try { JSONArray item; float offsetY; for (int i = 0; i < itemSize; ++i) { item = (JSONArray) array.get(i); offsetY = (lineCount + 1) * textSize; canvas.drawText(item.getString(0), 0, offsetY, leftPaint); String value = item.getString(1); float valueWidth = rightPaint.measureText(value); if (valueWidth > fullWidth - maxLeftWidth) {// 一行显示不完 char[] textCharArray = value.toCharArray(); float charWidth; float drawWidth = maxLeftWidth; for (int j = 0; j < textCharArray.length; j++) { charWidth = rightPaint.measureText(textCharArray, j, 1); if (fullWidth - drawWidth < charWidth) { lineCount++; drawWidth = maxLeftWidth; offsetY += textSize; } canvas.drawText(textCharArray, j, 1, drawWidth, offsetY, rightPaint); drawWidth += charWidth; } } else { canvas.drawText(value, maxLeftWidth, offsetY, rightPaint); } lineCount += 2; } } catch (JSONException e) { e.printStackTrace(); } } }

       该方案主要继承自View,不再继承TextView,由于在在上述方案中不在调用super,因此TextView已经退化为一个View,因此直接继承View。

总结

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Canvas与ValueAnimator

    Canvas与ValueAnimator

    2017-04-28 18:00

  • Android Bitmap和Canvas学习笔记(转)

    Android Bitmap和Canvas学习笔记(转)

    2017-04-28 17:00

  • 21天学习android开发教程之SurfaceView与多线程的混搭

    21天学习android开发教程之SurfaceView与多线程的混搭

    2017-04-27 12:00

  • Android画图学习免费下载

    Android画图学习免费下载

    2017-04-27 11:01

网友点评