-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
DrawableExtensions.cs
129 lines (110 loc) · 3.14 KB
/
DrawableExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using ADrawable = Android.Graphics.Drawables.Drawable;
using AColorFilter = Android.Graphics.ColorFilter;
using AColor = Android.Graphics.Color;
#if __ANDROID_29__
using ADrawableCompat = AndroidX.Core.Graphics.Drawable.DrawableCompat;
#else
using ADrawableCompat = Android.Support.V4.Graphics.Drawable.DrawableCompat;
#endif
using Android.Graphics;
namespace Xamarin.Forms.Platform.Android
{
enum FilterMode
{
SrcIn,
Multiply,
SrcAtop,
Clear
}
internal static class DrawableExtensions
{
#if __ANDROID_29__
public static BlendMode GetFilterMode(FilterMode mode)
{
switch (mode)
{
case FilterMode.SrcIn:
return BlendMode.SrcIn;
case FilterMode.Multiply:
return BlendMode.Multiply;
case FilterMode.SrcAtop:
return BlendMode.SrcAtop;
case FilterMode.Clear:
return BlendMode.Clear;
}
throw new Exception("Invalid Mode");
}
#else
[Obsolete]
static PorterDuff.Mode GetFilterMode(FilterMode mode)
{
return GetFilterModePre29(mode);
}
#endif
[Obsolete]
static PorterDuff.Mode GetFilterModePre29(FilterMode mode)
{
switch (mode)
{
case FilterMode.SrcIn:
return PorterDuff.Mode.SrcIn;
case FilterMode.Multiply:
return PorterDuff.Mode.Multiply;
case FilterMode.SrcAtop:
return PorterDuff.Mode.SrcAtop;
case FilterMode.Clear:
return PorterDuff.Mode.Clear;
}
throw new Exception("Invalid Mode");
}
public static AColorFilter GetColorFilter(this ADrawable drawable)
{
if (drawable == null)
return null;
return ADrawableCompat.GetColorFilter(drawable);
}
public static void SetColorFilter(this ADrawable drawable, AColorFilter colorFilter)
{
if (drawable == null)
return;
if (colorFilter == null)
ADrawableCompat.ClearColorFilter(drawable);
drawable.SetColorFilter(colorFilter);
}
public static void SetColorFilter(this ADrawable drawable, Color color, AColorFilter defaultColorFilter, FilterMode mode)
{
if (drawable == null)
return;
if (color == Color.Default)
{
SetColorFilter(drawable, defaultColorFilter);
return;
}
drawable.SetColorFilter(color.ToAndroid(), mode);
}
public static void SetColorFilter(this ADrawable drawable, Color color, FilterMode mode)
{
drawable.SetColorFilter(color.ToAndroid(), mode);
}
public static void SetColorFilter(this ADrawable drawable, AColor color, FilterMode mode)
{
#if __ANDROID_29__
if(Forms.Is29OrNewer)
drawable.SetColorFilter(new BlendModeColorFilter(color, GetFilterMode(mode)));
else
#pragma warning disable CS0612 // Type or member is obsolete
#pragma warning disable CS0618 // Type or member is obsolete
drawable.SetColorFilter(color, GetFilterModePre29(mode));
#pragma warning restore CS0618 // Type or member is obsolete
#pragma warning restore CS0612 // Type or member is obsolete
#else
#pragma warning disable CS0612 // Type or member is obsolete
#pragma warning disable CS0618 // Type or member is obsolete
drawable.SetColorFilter(color, GetFilterMode(mode));
#pragma warning restore CS0618 // Type or member is obsolete
#pragma warning restore CS0612 // Type or member is obsolete
#endif
}
}
}