android.text.TextPaint#getTextWidths ( )源码实例Demo

下面列出了android.text.TextPaint#getTextWidths ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: openboard   文件: SuggestionStripLayoutHelper.java
private static int getTextWidth(@Nullable final CharSequence text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0;
    }
    final int length = text.length();
    final float[] widths = new float[length];
    final int count;
    final Typeface savedTypeface = paint.getTypeface();
    try {
        paint.setTypeface(getTextTypeface(text));
        count = paint.getTextWidths(text, 0, length, widths);
    } finally {
        paint.setTypeface(savedTypeface);
    }
    int width = 0;
    for (int i = 0; i < count; i++) {
        width += Math.round(widths[i] + 0.5f);
    }
    return width;
}
 
private static int getTextWidth(@Nullable final CharSequence text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0;
    }
    final int length = text.length();
    final float[] widths = new float[length];
    final int count;
    final Typeface savedTypeface = paint.getTypeface();
    try {
        paint.setTypeface(getTextTypeface(text));
        count = paint.getTextWidths(text, 0, length, widths);
    } finally {
        paint.setTypeface(savedTypeface);
    }
    int width = 0;
    for (int i = 0; i < count; i++) {
        width += Math.round(widths[i] + 0.5f);
    }
    return width;
}
 
private static int getTextWidth(@Nullable final CharSequence text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0;
    }
    final int length = text.length();
    final float[] widths = new float[length];
    final int count;
    final Typeface savedTypeface = paint.getTypeface();
    try {
        paint.setTypeface(getTextTypeface(text));
        count = paint.getTextWidths(text, 0, length, widths);
    } finally {
        paint.setTypeface(savedTypeface);
    }
    int width = 0;
    for (int i = 0; i < count; i++) {
        width += Math.round(widths[i] + 0.5f);
    }
    return width;
}
 
源代码4 项目: openboard   文件: KeyPreviewView.java
private static float getTextWidth(final String text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0.0f;
    }
    final int len = text.length();
    final float[] widths = new float[len];
    final int count = paint.getTextWidths(text, 0, len, widths);
    float width = 0;
    for (int i = 0; i < count; i++) {
        width += widths[i];
    }
    return width;
}
 
private static float getTextWidth(final String text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0.0f;
    }
    final int len = text.length();
    final float[] widths = new float[len];
    final int count = paint.getTextWidths(text, 0, len, widths);
    float width = 0;
    for (int i = 0; i < count; i++) {
        width += widths[i];
    }
    return width;
}
 
源代码6 项目: PowerFileExplorer   文件: Styled.java
/**
     * Returns the advance widths for a uniform left-to-right run of text with
     * no style changes in the middle of the run. If any style is replacement
     * text, the first character will get the width of the replacement and the
     * remaining characters will get a width of 0.
     * 
     * @param paint the paint, will not be modified
     * @param workPaint a paint to modify; on return will reflect the original
     *        paint plus the effect of all spans on the run
     * @param text the text
     * @param start the start of the run
     * @param end the limit of the run
     * @param widths array to receive the advance widths of the characters. Must
     *        be at least a large as (end - start).
     * @param fmi FontMetrics information; can be null
     * @return the actual number of widths returned
     */
    public static int getTextWidths(TextPaint paint,
                                    TextPaint workPaint,
                                    Spanned text, int start, int end,
                                    float[] widths, Paint.FontMetricsInt fmi) {
// Jota Text Editor
//        MetricAffectingSpan[] spans =
//            text.getSpans(start, end, MetricAffectingSpan.class);
//
//		ReplacementSpan replacement = null;
        workPaint.set(paint);
//
//		for (int i = 0; i < spans.length; i++) {
//			MetricAffectingSpan span = spans[i];
//			if (span instanceof ReplacementSpan) {
//				replacement = (ReplacementSpan)span;
//			}
//			else {
//				span.updateMeasureState(workPaint);
//			}
//		}
//
//        if (replacement == null) {
            workPaint.getFontMetricsInt(fmi);
            workPaint.getTextWidths(text, start, end, widths);
//        } else {
//            int wid = replacement.getSize(workPaint, text, start, end, fmi);
//
//            if (end > start) {
//                widths[0] = wid;
//                for (int i = start + 1; i < end; i++)
//                    widths[i - start] = 0;
//            }
//        }
        return end - start;
    }
 
源代码7 项目: simple-keyboard   文件: KeyPreviewView.java
private static float getTextWidth(final String text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0.0f;
    }
    final int len = text.length();
    final float[] widths = new float[len];
    final int count = paint.getTextWidths(text, 0, len, widths);
    float width = 0;
    for (int i = 0; i < count; i++) {
        width += widths[i];
    }
    return width;
}
 
源代码8 项目: AOSP-Kayboard-7.1.2   文件: KeyPreviewView.java
private static float getTextWidth(final String text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0.0f;
    }
    final int len = text.length();
    final float[] widths = new float[len];
    final int count = paint.getTextWidths(text, 0, len, widths);
    float width = 0;
    for (int i = 0; i < count; i++) {
        width += widths[i];
    }
    return width;
}
 
源代码9 项目: JotaTextEditor   文件: Styled.java
/**
     * Returns the advance widths for a uniform left-to-right run of text with
     * no style changes in the middle of the run. If any style is replacement
     * text, the first character will get the width of the replacement and the
     * remaining characters will get a width of 0.
     * 
     * @param paint the paint, will not be modified
     * @param workPaint a paint to modify; on return will reflect the original
     *        paint plus the effect of all spans on the run
     * @param text the text
     * @param start the start of the run
     * @param end the limit of the run
     * @param widths array to receive the advance widths of the characters. Must
     *        be at least a large as (end - start).
     * @param fmi FontMetrics information; can be null
     * @return the actual number of widths returned
     */
    public static int getTextWidths(TextPaint paint,
                                    TextPaint workPaint,
                                    Spanned text, int start, int end,
                                    float[] widths, Paint.FontMetricsInt fmi) {
// Jota Text Editor
//        MetricAffectingSpan[] spans =
//            text.getSpans(start, end, MetricAffectingSpan.class);
//
//		ReplacementSpan replacement = null;
        workPaint.set(paint);
//
//		for (int i = 0; i < spans.length; i++) {
//			MetricAffectingSpan span = spans[i];
//			if (span instanceof ReplacementSpan) {
//				replacement = (ReplacementSpan)span;
//			}
//			else {
//				span.updateMeasureState(workPaint);
//			}
//		}
//
//        if (replacement == null) {
            workPaint.getFontMetricsInt(fmi);
            workPaint.getTextWidths(text, start, end, widths);
//        } else {
//            int wid = replacement.getSize(workPaint, text, start, end, fmi);
//
//            if (end > start) {
//                widths[0] = wid;
//                for (int i = start + 1; i < end; i++)
//                    widths[i - start] = 0;
//            }
//        }
        return end - start;
    }
 
源代码10 项目: Indic-Keyboard   文件: KeyPreviewView.java
private static float getTextWidth(final String text, final TextPaint paint) {
    if (TextUtils.isEmpty(text)) {
        return 0.0f;
    }
    final int len = text.length();
    final float[] widths = new float[len];
    final int count = paint.getTextWidths(text, 0, len, widths);
    float width = 0;
    for (int i = 0; i < count; i++) {
        width += widths[i];
    }
    return width;
}
 
源代码11 项目: ChipsLibrary   文件: RecipientEditTextView.java
private Bitmap createSelectedChip(final RecipientEntry contact,final TextPaint paint)
{
// Ellipsize the text so that it takes AT MOST the entire width of the
// autocomplete text entry area. Make sure to leave space for padding
// on the sides.
final int height=(int)mChipHeight;
final int deleteWidth=height;
final float[] widths=new float[1];
paint.getTextWidths(" ",widths);
final String createChipDisplayText=createChipDisplayText(contact);
final float calculateAvailableWidth=calculateAvailableWidth();
final CharSequence ellipsizedText=ellipsizeText(createChipDisplayText,paint,calculateAvailableWidth-deleteWidth-widths[0]);
// Make sure there is a minimum chip width so the user can ALWAYS
// tap a chip without difficulty.
final int width=Math.max(deleteWidth*2,(int)Math.floor(paint.measureText(ellipsizedText,0,ellipsizedText.length()))+mChipPadding*2+deleteWidth);
// Create the background of the chip.
final Bitmap tmpBitmap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
final Canvas canvas=new Canvas(tmpBitmap);
if(mChipBackgroundPressed!=null)
  {
  mChipBackgroundPressed.setBounds(0,0,width,height);
  mChipBackgroundPressed.draw(canvas);
  paint.setColor(sSelectedTextColor);
  // Vertically center the text in the chip.
  canvas.drawText(ellipsizedText,0,ellipsizedText.length(),mChipPadding,getTextYOffset((String)ellipsizedText,paint,height),paint);
  // Make the delete a square.
  final Rect backgroundPadding=new Rect();
  mChipBackgroundPressed.getPadding(backgroundPadding);
  mChipDelete.setBounds(width-deleteWidth+backgroundPadding.left,0+backgroundPadding.top,width-backgroundPadding.right,height-backgroundPadding.bottom);
  mChipDelete.draw(canvas);
  }
else Log.w(TAG,"Unable to draw a background for the chips as it was never set");
return tmpBitmap;
}
 
源代码12 项目: talk-android   文件: RecipientEditTextView.java
private Bitmap createChipBitmap(RecipientEntry contact, TextPaint paint, Bitmap icon,
                                Drawable background) {
    if (background == null) {
        Log.w(TAG, "Unable to draw a background for the chips as it was never set");
        return Bitmap.createBitmap(
                (int) mChipHeight * 2, (int) mChipHeight, Bitmap.Config.ARGB_8888);
    }

    Rect backgroundPadding = new Rect();
    background.getPadding(backgroundPadding);

    // Ellipsize the text so that it takes AT MOST the entire width of the
    // autocomplete text entry area. Make sure to leave space for padding
    // on the sides.
    int height = (int) mChipHeight + getResources().getDimensionPixelSize(R.dimen.extra_chip_height);
    // Since the icon is a square, it's width is equal to the maximum height it can be inside
    // the chip.
    int iconWidth = height - backgroundPadding.top - backgroundPadding.bottom;
    float[] widths = new float[1];
    paint.getTextWidths(" ", widths);
    CharSequence ellipsizedText = ellipsizeText(createChipDisplayText(contact), paint,
            calculateAvailableWidth() - iconWidth - widths[0] - backgroundPadding.left
                    - backgroundPadding.right);
    int textWidth = (int) paint.measureText(ellipsizedText, 0, ellipsizedText.length());

    // Make sure there is a minimum chip width so the user can ALWAYS
    // tap a chip without difficulty.
    int width = Math.max(iconWidth * 2, textWidth + (mChipPadding * 2) + iconWidth
            + backgroundPadding.left + backgroundPadding.right);

    // Create the background of the chip.
    Bitmap tmpBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(tmpBitmap);

    // Draw the background drawable
    background.setBounds(height / 2, 0, width, height);
    background.draw(canvas);
    // Draw the text vertically aligned
    int textX = shouldPositionAvatarOnRight() ?
            mChipPadding + backgroundPadding.left :
            width - backgroundPadding.right - mChipPadding - textWidth;
    paint.setColor(0xFF5C5C5C);
    paint.setAntiAlias(true);
    canvas.drawText(ellipsizedText, 0, ellipsizedText.length(),
            textX, getTextYOffset(ellipsizedText.toString(), paint, height), paint);
    if (icon != null) {
        // Draw the icon
        icon = ChipsUtil.getClip(icon);
        int iconX = shouldPositionAvatarOnRight() ?
                width - backgroundPadding.right - iconWidth :
                backgroundPadding.left;
        RectF src = new RectF(0, 0, icon.getWidth(), icon.getHeight());
        RectF dst = new RectF(0, 0, height, height);
        drawIconOnCanvas(icon, canvas, paint, src, dst);
    }
    return tmpBitmap;
}
 
源代码13 项目: talk-android   文件: TextChipsEditView.java
private Bitmap createChipBitmap(RecipientEntry contact, TextPaint paint, Bitmap icon,
                                    Drawable background) {
        if (background == null) {
            Log.w(TAG, "Unable to draw a background for the chips as it was never set");
            return Bitmap.createBitmap(
                    (int) mChipHeight * 2, (int) mChipHeight, Bitmap.Config.ARGB_8888);
        }

        Rect backgroundPadding = new Rect();
        background.getPadding(backgroundPadding);

        // Ellipsize the text so that it takes AT MOST the entire width of the
        // autocomplete text entry area. Make sure to leave space for padding
        // on the sides.
        int height = (int) mChipHeight;
        // Since the icon is a square, it's width is equal to the maximum height it can be inside
        // the chip.
        int iconWidth = height - backgroundPadding.top - backgroundPadding.bottom;
        float[] widths = new float[1];
        paint.getTextWidths(" ", widths);
        CharSequence ellipsizedText = ellipsizeText(createChipDisplayText(contact), paint,
                calculateAvailableWidth() - iconWidth - widths[0] - backgroundPadding.left
                        - backgroundPadding.right);
        int textWidth = (int) paint.measureText(ellipsizedText, 0, ellipsizedText.length());

        // Make sure there is a minimum chip width so the user can ALWAYS
        // tap a chip without difficulty.
//        int width = Math.max(iconWidth * 2, textWidth + (mChipPadding * 2) + iconWidth
//                + backgroundPadding.left + backgroundPadding.right);
        int width = mIconPadding + icon.getWidth() + textWidth + mFontPadding * 2;
        // Create the background of the chip.
        Bitmap tmpBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(tmpBitmap);

        // Draw the background drawable
        background.setBounds(0, 0, width, height);
        background.draw(canvas);
        // Draw the text vertically aligned
        paint.setColor(0xFF5C5C5C);
        paint.setAntiAlias(true);
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        float textY = height / 2 - fontMetrics.descent + (fontMetrics.descent - fontMetrics.ascent) / 2;
        getTextYOffset(ellipsizedText.toString(), paint, height);
        canvas.drawText(ellipsizedText, 0, ellipsizedText.length(),
                mIconPadding + icon.getWidth() + mFontPadding, textY, paint);
        if (icon != null) {
            // Draw the icon
            canvas.drawBitmap(icon, mIconPadding, mChipHeight / 2 - icon.getHeight() / 2, paint);
        }
        return tmpBitmap;
    }
 
源代码14 项目: ChipsLibrary   文件: RecipientEditTextView.java
private Bitmap createUnselectedChip(final RecipientEntry contact,final TextPaint paint,final boolean leaveBlankIconSpacer)
{
// Ellipsize the text so that it takes AT MOST the entire width of the
// autocomplete text entry area. Make sure to leave space for padding
// on the sides.
final int height=(int)mChipHeight;
int iconWidth=height;
final float[] widths=new float[1];
paint.getTextWidths(" ",widths);
final float availableWidth=calculateAvailableWidth();
final String chipDisplayText=createChipDisplayText(contact);
final CharSequence ellipsizedText=ellipsizeText(chipDisplayText,paint,availableWidth-iconWidth-widths[0]);
// Make sure there is a minimum chip width so the user can ALWAYS
// tap a chip without difficulty.
final int width=Math.max(iconWidth*2,(int)Math.floor(paint.measureText(ellipsizedText,0,ellipsizedText.length()))+mChipPadding*2+iconWidth);
// Create the background of the chip.
final Bitmap tmpBitmap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
final Canvas canvas=new Canvas(tmpBitmap);
final Drawable background=getChipBackground(contact);
if(background!=null)
  {
  background.setBounds(0,0,width,height);
  background.draw(canvas);
  // Don't draw photos for recipients that have been typed in OR generated on the fly.
  final long contactId=contact.getContactId();
  final boolean drawPhotos=isPhoneQuery() ? contactId!=RecipientEntry.INVALID_CONTACT : contactId!=RecipientEntry.INVALID_CONTACT&&contactId!=RecipientEntry.GENERATED_CONTACT&&!TextUtils.isEmpty(contact.getDisplayName());
  if(drawPhotos)
    {
    byte[] photoBytes=contact.getPhotoBytes();
    // There may not be a photo yet if anything but the first contact address
    // was selected.
    if(photoBytes==null&&contact.getPhotoThumbnailUri()!=null)
      {
      // TODO: cache this in the recipient entry?
      getAdapter().fetchPhoto(contact,contact.getPhotoThumbnailUri());
      photoBytes=contact.getPhotoBytes();
      }
    Bitmap photo;
    if(photoBytes!=null)
      photo=BitmapFactory.decodeByteArray(photoBytes,0,photoBytes.length);
    else // TODO: can the scaled down default photo be cached?
    photo=mDefaultContactPhoto;
    // Draw the photo on the left side.
    if(photo!=null)
      {
      final RectF src=new RectF(0,0,photo.getWidth(),photo.getHeight());
      final Rect backgroundPadding=new Rect();
      mChipBackground.getPadding(backgroundPadding);
      final RectF dst=new RectF(width-iconWidth+backgroundPadding.left,0+backgroundPadding.top,width-backgroundPadding.right,height-backgroundPadding.bottom);
      final Matrix matrix=new Matrix();
      matrix.setRectToRect(src,dst,Matrix.ScaleToFit.FILL);
      canvas.drawBitmap(photo,matrix,paint);
      }
    }
  else if(!leaveBlankIconSpacer||isPhoneQuery())
    iconWidth=0;
  paint.setColor(getContext().getResources().getColor(android.R.color.black));
  // Vertically center the text in the chip.
  canvas.drawText(ellipsizedText,0,ellipsizedText.length(),mChipPadding,getTextYOffset((String)ellipsizedText,paint,height),paint);
  }
else Log.w(TAG,"Unable to draw a background for the chips as it was never set");
return tmpBitmap;
}