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); }
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) //setimage on text view { base.OnActivityResult(requestCode, resultCode, data); Bitmap bitmap = null; switch (requestCode) { case GALLERY_REQUEST: if (resultCode == Result.Ok) { Android.Net.Uri selectedImage = data.Data; string Tag = '[' + selectedImage.LastPathSegment + ']'; bitmap = Multitools.decodeSampledBitmapFromUri(this, selectedImage, 2000, 2000); bitmap = Multitools.getResizedBitmap(bitmap, Resources.DisplayMetrics.WidthPixels - 100, Resources.DisplayMetrics.WidthPixels - 100); var imageSpan = new ImageSpan(this, bitmap); //Find your drawable. int selStart = EditText.SelectionEnd; var span = EditText.EditableText.GetSpans(0, EditText.Length(), Java.Lang.Class.FromType(typeof(ImageSpan))); ISpannable spann = SpannableFactory.Instance.NewSpannable(Tag); spann.SetSpan(imageSpan, 0, Tag.Length, SpanTypes.ExclusiveExclusive); if (selStart != 0) { EditText.EditableText.Insert(selStart, "\n"); } selStart = EditText.SelectionEnd; EditText.EditableText.Insert(selStart, spann); textWatcher.Editing = false; EditText.EditableText.Insert(selStart + Tag.Length, "\n"); textWatcher.Editing = true; } break; } }
void setImages(ICursor cursor) { if (cursor.MoveToFirst()) { string path; long id; long start; long end; Bitmap bitmap = null; do { id = cursor.GetLong(0); path = cursor.GetString(1); start = cursor.GetLong(2); end = cursor.GetLong(3); bitmap = SqlHelper.ReturnDrawableBase(id, path); path = '[' + path + ']'; var imageSpan = new ImageSpan(this, bitmap); ISpannable spann = SpannableFactory.Instance.NewSpannable(path); spann.SetSpan(imageSpan, 0, path.Length, SpanTypes.ExclusiveExclusive); textWatcher.Editing = false; EditText.EditableText.Replace((int)start, (int)end, spann); }while (cursor.MoveToNext()); } } //SetImages in Text
private void MakeLinkClickable(ISpannable strBuilder, URLSpan span) { var start = strBuilder.GetSpanStart(span); var end = strBuilder.GetSpanEnd(span); var flags = strBuilder.GetSpanFlags(span); var clickable = new MyClickableSpan((HtmlLabel)Element, span); strBuilder.SetSpan(clickable, start, end, flags); strBuilder.RemoveSpan(span); }
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 MakeLinkClickable(ISpannable spannable, URLSpan span) { var start = spannable.GetSpanStart(span); var end = spannable.GetSpanEnd(span); var flags = spannable.GetSpanFlags(span); var clickableLink = new ClickableLinkSpan(span.URL); spannable.SetSpan(clickableLink, start, end, flags); spannable.RemoveSpan(span); }
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)); } }
/** * Adds a highlight background color span to the TextView. */ protected void HighlightUrl(TextView textView, ClickableSpanWithText spanWithText, ISpannable text) { if (_isUrlHighlighted) { return; } _isUrlHighlighted = true; var spanStart = text.GetSpanStart(spanWithText.Span); var spanEnd = text.GetSpanEnd(spanWithText.Span); text.SetSpan(new BackgroundColorSpan(textView.HighlightColor), spanStart, spanEnd, SpanTypes.InclusiveInclusive); textView.SetText(text, TextView.BufferType.Spannable); Selection.SetSelection(text, spanStart, spanEnd); }
public void OnBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom @from) { var scaledBitmap = Bitmap.CreateScaledBitmap(bitmap, _width, (int)(bitmap.Height / ((float)bitmap.Width / _width)), true); if (_playIcon != null) { _playIcon.SetBounds((int)(scaledBitmap.Width * .35), (int)(scaledBitmap.Height * .3), (int)(scaledBitmap.Width * .65), (int)(scaledBitmap.Height * .7)); _playIcon.Draw(new Canvas(scaledBitmap)); } var drawable = new BitmapDrawable(Application.Context.Resources, scaledBitmap); drawable.SetBounds(0, 0, drawable.IntrinsicWidth, drawable.IntrinsicHeight); var imageSpan = new ImageSpan(drawable, SpanAlign.Baseline); _spannable.SetSpan(imageSpan, _start, _end, SpanTypes.InclusiveExclusive); }
/** * Convert emoji characters of the given Spannable to the according emojicon. * * @param context * @param text * @param emojiSize * @param index * @param length */ public static void AddEmojis(Context context, ISpannable text, int emojiSize, int index, int length) { int textLength = text.Length(); int textLengthToProcessMax = textLength - index; int textLengthToProcess = length < 0 || length >= textLengthToProcessMax ? textLength : (length+index); // remove spans throughout all text //EmojiconSpan[] var oldSpans = text.GetSpans(0, textLength,Java.Lang.Class.FromType(typeof(EmojiconSpan))); for (int i = 0; i < oldSpans.Length; i++) { text.RemoveSpan(oldSpans[i]); } int skip; for (int i = index; i < textLengthToProcess; i += skip) { skip = 0; int icon = 0; char c = text.CharAt(i); if (IsSoftBankEmoji(c)) { icon = GetSoftbankEmojiResource(c); skip = icon == 0 ? 0 : 1; } if (icon == 0) { int unicode = Character.CodePointAt(text, i); skip = Character.CharCount(unicode); if (unicode > 0xff) { icon = GetEmojiResource(context, unicode); } if (icon == 0 && i + skip < textLengthToProcess) { int followUnicode = Character.CodePointAt(text, i + skip); if (followUnicode == 0x20e3) { int followSkip = Character.CharCount(followUnicode); switch (unicode) { case 0x0031: icon = Resource.Drawable.emoji_0031; break; case 0x0032: icon = Resource.Drawable.emoji_0032; break; case 0x0033: icon = Resource.Drawable.emoji_0033; break; case 0x0034: icon = Resource.Drawable.emoji_0034; break; case 0x0035: icon = Resource.Drawable.emoji_0035; break; case 0x0036: icon = Resource.Drawable.emoji_0036; break; case 0x0037: icon = Resource.Drawable.emoji_0037; break; case 0x0038: icon = Resource.Drawable.emoji_0038; break; case 0x0039: icon = Resource.Drawable.emoji_0039; break; case 0x0030: icon = Resource.Drawable.emoji_0030; break; case 0x0023: icon = Resource.Drawable.emoji_0023; break; default: followSkip = 0; break; } skip += followSkip; } else { int followSkip = Character.CharCount(followUnicode); switch (unicode) { case 0x1f1ef: icon = (followUnicode == 0x1f1f5) ? Resource.Drawable.emoji_1f1ef_1f1f5 : 0; break; case 0x1f1fa: icon = (followUnicode == 0x1f1f8) ? Resource.Drawable.emoji_1f1fa_1f1f8 : 0; break; case 0x1f1eb: icon = (followUnicode == 0x1f1f7) ? Resource.Drawable.emoji_1f1eb_1f1f7 : 0; break; case 0x1f1e9: icon = (followUnicode == 0x1f1ea) ? Resource.Drawable.emoji_1f1e9_1f1ea : 0; break; case 0x1f1ee: icon = (followUnicode == 0x1f1f9) ? Resource.Drawable.emoji_1f1ee_1f1f9 : 0; break; case 0x1f1ec: icon = (followUnicode == 0x1f1e7) ? Resource.Drawable.emoji_1f1ec_1f1e7 : 0; break; case 0x1f1ea: icon = (followUnicode == 0x1f1f8) ? Resource.Drawable.emoji_1f1ea_1f1f8 : 0; break; case 0x1f1f7: icon = (followUnicode == 0x1f1fa) ? Resource.Drawable.emoji_1f1f7_1f1fa : 0; break; case 0x1f1e8: icon = (followUnicode == 0x1f1f3) ? Resource.Drawable.emoji_1f1e8_1f1f3 : 0; break; case 0x1f1f0: icon = (followUnicode == 0x1f1f7) ? Resource.Drawable.emoji_1f1f0_1f1f7 : 0; break; default: followSkip = 0; break; } skip += followSkip; } } } if (icon > 0) { text.SetSpan(new EmojiconSpan(context, icon, emojiSize), i, i + skip, SpanTypes.ExclusiveExclusive); } } }
// 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; }
private static void HandleFormatRun(ISpannable spannableString, IAttributedTextRun run) { var attributes = run.Attributes; var start = run.Start; var end = start + run.Length; var fontName = attributes.GetFontName(); if (fontName != null) { var typefaceSpan = new TypefaceSpan(fontName); spannableString.SetSpan(typefaceSpan, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetBold() && attributes.GetItalic()) { var span = new StyleSpan(TypefaceStyle.BoldItalic); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } else if (attributes.GetBold()) { var span = new StyleSpan(TypefaceStyle.Bold); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } else if (attributes.GetItalic()) { var span = new StyleSpan(TypefaceStyle.Italic); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetUnderline()) { var span = new UnderlineSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } var foregroundColor = attributes.GetForegroundColor()?.ParseAsInts()?.ToColor(); if (foregroundColor != null) { var span = new ForegroundColorSpan((global::Android.Graphics.Color)foregroundColor); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } var backgroundColor = attributes.GetBackgroundColor()?.ParseAsInts()?.ToColor(); if (backgroundColor != null) { var span = new BackgroundColorSpan((global::Android.Graphics.Color)backgroundColor); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetSubscript()) { var span = new SubscriptSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetSuperscript()) { var span = new SuperscriptSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetStrikethrough()) { var span = new StrikethroughSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetUnorderedList()) { var bulletSpan = new BulletSpan(); spannableString.SetSpan(bulletSpan, start, end, SpanTypes.ExclusiveExclusive); } }