Java Code Examples for android.text.StaticLayout#getLineEnd()
The following examples show how to use
android.text.StaticLayout#getLineEnd() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: MovieTextLayer.java From PhotoMovie with Apache License 2.0 | 6 votes |
@Override public void prepare() { int width = (int) (mViewprotRect.width() * 0.75f); StaticLayout staticLayout = new StaticLayout(mText, mTextPaint, width, Layout.Alignment.ALIGN_CENTER, 1, 0, true); mTextBmList = new ArrayList<BitmapInfo>(staticLayout.getLineCount()); for (int i = 0; i < staticLayout.getLineCount(); i++) { int s = staticLayout.getLineStart(i); int e = staticLayout.getLineEnd(i); Bitmap bitmap = strToBitmap(mText.substring(s, e), mTextPaint); BitmapTexture bitmapTexture = new BitmapTexture(bitmap); bitmapTexture.setOpaque(false); BitmapInfo bitmapInfo = new BitmapInfo(); bitmapInfo.srcRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); bitmapInfo.srcShowRect.set(bitmapInfo.srcRect); bitmapInfo.bitmapTexture = bitmapTexture; mTextBmList.add(bitmapInfo); } mMovieFilter.init(); }
Example 2
Source File: HtmlTextView.java From MousePaint with MIT License | 6 votes |
public void resizeText(int paramInt1, int paramInt2) { CharSequence localCharSequence = getText(); if ((localCharSequence == null) || (localCharSequence.length() == 0) || (paramInt2 <= 0) || (paramInt1 <= 0)) return; TextPaint localTextPaint = getPaint(); StaticLayout localStaticLayout = new StaticLayout(localCharSequence, localTextPaint, paramInt1, Layout.Alignment.ALIGN_NORMAL, 1.25F, 0.0F, true); int i = localStaticLayout.getLineCount(); int j = paramInt2 / (localStaticLayout.getHeight() / i); if (i > j) { int k = localStaticLayout.getLineStart(j - 1); int m = localStaticLayout.getLineEnd(j - 1); float f1 = localStaticLayout.getLineWidth(j - 1); float f2 = localTextPaint.measureText(this.mEllipsis); while (paramInt1 < f1 + f2) { m--; f1 = localTextPaint.measureText(localCharSequence.subSequence(k, m + 1).toString()); } setText(localCharSequence.subSequence(0, m) + this.mEllipsis); } setMaxLines(j); this.mNeedsResize = false; }
Example 3
Source File: StaticLayoutHelper.java From TextLayoutBuilder with Apache License 2.0 | 5 votes |
/** * Attempts to fix a StaticLayout with wrong layout information that can result in * StringIndexOutOfBoundsException during layout.draw(). * * @param layout The {@link StaticLayout} to fix * @return Whether the layout was fixed or not */ public static boolean fixLayout(StaticLayout layout) { int lineStart = layout.getLineStart(0); for (int i = 0, lineCount = layout.getLineCount(); i < lineCount; ++i) { int lineEnd = layout.getLineEnd(i); if (lineEnd < lineStart) { // Bug, need to swap lineStart and lineEnd try { Field mLinesField = StaticLayout.class.getDeclaredField("mLines"); mLinesField.setAccessible(true); Field mColumnsField = StaticLayout.class.getDeclaredField("mColumns"); mColumnsField.setAccessible(true); int[] mLines = (int[]) mLinesField.get(layout); int mColumns = mColumnsField.getInt(layout); // swap lineStart and lineEnd by swapping all the following data: // mLines[mColumns * i.. mColumns * i+1] <-> mLines[mColumns * (i+1)..mColumns * (i+2)] for (int j = 0; j < mColumns; ++j) { swap(mLines, mColumns * i + j, mColumns * i + j + mColumns); } } catch (Exception e) { // something is wrong, bail out break; } // start over return false; } lineStart = lineEnd; } return true; }
Example 4
Source File: FontFitTextView.java From Twire with GNU General Public License v3.0 | 4 votes |
/** * Resize the text size with specified width and height * * @param width * @param height */ public void resizeText(int width, int height) { CharSequence text = getText(); // Do not resize if the view does not have dimensions or there is no text if (text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) { return; } if (getTransformationMethod() != null) { text = getTransformationMethod().getTransformation(text, this); } // Get the text view's paint object TextPaint textPaint = getPaint(); // Store the current text size float oldTextSize = textPaint.getTextSize(); // If there is a max text size set, use the lesser of that and the default text size float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize; // Get the required text height int textHeight = getTextHeight(text, textPaint, width, targetTextSize); // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes while (textHeight > height && targetTextSize > mMinTextSize) { targetTextSize = Math.max(targetTextSize - 2, mMinTextSize); textHeight = getTextHeight(text, textPaint, width, targetTextSize); } // If we had reached our minimum text size and still don't fit, append an ellipsis if (mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) { // Draw using a static layout // modified: use a copy of TextPaint for measuring TextPaint paint = new TextPaint(textPaint); // Draw using a static layout StaticLayout layout = new StaticLayout(text, paint, width, Layout.Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false); // Check that we have a least one line of rendered text if (layout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line int lastLine = layout.getLineForVertical(height) - 1; // If the text would not even fit on a single line, clear it if (lastLine < 0) { setText(""); } // Otherwise, trim to the previous line and add an ellipsis else { int start = layout.getLineStart(lastLine); int end = layout.getLineEnd(lastLine); float lineWidth = layout.getLineWidth(lastLine); float ellipseWidth = textPaint.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while (width < lineWidth + ellipseWidth) { lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); } setText(text.subSequence(0, end) + mEllipsis); } } } // Some devices try to auto adjust line spacing, so force default line spacing // and invalidate the layout as a side effect setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSize); setLineSpacing(mSpacingAdd, mSpacingMult); // Notify the listener if registered if (mTextResizeListener != null) { mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize); } // Reset force resize flag mNeedsResize = false; }
Example 5
Source File: FontFitTextView.java From Pocket-Plays-for-Twitch with GNU General Public License v3.0 | 4 votes |
/** * Resize the text size with specified width and height * @param width * @param height */ public void resizeText(int width, int height) { CharSequence text = getText(); // Do not resize if the view does not have dimensions or there is no text if (text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) { return; } if (getTransformationMethod() != null) { text = getTransformationMethod().getTransformation(text, this); } // Get the text view's paint object TextPaint textPaint = getPaint(); // Store the current text size float oldTextSize = textPaint.getTextSize(); // If there is a max text size set, use the lesser of that and the default text size float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize; // Get the required text height int textHeight = getTextHeight(text, textPaint, width, targetTextSize); // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes while (textHeight > height && targetTextSize > mMinTextSize) { targetTextSize = Math.max(targetTextSize - 2, mMinTextSize); textHeight = getTextHeight(text, textPaint, width, targetTextSize); } // If we had reached our minimum text size and still don't fit, append an ellipsis if (mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) { // Draw using a static layout // modified: use a copy of TextPaint for measuring TextPaint paint = new TextPaint(textPaint); // Draw using a static layout StaticLayout layout = new StaticLayout(text, paint, width, Layout.Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false); // Check that we have a least one line of rendered text if (layout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line int lastLine = layout.getLineForVertical(height) - 1; // If the text would not even fit on a single line, clear it if (lastLine < 0) { setText(""); } // Otherwise, trim to the previous line and add an ellipsis else { int start = layout.getLineStart(lastLine); int end = layout.getLineEnd(lastLine); float lineWidth = layout.getLineWidth(lastLine); float ellipseWidth = textPaint.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while (width < lineWidth + ellipseWidth) { lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); } setText(text.subSequence(0, end) + mEllipsis); } } } // Some devices try to auto adjust line spacing, so force default line spacing // and invalidate the layout as a side effect setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSize); setLineSpacing(mSpacingAdd, mSpacingMult); // Notify the listener if registered if (mTextResizeListener != null) { mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize); } // Reset force resize flag mNeedsResize = false; }
Example 6
Source File: AutoResizeTextView.java From memoir with Apache License 2.0 | 4 votes |
/** * Resizes this view's text size with respect to its width and height * (minus padding). */ private void resizeText() { final int availableHeightPixels = getHeight() - getCompoundPaddingBottom() - getCompoundPaddingTop(); final int availableWidthPixels = getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight(); final CharSequence text = getText(); // Safety check // (Do not resize if the view does not have dimensions or if there is no text) if (text == null || text.length() <= 0 || availableHeightPixels <= 0 || availableWidthPixels <= 0 || mMaxTextSizePixels <= 0) { return; } float targetTextSizePixels = mMaxTextSizePixels; int targetTextHeightPixels = getTextHeightPixels(text, availableWidthPixels, targetTextSizePixels); // Until we either fit within our TextView // or we have reached our minimum text size, // incrementally try smaller sizes while (targetTextHeightPixels > availableHeightPixels && targetTextSizePixels > mMinTextSizePixels) { targetTextSizePixels = Math.max( targetTextSizePixels - 2, mMinTextSizePixels); targetTextHeightPixels = getTextHeightPixels( text, availableWidthPixels, targetTextSizePixels); } // If we have reached our minimum text size and the text still doesn't fit, // append an ellipsis // (NOTE: Auto-ellipsize doesn't work hence why we have to do it here) // depending on the value of getEllipsize()) if (getEllipsize() != null && targetTextSizePixels == mMinTextSizePixels && targetTextHeightPixels > availableHeightPixels) { // Make a copy of the original TextPaint object for measuring TextPaint textPaintCopy = new TextPaint(getPaint()); textPaintCopy.setTextSize(targetTextSizePixels); // Measure using a StaticLayout instance StaticLayout staticLayout = new StaticLayout( text, textPaintCopy, availableWidthPixels, Layout.Alignment.ALIGN_NORMAL, mLineSpacingMultiplier, mLineSpacingExtra, false); // Check that we have a least one line of rendered text if (staticLayout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line and add an ellipsis int lastLine = staticLayout.getLineForVertical(availableHeightPixels) - 1; if (lastLine >= 0) { int startOffset = staticLayout.getLineStart(lastLine); int endOffset = staticLayout.getLineEnd(lastLine); float lineWidthPixels = staticLayout.getLineWidth(lastLine); float ellipseWidth = textPaintCopy.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while (availableWidthPixels < lineWidthPixels + ellipseWidth) { endOffset--; lineWidthPixels = textPaintCopy.measureText( text.subSequence(startOffset, endOffset + 1).toString()); } setText(text.subSequence(0, endOffset) + mEllipsis); } } } super.setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSizePixels); // Some devices try to auto adjust line spacing, so force default line spacing super.setLineSpacing(mLineSpacingExtra, mLineSpacingMultiplier); }
Example 7
Source File: AutoResizingTextView.java From Simple-Solitaire with GNU General Public License v3.0 | 4 votes |
/** * Resize the text size with specified width and height * * @param width * @param height */ public void resizeText(int width, int height) { CharSequence text = getText(); // Do not resize if the view does not have dimensions or there is no text if (text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) { return; } if (getTransformationMethod() != null) { text = getTransformationMethod().getTransformation(text, this); } // Get the text view's paint object TextPaint textPaint = getPaint(); // Store the current text size float oldTextSize = textPaint.getTextSize(); // If there is a max text size set, use the lesser of that and the default text size float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize; // Get the required text height int textHeight = getTextHeight(text, textPaint, width, targetTextSize); // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes while (textHeight > height && targetTextSize > mMinTextSize) { targetTextSize = Math.max(targetTextSize - 2, mMinTextSize); textHeight = getTextHeight(text, textPaint, width, targetTextSize); } // If we had reached our minimum text size and still don't fit, append an ellipsis if (mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) { // Draw using a static layout // modified: use a copy of TextPaint for measuring TextPaint paint = new TextPaint(textPaint); // Draw using a static layout StaticLayout layout = new StaticLayout(text, paint, width, Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false); // Check that we have a least one line of rendered text if (layout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line int lastLine = layout.getLineForVertical(height) - 1; // If the text would not even fit on a single line, clear it if (lastLine < 0) { setText(""); } // Otherwise, trim to the previous line and add an ellipsis else { int start = layout.getLineStart(lastLine); int end = layout.getLineEnd(lastLine); float lineWidth = layout.getLineWidth(lastLine); float ellipseWidth = textPaint.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while (width < lineWidth + ellipseWidth) { lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); } setText(text.subSequence(0, end) + mEllipsis); } } } // Some devices try to auto adjust line spacing, so force default line spacing // and invalidate the layout as a side effect setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSize); setLineSpacing(mSpacingAdd, mSpacingMult); // Notify the listener if registered if (mTextResizeListener != null) { mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize); } // Reset force resize flag mNeedsResize = false; }
Example 8
Source File: AutoResizeTextView.java From watchlist with Apache License 2.0 | 4 votes |
/** * Resizes this view's text size with respect to its width and height * (minus padding). */ private void resizeText() { final int availableHeightPixels = getHeight() - getCompoundPaddingBottom() - getCompoundPaddingTop(); final int availableWidthPixels = getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight(); final CharSequence text = getText(); // Safety check // (Do not resize if the view does not have dimensions or if there is no text) if (text == null || text.length() <= 0 || availableHeightPixels <= 0 || availableWidthPixels <= 0 || mMaxTextSizePixels <= 0) { return; } float targetTextSizePixels = mMaxTextSizePixels; int targetTextHeightPixels = getTextHeightPixels(text, availableWidthPixels, targetTextSizePixels); // Until we either fit within our TextView // or we have reached our minimum text size, // incrementally try smaller sizes while (targetTextHeightPixels > availableHeightPixels && targetTextSizePixels > mMinTextSizePixels) { targetTextSizePixels = Math.max( targetTextSizePixels - 2, mMinTextSizePixels); targetTextHeightPixels = getTextHeightPixels( text, availableWidthPixels, targetTextSizePixels); } // If we have reached our minimum text size and the text still doesn't fit, // append an ellipsis // (NOTE: Auto-ellipsize doesn't work hence why we have to do it here) // depending on the value of getEllipsize()) if (getEllipsize() != null && targetTextSizePixels == mMinTextSizePixels && targetTextHeightPixels > availableHeightPixels) { // Make a copy of the original TextPaint object for measuring TextPaint textPaintCopy = new TextPaint(getPaint()); textPaintCopy.setTextSize(targetTextSizePixels); // Measure using a StaticLayout instance StaticLayout staticLayout = new StaticLayout( text, textPaintCopy, availableWidthPixels, Layout.Alignment.ALIGN_NORMAL, mLineSpacingMultiplier, mLineSpacingExtra, false); // Check that we have a least one line of rendered text if (staticLayout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line and add an ellipsis int lastLine = staticLayout.getLineForVertical(availableHeightPixels) - 1; if (lastLine >= 0) { int startOffset = staticLayout.getLineStart(lastLine); int endOffset = staticLayout.getLineEnd(lastLine); float lineWidthPixels = staticLayout.getLineWidth(lastLine); float ellipseWidth = textPaintCopy.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while (availableWidthPixels < lineWidthPixels + ellipseWidth) { endOffset--; lineWidthPixels = textPaintCopy.measureText( text.subSequence(startOffset, endOffset + 1).toString()); } setText(text.subSequence(0, endOffset) + mEllipsis); } } } super.setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSizePixels); // Some devices try to auto adjust line spacing, so force default line spacing super.setLineSpacing(mLineSpacingExtra, mLineSpacingMultiplier); }
Example 9
Source File: AutoResizeTextView.java From oneHookLibraryAndroid with Apache License 2.0 | 4 votes |
/** * Resize the text size with specified width and height * @param width * @param height */ public void resizeText(int width, int height) { CharSequence text = getText(); // Do not resize if the view does not have dimensions or there is no text if (text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) { return; } if (getTransformationMethod() != null) { text = getTransformationMethod().getTransformation(text, this); } // Get the text view's paint object TextPaint textPaint = getPaint(); // Store the current text size float oldTextSize = textPaint.getTextSize(); // If there is a max text size set, use the lesser of that and the default text size float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize; // Get the required text height int textHeight = getTextHeight(text, textPaint, width, targetTextSize); // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes while (textHeight > height && targetTextSize > mMinTextSize) { targetTextSize = Math.max(targetTextSize - 2, mMinTextSize); textHeight = getTextHeight(text, textPaint, width, targetTextSize); } // If we had reached our minimum text size and still don't fit, append an ellipsis if (mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) { // Draw using a static layout // modified: use a copy of TextPaint for measuring TextPaint paint = new TextPaint(textPaint); // Draw using a static layout StaticLayout layout = new StaticLayout(text, paint, width, Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false); // Check that we have a least one line of rendered text if (layout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line int lastLine = layout.getLineForVertical(height) - 1; // If the text would not even fit on a single line, clear it if (lastLine < 0) { setText(""); } // Otherwise, trim to the previous line and add an ellipsis else { int start = layout.getLineStart(lastLine); int end = layout.getLineEnd(lastLine); float lineWidth = layout.getLineWidth(lastLine); float ellipseWidth = textPaint.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while (width < lineWidth + ellipseWidth) { lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); } setText(text.subSequence(0, end) + mEllipsis); } } } // Some devices try to auto adjust line spacing, so force default line spacing // and invalidate the layout as a side effect setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSize); setLineSpacing(mSpacingAdd, mSpacingMult); // Notify the listener if registered if (mTextResizeListener != null) { mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize); } // Reset force resize flag mNeedsResize = false; }
Example 10
Source File: AutoResizeTextView.java From juicessh-performancemonitor with Apache License 2.0 | 4 votes |
/** * Resize the text size with specified width and height * @param width * @param height */ public void resizeText(int width, int height) { CharSequence text = getText(); // Do not resize if the view does not have dimensions or there is no text if(text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) { return; } // Get the text view's paint object TextPaint textPaint = getPaint(); // Store the current text size float oldTextSize = textPaint.getTextSize(); // If there is a max text size set, use the lesser of that and the default text size float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize; // Get the required text height int textHeight = getTextHeight(text, textPaint, width, targetTextSize); // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes while(textHeight > height && targetTextSize > mMinTextSize) { targetTextSize = Math.max(targetTextSize - 2, mMinTextSize); textHeight = getTextHeight(text, textPaint, width, targetTextSize); } // If we had reached our minimum text size and still don't fit, append an ellipsis if(mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) { // Draw using a static layout StaticLayout layout = new StaticLayout(text, textPaint, width, Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false); // Check that we have a least one line of rendered text if(layout.getLineCount() > 0) { // Since the line at the specific vertical position would be cut off, // we must trim up to the previous line int lastLine = layout.getLineForVertical(height) - 1; // If the text would not even fit on a single line, clear it if(lastLine < 0) { setText(""); } // Otherwise, trim to the previous line and add an ellipsis else { int start = layout.getLineStart(lastLine); int end = layout.getLineEnd(lastLine); float lineWidth = layout.getLineWidth(lastLine); float ellipseWidth = textPaint.measureText(mEllipsis); // Trim characters off until we have enough room to draw the ellipsis while(width < lineWidth + ellipseWidth) { lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString()); } setText(text.subSequence(0, end) + mEllipsis); } } } // Some devices try to auto adjust line spacing, so force default line spacing // and invalidate the layout as a side effect textPaint.setTextSize(targetTextSize); setLineSpacing(mSpacingAdd, mSpacingMult); // Notify the listener if registered if(mTextResizeListener != null) { mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize); } // Reset force resize flag mNeedsResize = false; }