Пример #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 setTransformationMethod(TransformationMethod method)
 {
 }
Пример #3
0
        public SpatialAdjust(string controlPointsFile, ControlPointsInputType controlPointsInputType, SpatialAdjustMethodType spatialAdjustMethodType)
        {
            ControlPointsFile       = controlPointsFile;
            ControlPointsInputType  = controlPointsInputType;
            SpatialAdjustMethodType = spatialAdjustMethodType;
            string txt = string.Empty;

            switch (ControlPointsInputType)
            {
            case ControlPointsInputType.File:
                try
                {
                    txt = File.ReadAllText(ControlPointsFile);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("找不到控制点文件");
                    throw ex;
                }
                break;

            case ControlPointsInputType.Web:
                try
                {
                    txt = new WebClient().DownloadString(ControlPointsFile);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("找不到控制点文件");
                    throw ex;
                }
                break;

            default:
                break;
            }
            if (String.IsNullOrEmpty(txt))
            {
                TransformationMethod = null;
            }
            else
            {
                var methodObject = transformMethodMap[SpatialAdjustMethodType]
                                   .GetConstructors()
                                   .Where(constructor => constructor.GetParameters().Length == 0)
                                   .FirstOrDefault()
                                   .Invoke(null);
                TransformationMethod = (ITransformationMethodGEN)methodObject;

                #region 定义控制点

                var lines = txt.Split('\n').ToList();
                if (String.IsNullOrWhiteSpace(lines.Last()) || String.IsNullOrEmpty(lines.Last()))
                {
                    lines.RemoveAt(lines.Count - 1);
                }
                List <IPoint> fromPoints = new List <IPoint>();
                List <IPoint> toPoints   = new List <IPoint>();
                lines.ForEach((line) =>
                {
                    var nums         = line.Split('\t').ToList().Select(numString => Convert.ToDouble(numString)).ToList();
                    IPoint fromPoint = new PointClass()
                    {
                        X = nums[0], Y = nums[1]
                    };
                    IPoint toPoint = new PointClass()
                    {
                        X = nums[2], Y = nums[3]
                    };
                    fromPoints.Add(fromPoint);
                    toPoints.Add(toPoint);
                });
                TransformationMethod.DefineFromControlPoints(fromPoints.ToArray(), toPoints.ToArray(), null, null);

                #endregion 定义控制点
            }
        }
Пример #4
0
        public void setTransformationMethod(TransformationMethod method)
        {

        }
Пример #5
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;
        }