Skip to content

Commit 99c3558

Browse files
committed
#37 Bindable Margins for Android
1 parent 68aa8f9 commit 99c3558

File tree

6 files changed

+80
-30
lines changed

6 files changed

+80
-30
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@ Thumbs.db
4646

4747
**/Resource.designer.cs
4848
/.build/FAKE.4.61.3
49+
/Source/.vs/Plugin.Badge/v15/sqlite3/storage.ide

Source/Plugin.Badge.Abstractions/TabBadge.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ public static void SetBadgeText(BindableObject view, string value)
1616
view.SetValue(BadgeTextProperty, value);
1717
}
1818

19-
2019
public static BindableProperty BadgeColorProperty = BindableProperty.CreateAttached("BadgeColor", typeof(Color), typeof(TabBadge), Color.Default, BindingMode.OneWay);
2120

2221
public static Color GetBadgeColor(BindableObject view)
@@ -64,5 +63,31 @@ public static void SetBadgePosition(BindableObject view, BadgePosition value)
6463
{
6564
view.SetValue(BadgePositionProperty, value);
6665
}
66+
67+
public static BindableProperty BadgeMarginProperty = BindableProperty.CreateAttached("BadgeMargin", typeof(Thickness), typeof(TabBadge), GetDefaultMargins(), BindingMode.OneWay);
68+
69+
public static Thickness GetBadgeMargin(BindableObject view)
70+
{
71+
return (Thickness)view.GetValue(BadgeMarginProperty);
72+
}
73+
74+
public static void SetBadgeMargin(BindableObject view, Thickness value)
75+
{
76+
view.SetValue(BadgeMarginProperty, value);
77+
}
78+
79+
public static Thickness GetDefaultMargins()
80+
{
81+
switch (Device.RuntimePlatform)
82+
{
83+
case Device.Android:
84+
return new Thickness(-10, -5);
85+
case Device.iOS:
86+
case Device.Windows:
87+
return new Thickness(0);
88+
}
89+
90+
return new Thickness(0);
91+
}
6792
}
6893
}

Source/Plugin.Badge.Droid/BadgeView.cs

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ public class BadgeView : TextView
2828
private BadgePosition _position;
2929

3030
public View Target { get; private set; }
31-
public int BadgeMarginH { get; set; }
32-
public int BadgeMarginV { get; set; }
31+
private int _badgeMarginL;
32+
private int _badgeMarginR;
33+
private int _badgeMarginT;
34+
private int _badgeMarginB;
3335

3436
public static int TextSizeDip { get; set; } = 11;
3537

@@ -43,7 +45,7 @@ public BadgePosition Postion
4345
{
4446
return;
4547
}
46-
48+
4749
_position = value;
4850
ApplyLayoutParams();
4951
}
@@ -66,6 +68,16 @@ public Color TextColor
6668
set { SetTextColor(value); }
6769
}
6870

71+
public void SetMargins(float left, float top, float right, float bottom)
72+
{
73+
_badgeMarginL = DipToPixels(left);
74+
_badgeMarginT = DipToPixels(top);
75+
_badgeMarginR = DipToPixels(right);
76+
_badgeMarginB = DipToPixels(bottom);
77+
78+
ApplyLayoutParams();
79+
}
80+
6981
public BadgeView(Context context, View target) : this(context, null, Android.Resource.Attribute.TextViewStyle, target)
7082
{
7183
}
@@ -81,9 +93,11 @@ private void Init(Context context, View target)
8193
Target = target;
8294

8395
// apply defaults
84-
BadgeMarginH = DipToPixels(DefaultHmarginDip);
85-
BadgeMarginV = DipToPixels(DefaultVmarginDip);
86-
96+
_badgeMarginL = DipToPixels(DefaultHmarginDip);
97+
_badgeMarginT = DipToPixels(DefaultVmarginDip);
98+
_badgeMarginR = DipToPixels(DefaultHmarginDip);
99+
_badgeMarginB = DipToPixels(DefaultVmarginDip);
100+
87101
Typeface = Typeface.DefaultBold;
88102
var paddingPixels = DipToPixels(DefaultLrPaddingDip);
89103
SetPadding(paddingPixels, 0, paddingPixels, 0);
@@ -138,7 +152,7 @@ private void ApplyTo(View target)
138152

139153
group.SetClipChildren(false);
140154
group.SetClipToPadding(false);
141-
155+
142156

143157
var container = new FrameLayout(_context);
144158
var index = group.IndexOfChild(target);
@@ -200,47 +214,47 @@ private void ApplyLayoutParams()
200214
{
201215
case BadgePosition.PositionTopLeft:
202216
layoutParameters.Gravity = GravityFlags.Left | GravityFlags.Top;
203-
layoutParameters.SetMargins(BadgeMarginH, BadgeMarginV, 0, 0);
217+
layoutParameters.SetMargins(_badgeMarginL, _badgeMarginT, 0, 0);
204218
break;
205219
case BadgePosition.PositionTopRight:
206220
layoutParameters.Gravity = GravityFlags.Right | GravityFlags.Top;
207-
layoutParameters.SetMargins(0, BadgeMarginV, BadgeMarginH, 0);
221+
layoutParameters.SetMargins(0, _badgeMarginT, _badgeMarginR, 0);
208222
break;
209223
case BadgePosition.PositionBottomLeft:
210224
layoutParameters.Gravity = GravityFlags.Left | GravityFlags.Bottom;
211-
layoutParameters.SetMargins(BadgeMarginH, 0, 0, BadgeMarginV);
225+
layoutParameters.SetMargins(_badgeMarginL, 0, 0, _badgeMarginB);
212226
break;
213227
case BadgePosition.PositionBottomRight:
214228
layoutParameters.Gravity = GravityFlags.Right | GravityFlags.Bottom;
215-
layoutParameters.SetMargins(0, 0, BadgeMarginH, BadgeMarginV);
229+
layoutParameters.SetMargins(0, 0, _badgeMarginR, _badgeMarginB);
216230
break;
217231
case BadgePosition.PositionCenter:
218232
layoutParameters.Gravity = GravityFlags.Center;
219233
layoutParameters.SetMargins(0, 0, 0, 0);
220234
break;
221235
case BadgePosition.PositionTopCenter:
222236
layoutParameters.Gravity = GravityFlags.Center | GravityFlags.Top;
223-
layoutParameters.SetMargins(0, BadgeMarginV, 0, 0);
237+
layoutParameters.SetMargins(0, _badgeMarginT, 0, 0);
224238
break;
225239
case BadgePosition.PositionBottomCenter:
226240
layoutParameters.Gravity = GravityFlags.Center | GravityFlags.Bottom;
227-
layoutParameters.SetMargins(0, 0, 0, BadgeMarginV);
241+
layoutParameters.SetMargins(0, 0, 0, _badgeMarginB);
228242
break;
229243
case BadgePosition.PositionLeftCenter:
230244
layoutParameters.Gravity = GravityFlags.Left | GravityFlags.Center;
231-
layoutParameters.SetMargins(BadgeMarginH, 0, 0, 0);
245+
layoutParameters.SetMargins(_badgeMarginL, 0, 0, 0);
232246
break;
233247
case BadgePosition.PositionRightCenter:
234248
layoutParameters.Gravity = GravityFlags.Right | GravityFlags.Center;
235-
layoutParameters.SetMargins(0, 0, BadgeMarginH, 0);
249+
layoutParameters.SetMargins(0, 0, _badgeMarginR, 0);
236250
break;
237251
}
238252

239253
LayoutParameters = layoutParameters;
240254

241255
}
242256

243-
private int DipToPixels(int dip)
257+
private int DipToPixels(float dip)
244258
{
245259
return (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, dip, Resources.DisplayMetrics);
246260
}

Source/Plugin.Badge.Droid/BadgedTabbedPageRenderer.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ private void AddTabBadge(int tabIndex)
9191
badgeView.Typeface = font.ToTypeface();
9292
}
9393

94+
var margin = TabBadge.GetBadgeMargin(element);
95+
badgeView.SetMargins((float)margin.Left, (float)margin.Top, (float)margin.Right, (float)margin.Bottom);
96+
9497
// set position
9598
badgeView.Postion = TabBadge.GetBadgePosition(element);
9699

@@ -134,11 +137,18 @@ protected virtual void OnTabbedPagePropertyChanged(object sender, System.Compone
134137
return;
135138
}
136139

137-
if(e.PropertyName == TabBadge.BadgePositionProperty.PropertyName)
140+
if (e.PropertyName == TabBadge.BadgePositionProperty.PropertyName)
138141
{
139142
badgeView.Postion = TabBadge.GetBadgePosition(element);
140143
return;
141144
}
145+
146+
if (e.PropertyName == TabBadge.BadgeMarginProperty.PropertyName)
147+
{
148+
var margin = TabBadge.GetBadgeMargin(element);
149+
badgeView.SetMargins((float)margin.Left, (float)margin.Top, (float)margin.Right, (float)margin.Bottom);
150+
return;
151+
}
142152
}
143153

144154
private void OnTabRemoved(object sender, ElementEventArgs e)

Source/Sample/Plugin.Badge.Sample/Plugin.Badge.Sample.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ private ContentPage CreateTab1()
109109

110110
var buttonIncrement = new Button { Text = "Increment" };
111111
buttonIncrement.SetBinding(Button.CommandProperty, "IncrementCommand");
112-
tab1Layout.Children.Add(buttonIncrement);
113-
114112
var buttonDecrement = new Button { Text = "Decrement" };
115113
buttonDecrement.SetBinding(Button.CommandProperty, "DecrementCommand");
114+
115+
tab1Layout.Children.Add(buttonIncrement);
116116
tab1Layout.Children.Add(buttonDecrement);
117117

118118
var buttonChangeColor = new Button { Text = "Change Color" };
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
3-
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4-
xmlns:plugin="clr-namespace:Plugin.Badge.Abstractions;assembly=Plugin.Badge.Abstractions"
5-
x:Class="Plugin.Badge.Sample.TabXaml">
6-
<TabbedPage.Children>
7-
<ContentPage Title="Tab1"
8-
Icon="icontab1.png"
9-
plugin:TabBadge.BadgeText="{Binding Count}">
10-
<StackLayout></StackLayout>
11-
</ContentPage>
12-
</TabbedPage.Children>
3+
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4+
xmlns:plugin="clr-namespace:Plugin.Badge.Abstractions;assembly=Plugin.Badge.Abstractions"
5+
x:Class="Plugin.Badge.Sample.TabXaml">
6+
<TabbedPage.Children>
7+
<ContentPage Title="Tab1"
8+
Icon="icontab1.png"
9+
plugin:TabBadge.BadgeText="{Binding Count}">
10+
<StackLayout></StackLayout>
11+
</ContentPage>
12+
</TabbedPage.Children>
1313
</TabbedPage>

0 commit comments

Comments
 (0)