Пример #1
0
        // Resize the text size with specified width and height
        public void ResizeText(int width, int height)
        {
            ICharSequence text = new Java.Lang.String(Text);

            // 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 (TransformationMethod != null)
            {
                text = TransformationMethod.GetTransformationFormatted(text, this);
            }
            // Get the text view's paint object
            TextPaint textPaint = Paint;
            // Store the current text size
            float oldTextSize = textPaint.TextSize;
            // 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)
            {
                TextPaint paint = new TextPaint(textPaint);
                // Draw using a static layout
                StaticLayout layout = new StaticLayout(text, paint, width, Layout.Alignment.AlignNormal, mSpacingMult, mSpacingAdd, false);
                // Check that we have a least one line of rendered text
                if (layout.LineCount > 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)
                    {
                        Text = "";
                    }
                    // 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());
                        }
                        Text = (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(ComplexUnitType.Px, targetTextSize);
            SetLineSpacing(mSpacingAdd, mSpacingMult);

            // Notify the listener if registered
            if (mTextResizeListener != null)
            {
                mTextResizeListener.OnTextResize(this, oldTextSize, targetTextSize);
            }

            // Reset force resize flag
            mNeedsResize = false;
        }
Пример #2
0
        public void ResizeText(int width, int height)
        {
            var text = TextFormatted;

            if (text == null || text.Length() == 0 || height <= 0 || width <= 0 || mTextSize == 0)
            {
                return;
            }

            if (TransformationMethod != null)
            {
                text = TransformationMethod.GetTransformationFormatted(TextFormatted, this);
            }

            TextPaint textPaint = Paint;

            float oldTextSize    = textPaint.TextSize;
            float targetTextSize = mMaxTextSize > 0 ? System.Math.Min(mTextSize, mMaxTextSize) : mTextSize;

            int textHeight = GetTextHeight(text, textPaint, width, targetTextSize);

            while (textHeight > height && targetTextSize > mMinTextSize)
            {
                targetTextSize = System.Math.Max(targetTextSize - 2, mMinTextSize);
                textHeight     = GetTextHeight(text, textPaint, width, targetTextSize);
            }

            if (AddEllipsis && targetTextSize == mMinTextSize && textHeight > height)
            {
                TextPaint paint = new TextPaint(textPaint);

                StaticLayout layout = new StaticLayout(text, paint, width, Layout.Alignment.AlignNormal, mSpacingMult, mSpacingAdd, false);
                if (layout.LineCount > 0)
                {
                    int lastLine = layout.GetLineForVertical(height) - 1;
                    if (lastLine < 0)
                    {
                        SetText("", BufferType.Normal);
                    }
                    else
                    {
                        int   start        = layout.GetLineStart(lastLine);
                        int   end          = layout.GetLineEnd(lastLine);
                        float lineWidth    = layout.GetLineWidth(lastLine);
                        float ellipseWidth = textPaint.MeasureText(mEllipsis);

                        while (width < lineWidth + ellipseWidth)
                        {
                            lineWidth = textPaint.MeasureText(text.SubSequence(start, --end + 1).ToString());
                        }
                        SetText(text.SubSequence(0, end) + mEllipsis, BufferType.Normal);
                    }
                }
            }

            SetTextSize(ComplexUnitType.Px, targetTextSize);
            SetLineSpacing(mSpacingAdd, mSpacingMult);

            mTextResizeListener?.OnTextResize(this, oldTextSize, targetTextSize);

            mNeedsResize = false;
        }