Skip to content
This repository was archived by the owner on May 15, 2025. It is now read-only.

Commit 393f580

Browse files
Touch and press effect is added
1 parent 666c244 commit 393f580

14 files changed

Lines changed: 370 additions & 10 deletions

File tree

example/ExampleMaterialDesignControls/Pages/MaterialButtonPage.xaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
<material:MaterialButton IsEnabled="false" Text="Save" Icon="save.png" DisabledIcon="save.png" CornerRadius="20" Command="{Binding TapCommand}" CommandParameter="Saved" />
1515
<material:MaterialOutlineButton IsEnabled="false" Text="Cancel" Command="{Binding TapCommand}" CornerRadius="20" CommandParameter="Canceled" />
1616
<material:MaterialFlatButton IsEnabled="false" Text="Delete" Icon="delete.png" DisabledIcon="delete.png" Command="{Binding TapCommand}" CommandParameter="Deleted" />
17+
18+
<Label Text="Animations" HorizontalTextAlignment="Center" />
19+
<material:MaterialButton Animation="None" Text="None" ToUpper="True" />
20+
<material:MaterialButton Animation="Fade" AnimationParameter="0.6" Text="Fade" ToUpper="True" />
21+
<material:MaterialButton Animation="Scale" AnimationParameter="0.98" Text="Scale" ToUpper="True" />
1722
</StackLayout>
1823
</ScrollView>
1924
</ContentPage.Content>

example/ExampleMaterialDesignControls/Pages/MaterialButtonPage.xaml.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,18 @@ public MaterialButtonPage()
2121

2222
public async void OnTap(object parameter)
2323
{
24-
if (parameter is string && ((string)parameter).ToString().Equals("Saved"))
24+
if (parameter != null)
2525
{
26-
this.btnSave.IsBusy = true;
27-
await Task.Delay(2000);
28-
this.btnSave.IsBusy = false;
29-
}
26+
if (parameter is string && ((string)parameter).ToString().Equals("Saved"))
27+
{
28+
this.btnSave.IsBusy = true;
29+
await Task.Delay(2000);
30+
this.btnSave.IsBusy = false;
31+
}
3032

31-
string text = parameter.ToString();
32-
await this.DisplayAlert("", text, "Ok");
33+
string text = parameter.ToString();
34+
await this.DisplayAlert("", text, "Ok");
35+
}
3336
}
3437
}
3538
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Android.Runtime;
5+
using Xamarin.Forms.Platform.Android;
6+
7+
namespace Plugin.MaterialDesignControls.Android
8+
{
9+
[Preserve(AllMembers = true)]
10+
public static class Effects
11+
{
12+
private static List<PlatformEffect> _allEffects = new List<PlatformEffect>();
13+
14+
public static void Init()
15+
{
16+
_allEffects = new List<PlatformEffect>(typeof(Effects).Assembly.GetTypes()
17+
.Where(t => typeof(PlatformEffect).IsAssignableFrom(t))
18+
.Select(t => (PlatformEffect)Activator.CreateInstance(t)));
19+
}
20+
}
21+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System;
2+
using Android.Views;
3+
using Plugin.MaterialDesignControls.Effects;
4+
using Xamarin.Forms;
5+
using Xamarin.Forms.Platform.Android;
6+
using View = Android.Views.View;
7+
using TouchAndPressEffect = Plugin.MaterialDesignControls.Android.TouchAndPressEffect;
8+
9+
[assembly: ResolutionGroupName(Plugin.MaterialDesignControls.Effects.TouchAndPressEffect.EffectIdPrefix)]
10+
[assembly: ExportEffect(typeof(TouchAndPressEffect), nameof(TouchAndPressEffect))]
11+
12+
namespace Plugin.MaterialDesignControls.Android
13+
{
14+
public class TouchAndPressEffect : PlatformEffect
15+
{
16+
private View _view;
17+
private ITouchAndPressEffectConsumer _touchAndPressEffectConsumer;
18+
19+
protected override void OnAttached()
20+
{
21+
_view = Control ?? Container;
22+
23+
if (_view != null && Element is ITouchAndPressEffectConsumer touchAndPressEffectConsumer)
24+
{
25+
_view.Touch += OnViewOnTouch;
26+
_touchAndPressEffectConsumer = touchAndPressEffectConsumer;
27+
}
28+
}
29+
30+
protected override void OnDetached()
31+
{
32+
if (_view != null)
33+
{
34+
_view.Touch -= OnViewOnTouch;
35+
}
36+
}
37+
38+
private void OnViewOnTouch(object sender, View.TouchEventArgs e)
39+
{
40+
switch (e.Event.ActionMasked)
41+
{
42+
case MotionEventActions.ButtonPress:
43+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Pressing);
44+
break;
45+
case MotionEventActions.ButtonRelease:
46+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Released);
47+
break;
48+
case MotionEventActions.Cancel:
49+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Cancelled);
50+
break;
51+
case MotionEventActions.Down:
52+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Pressing);
53+
break;
54+
case MotionEventActions.HoverEnter:
55+
break;
56+
case MotionEventActions.HoverExit:
57+
break;
58+
case MotionEventActions.HoverMove:
59+
break;
60+
case MotionEventActions.Mask:
61+
break;
62+
case MotionEventActions.Move:
63+
break;
64+
case MotionEventActions.Outside:
65+
break;
66+
case MotionEventActions.Pointer1Down:
67+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Pressing);
68+
break;
69+
case MotionEventActions.Pointer1Up:
70+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Released);
71+
break;
72+
case MotionEventActions.Pointer2Down:
73+
break;
74+
case MotionEventActions.Pointer2Up:
75+
break;
76+
case MotionEventActions.Pointer3Down:
77+
break;
78+
case MotionEventActions.Pointer3Up:
79+
break;
80+
case MotionEventActions.PointerIdMask:
81+
break;
82+
case MotionEventActions.PointerIdShift:
83+
break;
84+
case MotionEventActions.Up:
85+
_touchAndPressEffectConsumer?.ConsumeEvent(EventType.Released);
86+
break;
87+
default:
88+
throw new ArgumentOutOfRangeException();
89+
}
90+
}
91+
}
92+
}

src/MaterialDesignControls.Android/MaterialDesignControls.Android.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@
131131
<Compile Include="Renderers\MaterialEditorRenderer.cs" />
132132
<Compile Include="Renderers\MaterialLabelRenderer.cs" />
133133
<Compile Include="Renderers\MaterialButtonRenderer.cs" />
134+
<Compile Include="Effects\TouchAndPressEffect.cs" />
135+
<Compile Include="Effects.cs" />
134136
</ItemGroup>
135137
<ItemGroup>
136138
<None Include="Resources\AboutResources.txt" />
@@ -141,6 +143,7 @@
141143
</ItemGroup>
142144
<ItemGroup>
143145
<Folder Include="Renderers\" />
146+
<Folder Include="Effects\" />
144147
</ItemGroup>
145148
<ItemGroup>
146149
<ProjectReference Include="..\MaterialDesignControls\MaterialDesignControls.csproj">

src/MaterialDesignControls.Android/Renderers.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ public static class Renderer
44
{
55
public static void Init()
66
{
7+
Effects.Init();
78
MaterialDatePickerRenderer.Init();
89
MaterialEntryRenderer.Init();
910
MaterialPickerRenderer.Init();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Foundation;
5+
using Xamarin.Forms.Platform.iOS;
6+
7+
namespace Plugin.MaterialDesignControls.iOS
8+
{
9+
[Preserve(AllMembers = true)]
10+
public static class Effects
11+
{
12+
private static List<PlatformEffect> _allEffects = new List<PlatformEffect>();
13+
14+
public static void Init()
15+
{
16+
_allEffects = new List<PlatformEffect>(typeof(Effects).Assembly.GetTypes()
17+
.Where(t => typeof(PlatformEffect).IsAssignableFrom(t))
18+
.Select(t => (PlatformEffect)Activator.CreateInstance(t)));
19+
}
20+
}
21+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Foundation;
2+
using Plugin.MaterialDesignControls.Effects;
3+
using UIKit;
4+
using Xamarin.Forms;
5+
using Xamarin.Forms.Platform.iOS;
6+
using TouchAndPressEffect = Plugin.MaterialDesignControls.iOS.TouchAndPressEffect;
7+
8+
[assembly: ResolutionGroupName(Plugin.MaterialDesignControls.Effects.TouchAndPressEffect.EffectIdPrefix)]
9+
[assembly: ExportEffect(typeof(TouchAndPressEffect), nameof(TouchAndPressEffect))]
10+
11+
namespace Plugin.MaterialDesignControls.iOS
12+
{
13+
public class TouchAndPressEffect : PlatformEffect
14+
{
15+
private UIView _view;
16+
private TouchAndPressGestureRecognizer _touchAndPressGestureRecognizer;
17+
18+
protected override void OnAttached()
19+
{
20+
_view = Control ?? Container;
21+
22+
if (Element is ITouchAndPressEffectConsumer touchAndPressEffectConsumer)
23+
{
24+
_view.UserInteractionEnabled = true;
25+
26+
_touchAndPressGestureRecognizer = new TouchAndPressGestureRecognizer(touchAndPressEffectConsumer);
27+
_view.AddGestureRecognizer(_touchAndPressGestureRecognizer);
28+
}
29+
}
30+
31+
protected override void OnDetached()
32+
{
33+
if (_view != null && _touchAndPressGestureRecognizer != null)
34+
{
35+
_view.RemoveGestureRecognizer(_touchAndPressGestureRecognizer);
36+
}
37+
}
38+
39+
private class TouchAndPressGestureRecognizer : UIGestureRecognizer
40+
{
41+
private readonly ITouchAndPressEffectConsumer _touchAndPressEffectConsumer;
42+
43+
public TouchAndPressGestureRecognizer(ITouchAndPressEffectConsumer touchAndPressEffectConsumer)
44+
{
45+
_touchAndPressEffectConsumer = touchAndPressEffectConsumer;
46+
}
47+
48+
public override void PressesBegan(NSSet<UIPress> presses, UIPressesEvent evt)
49+
{
50+
base.PressesBegan(presses, evt);
51+
_touchAndPressEffectConsumer.ConsumeEvent(EventType.Pressing);
52+
}
53+
54+
public override void TouchesBegan(NSSet touches, UIEvent evt)
55+
{
56+
base.TouchesBegan(touches, evt);
57+
58+
_touchAndPressEffectConsumer.ConsumeEvent(EventType.Pressing);
59+
}
60+
61+
public override void PressesEnded(NSSet<UIPress> presses, UIPressesEvent evt)
62+
{
63+
base.PressesEnded(presses, evt);
64+
_touchAndPressEffectConsumer.ConsumeEvent(EventType.Released);
65+
}
66+
67+
public override void TouchesEnded(NSSet touches, UIEvent evt)
68+
{
69+
base.TouchesEnded(touches, evt);
70+
_touchAndPressEffectConsumer.ConsumeEvent(EventType.Released);
71+
}
72+
73+
public override void PressesCancelled(NSSet<UIPress> presses, UIPressesEvent evt)
74+
{
75+
base.PressesCancelled(presses, evt);
76+
_touchAndPressEffectConsumer.ConsumeEvent(EventType.Cancelled);
77+
}
78+
79+
public override void TouchesCancelled(NSSet touches, UIEvent evt)
80+
{
81+
base.TouchesCancelled(touches, evt);
82+
_touchAndPressEffectConsumer.ConsumeEvent(EventType.Cancelled);
83+
}
84+
}
85+
}
86+
}

src/MaterialDesignControls.iOS/MaterialDesignControls.iOS.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
<ItemGroup>
6666
<Folder Include="Resources\" />
6767
<Folder Include="Renderers\" />
68+
<Folder Include="Effects\" />
6869
</ItemGroup>
6970
<ItemGroup>
7071
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -75,6 +76,8 @@
7576
<Compile Include="Renderers\MaterialTimePickerRenderer.cs" />
7677
<Compile Include="Renderers\MaterialEditorRenderer.cs" />
7778
<Compile Include="Renderers\MaterialLabelRenderer.cs" />
79+
<Compile Include="Effects\TouchAndPressEffect.cs" />
80+
<Compile Include="Effects.cs" />
7881
</ItemGroup>
7982
<ItemGroup>
8083
<ProjectReference Include="..\MaterialDesignControls\MaterialDesignControls.csproj">

src/MaterialDesignControls.iOS/Renderers.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ public static class Renderer
44
{
55
public static void Init()
66
{
7+
Effects.Init();
78
MaterialDatePickerRenderer.Init();
89
MaterialEntryRenderer.Init();
910
MaterialPickerRenderer.Init();

0 commit comments

Comments
 (0)