public CollapsingView(Context context, IAttributeSet attrs = null, int defStyleAttr = 0) : base(context, attrs, defStyleAttr) { if (expandDrawable == null) { expandDrawable = GetDrawable(Resource.Drawable.ic_expand_more_black_24dp); collapseDrawable = GetDrawable(Resource.Drawable.ic_expand_less_black_24dp); } var titleView = context.GetSystemService <LayoutInflater>(Context.LayoutInflaterService).Inflate(Resource.Layout.collapse_header, this); titleTextView = titleView.FindViewById <TextView>(Resource.Id.text); iconView = titleView.FindViewById <ImageView>(Resource.Id.icon); iconView.SetImageDrawable(expandDrawable); titleView.Click += delegate { Toggle(); }; Orientation = Orientation.Vertical; ChildViewAdded += (sender, args) => args.Child.Visibility = isExpanded ? ViewStates.Visible : ViewStates.Gone; var padding = MLHelpers.DpToPixelsInt(5); SetPadding(padding, padding, padding, padding); }
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { var inflater = activity.LayoutInflater; View view; switch (viewType) { case 0: view = inflater.Inflate(Android.Resource.Layout.SimpleListItem1, parent, false); var text = view.FindViewById <TextView>(Android.Resource.Id.Text1); text.SetTextAppearance(activity, Android.Resource.Attribute.TextAppearanceLarge); var value = new TypedValue(); activity.Theme.ResolveAttribute(Resource.Attribute.colorAccent, value, true); text.SetTextColor(new Color(value.Data)); return(new ViewHolder(view)); default: view = inflater.Inflate(Android.Resource.Layout.SimpleListItem2, parent, false); view.FindViewById <TextView>(Android.Resource.Id.Text2).SetTextAppearance(activity, Android.Resource.Attribute.TextAppearanceMedium); view.SetPaddingRelative(MLHelpers.DpToPixelsInt(20), view.PaddingTop, view.PaddingEnd, view.PaddingBottom); return(new ViewHolder(view)); } }
private async Task <bool> AddProfile(SpannableStringBuilder builder, TagNode node, IDictionary <int, Bitmap> inlines, LinearLayout parent, GravityFlags gravity) { if (!layoutTags.Contains(node.Tag.Name)) { return(false); } AddTextView(builder, parent, gravity); var parameter = node.AttributeValues.Count > 0 ? node.AttributeValues.Values.First() : null; LinearLayout newParent; switch (node.Tag.Name) { case "collapse": newParent = new CollapsingView(Activity) { LayoutParameters = defaultLayoutParams, Title = parameter }; break; case "indent": newParent = new LinearLayout(Activity) { LayoutParameters = defaultLayoutParams, Orientation = Orientation.Vertical }; newParent.SetPaddingRelative(MLHelpers.DpToPixelsInt(10), 0, 0, 0); break; case "left": case "center": case "right": newParent = new LinearLayout(Activity) { LayoutParameters = defaultLayoutParams, Orientation = Orientation.Vertical }; gravity = node.Tag.Name == "center" ? GravityFlags.Center : node.Tag.Name == "right" ? GravityFlags.End : GravityFlags.Start; newParent.SetHorizontalGravity(gravity); break; case "hr": var value = new TypedValue(); Activity.Theme.ResolveAttribute(Resource.Attribute.colorAccent, value, true); var hr = new View(Activity) { LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, MLHelpers.DpToPixelsInt(2)) }; hr.SetBackgroundColor(new Color(value.Data)); parent.AddView(hr); return(true); case "heading": var heading = new TextView(Activity) { LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent) { BottomMargin = MLHelpers.DpToPixelsInt(5) }, Text = node.ToText() }; heading.SetTextSize(ComplexUnitType.Sp, 22); parent.AddView(heading); return(true); case "img": var image = new ImageView(Activity) { LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent) }; image.SetImageBitmap(inlines[int.Parse(parameter)]); parent.AddView(image); return(true); case "quote": newParent = new LinearLayout(Activity) { LayoutParameters = defaultLayoutParams, Orientation = Orientation.Vertical }; var padding = MLHelpers.DpToPixelsInt(5); newParent.SetPadding(padding, padding, padding, padding); newParent.SetBackgroundResource(Resource.Drawable.background_quote); var text = new TextView(Activity) { LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent) { BottomMargin = MLHelpers.DpToPixelsInt(5) }, Text = Strings.Profile_Quote }; text.SetTypeface(null, TypefaceStyle.Bold); newParent.AddView(text); return(true); default: return(false); } parent.AddView(newParent); var remaining = await BBCodeBinding.GetFormatted(node, (n, b) => AddProfile(b, n, inlines, newParent, gravity)); AddTextView(remaining, newParent, gravity); return(true); }
private static async Task <bool> ApplyCustomHandlers(SpannableStringBuilder builder, TagNode node, Func <TagNode, SpannableStringBuilder, Task <bool> > customHandler) { if (customHandler != null && await customHandler(node, builder)) { return(true); } var start = builder.Length(); var parameter = node.AttributeValues.Count > 0 ? node.AttributeValues.Values.First() : null; switch (node.Tag.Name) { case "session": builder.Append(" " + parameter); builder.SetSpan(new ImageSpan(sessionIcon.Value), start, start + 1, SpanTypes.MarkMark); builder.SetSpan(new ClickableSpan(view => { var channel = parameter; var channelManager = Mvx.GetSingleton <IChannelManager>(); if (channelManager.JoinedChannels.ContainsKey(channel)) { ViewChannel(channel); return; } NotifyCollectionChangedEventHandler listener = null; listener = (sender, args) => { if (args.Action != NotifyCollectionChangedAction.Add || args.NewItems.Cast <Channel>().All(x => x.Name != channel)) { return; } ViewChannel(channel); channelManager.JoinedChannels.CollectionChanged -= listener; }; channelManager.JoinedChannels.CollectionChanged += listener; channelManager.JoinChannel(channel); }), start + 1, builder.Length(), 0); return(true); case "icon": case "eicon": builder.Append(' '); var icon = node.Tag.Name == "icon" ? Helpers.GetAvatar(node.ToText()) : $"https://static.f-list.net/images/eicon/{node.ToText()}.gif"; var image = new BitmapDrawable(await Mvx.GetSingleton <IMvxImageCache <Bitmap> >().RequestImage(icon)); var size = MLHelpers.DpToPixelsInt(40); image.SetBounds(0, 0, size, size); builder.SetSpan(new ImageSpan(image), start, start + 1, 0); return(true); case "user": var name = node.ToText(); builder.Append(" " + name); var character = Mvx.GetSingleton <ICharacterManager>().GetCharacter(name); builder.SetSpan(new ImageSpan(StatusIconConverter.GetDrawable(character.Status)), start, start + 1, SpanTypes.MarkMark); builder.SetSpan(new PureClickableSpan(view => { Mvx.GetSingleton <IViewModelNavigator>().Show <CharacterViewModel, string>(character.Name); }), start, builder.Length(), 0); builder.SetSpan(new ForegroundColorSpan(new Color(CharacterViewModel.GetColor(character).ARGB)), start + 1, builder.Length(), 0); if (character.IsBookmarked || character.IsFriend) { builder.SetSpan(new ColoredUnderlineSpan(unchecked ((int)0xff00cc00)), start + 1, builder.Length(), 0); } return(true); default: return(false); } }