public bool AddSmiles(Context context, ISpannable spannable) { var hasChanges = false; foreach (var entry in Emoticons) { var smiley = entry.Key; var smileyImage = entry.Value; var indices = spannable.ToString().IndexesOf(smiley); foreach (var index in indices) { var set = true; foreach (ImageSpan span in spannable.GetSpans(index, index + smiley.Length, Java.Lang.Class.FromType(typeof(ImageSpan)))) { if (spannable.GetSpanStart(span) >= index && spannable.GetSpanEnd(span) <= index + smiley.Length) { spannable.RemoveSpan(span); } else { set = false; break; } } if (set) { hasChanges = true; spannable.SetSpan(new ImageSpan(context, smileyImage), index, index + smiley.Length, SpanTypes.ExclusiveExclusive); } } } return(hasChanges); }
/// <summary> /// Since they are several over write of the Test property during layout we have to set this field as long as it is not definitly set /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void nativeBtn_AfterTextChanged(object sender, AfterTextChangedEventArgs e) { ISpannable spannable = e.Editable; var indice = spannable.ToString().IndexOf(_iconButton.Icon); var spans = spannable.GetSpans(indice, indice + _iconButton.Icon.Length, Java.Lang.Class.FromType(typeof(TypefaceSpan))).ToList(); if (spans.Count == 0) { _nativeBtn.SetText(_iconSpan, TextView.BufferType.Spannable); } }
private static List <AttributedTextRun> CreateRuns( ISpannable target, TextWriter writer) { var runs = new List <AttributedTextRun>(); var spans = target.GetSpans(0, target.Length(), null); if (spans != null) { foreach (var span in spans) { System.Console.WriteLine(span); } } writer.Write(target.ToString()); return(runs); }
private static void FormatImages(Context context, ISpannable spannable) { var text = spannable?.ToString(); if (string.IsNullOrWhiteSpace(text)) { return; } var matches = ImageRegex.Matches(text); foreach (var match in matches.ToList()) { var drawable = ContextCompat.GetDrawable(context, PlaceholderImage); drawable.SetBounds(0, 0, drawable.IntrinsicWidth, drawable.IntrinsicHeight); var imageSpan = new ImageSpan(drawable, SpanAlign.Baseline); var clickSpan = new CustomClickableSpan(); clickSpan.Click += (sender, e) => { var intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(match.Groups[2].Value)); context.StartActivity(intent); }; spannable.SetSpan(clickSpan, match.Index, match.Index + match.Length, SpanTypes.InclusiveExclusive); spannable.SetSpan(imageSpan, match.Index, match.Index + match.Length, SpanTypes.InclusiveExclusive); if (!int.TryParse(match.Groups[1].Value, out var width)) { width = 250; } width = Math.Min(width, MaxImageWidth); Picasso.With(context).Load(match.Groups[2].Value) .Into(new DrawableTarget(spannable, match.Index, match.Index + match.Length, (int)(width * context.Resources.DisplayMetrics.Density))); } }
private static void FormatYoutube(Context context, ISpannable spannable) { var text = spannable?.ToString(); if (string.IsNullOrWhiteSpace(text)) { return; } var matches = YoutubeRegex.Matches(text); var playIcon = ContextCompat.GetDrawable(context, Resource.Drawable.svg_play); playIcon.SetColorFilter(Color.White, PorterDuff.Mode.SrcIn); playIcon.SetAlpha(150); foreach (var match in matches.ToList()) { var drawable = ContextCompat.GetDrawable(context, PlaceholderImage); drawable.SetBounds(0, 0, drawable.IntrinsicWidth, drawable.IntrinsicHeight); var imageSpan = new ImageSpan(drawable, SpanAlign.Baseline); var clickSpan = new CustomClickableSpan(); clickSpan.Click += (sender, e) => { var intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(string.Format(YoutubeLinkUrl, match.Groups[1].Value))); context.StartActivity(intent); }; spannable.SetSpan(clickSpan, match.Index, match.Index + match.Length, SpanTypes.InclusiveExclusive); spannable.SetSpan(imageSpan, match.Index, match.Index + match.Length, SpanTypes.InclusiveExclusive); Picasso.With(context).Load(string.Format(YoutubeThumbnailUrl, match.Groups[1].Value)) .Into(new DrawableTarget(spannable, match.Index, match.Index + match.Length, (int)(250 * context.Resources.DisplayMetrics.Density), playIcon)); } }
// Taken from https://gist.githubusercontent.com/Cheesebaron/5034440/raw/f962c41c95f8d94457ef9a60e19fe7efa2a50d61/SpannableTools.cs public static bool AddSmiles(Context context, ISpannable spannable) { var hasChanges = false; foreach (var entry in Emoticons) { var smiley = entry.Key; var smileyImage = entry.Value; var indices = spannable.ToString().IndexesOf(smiley); var index = 0; foreach (var token in spannable.ToString().Split(' ')) { if (token.Equals (smiley)) { var set = true; foreach (ImageSpan span in spannable.GetSpans(index, index + smiley.Length, Java.Lang.Class.FromType(typeof(ImageSpan)))) { if (spannable.GetSpanStart (span) >= index && spannable.GetSpanEnd (span) <= index + smiley.Length) spannable.RemoveSpan (span); else { set = false; break; } } if (set) { hasChanges = true; spannable.SetSpan (new ImageSpan (context, smileyImage), index, index + smiley.Length, SpanTypes.ExclusiveExclusive); } } index += token.Length + 1; } } return hasChanges; }