// 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; }
public void setTransformationMethod(TransformationMethod method) { }
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 定义控制点 } }
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; }