コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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)));
            }
        }
コード例 #5
0
        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));
            }
        }
コード例 #6
0
ファイル: SpannableTools.cs プロジェクト: kishoredbn/Android
		// 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;
		}