* Revert "Fix border on android buttons (#941)" This reverts commit aa9bca1341d4233a0fb3428968d31531c371d834. * Fix merge conflicts
This commit is contained in:
Родитель
d141374a23
Коммит
8623fc25b2
|
@ -1,9 +1,14 @@
|
|||
using System;
|
||||
using System.ComponentModel;
|
||||
using Android.Content;
|
||||
using Android.Content.Res;
|
||||
using Android.Graphics;
|
||||
using Android.Graphics.Drawables;
|
||||
using Android.Support.V4.Content;
|
||||
using Android.Support.V7.Widget;
|
||||
using Android.Util;
|
||||
using Xamarin.Forms.Internals;
|
||||
using GlobalResource = Android.Resource;
|
||||
using Object = Java.Lang.Object;
|
||||
using AView = Android.Views.View;
|
||||
using AMotionEvent = Android.Views.MotionEvent;
|
||||
|
@ -14,7 +19,6 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
{
|
||||
public class ButtonRenderer : ViewRenderer<Button, AppCompatButton>, AView.IOnAttachStateChangeListener
|
||||
{
|
||||
ButtonBackgroundTracker _backgroundTracker;
|
||||
TextColorSwitcher _textColorSwitcher;
|
||||
float _defaultFontSize;
|
||||
Typeface _defaultTypeface;
|
||||
|
@ -85,7 +89,6 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
Control.Tag = null;
|
||||
_textColorSwitcher = null;
|
||||
}
|
||||
_backgroundTracker?.Dispose();
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
|
@ -114,12 +117,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
button.AddOnAttachStateChangeListener(this);
|
||||
}
|
||||
|
||||
if (_backgroundTracker == null)
|
||||
_backgroundTracker = new ButtonBackgroundTracker(Element, Control);
|
||||
else
|
||||
_backgroundTracker.Button = e.NewElement;
|
||||
|
||||
UpdateAll();
|
||||
UpdateBackgroundColor();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -146,7 +145,42 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
if (Element == null || Control == null)
|
||||
return;
|
||||
|
||||
_backgroundTracker?.UpdateBackgroundColor();
|
||||
Color backgroundColor = Element.BackgroundColor;
|
||||
if (backgroundColor.IsDefault)
|
||||
{
|
||||
if (Control.SupportBackgroundTintList != null)
|
||||
{
|
||||
Context context = Context;
|
||||
int id = GlobalResource.Attribute.ButtonTint;
|
||||
unchecked
|
||||
{
|
||||
using (var value = new TypedValue())
|
||||
{
|
||||
try
|
||||
{
|
||||
Resources.Theme theme = context.Theme;
|
||||
if (theme != null && theme.ResolveAttribute(id, value, true))
|
||||
#pragma warning disable 618
|
||||
Control.SupportBackgroundTintList = Resources.GetColorStateList(value.Data);
|
||||
#pragma warning restore 618
|
||||
else
|
||||
Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { (int)0xffd7d6d6, 0x7fd7d6d6 });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Internals.Log.Warning("Xamarin.Forms.Platform.Android.ButtonRenderer", "Could not retrieve button background resource: {0}", ex);
|
||||
Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { (int)0xffd7d6d6, 0x7fd7d6d6 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int intColor = backgroundColor.ToAndroid().ToArgb();
|
||||
int disableColor = backgroundColor.MultiplyAlpha(0.5).ToAndroid().ToArgb();
|
||||
Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { intColor, disableColor });
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAll()
|
||||
|
@ -156,16 +190,6 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
UpdateBitmap();
|
||||
UpdateTextColor();
|
||||
UpdateEnabled();
|
||||
UpdateBackgroundColor();
|
||||
UpdateDrawable();
|
||||
}
|
||||
|
||||
void UpdateDrawable()
|
||||
{
|
||||
if (Element == null || Control == null)
|
||||
return;
|
||||
|
||||
_backgroundTracker?.UpdateDrawable();
|
||||
}
|
||||
|
||||
void UpdateBitmap()
|
||||
|
|
|
@ -1,126 +0,0 @@
|
|||
using System;
|
||||
using System.ComponentModel;
|
||||
using Android.Graphics.Drawables;
|
||||
using AButton = Android.Widget.Button;
|
||||
|
||||
namespace Xamarin.Forms.Platform.Android
|
||||
{
|
||||
internal class ButtonBackgroundTracker : IDisposable
|
||||
{
|
||||
Drawable _defaultDrawable;
|
||||
ButtonDrawable _backgroundDrawable;
|
||||
Button _button;
|
||||
AButton _nativeButton;
|
||||
bool _drawableEnabled;
|
||||
bool _disposed;
|
||||
|
||||
public ButtonBackgroundTracker(Button button, AButton nativeButton)
|
||||
{
|
||||
Button = button;
|
||||
_nativeButton = nativeButton;
|
||||
}
|
||||
|
||||
public Button Button
|
||||
{
|
||||
get { return _button; }
|
||||
set
|
||||
{
|
||||
if (_button == value)
|
||||
return;
|
||||
if (_button != null)
|
||||
_button.PropertyChanged -= ButtonPropertyChanged;
|
||||
_button = value;
|
||||
_button.PropertyChanged += ButtonPropertyChanged;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateDrawable()
|
||||
{
|
||||
if (_button == null || _nativeButton == null)
|
||||
return;
|
||||
|
||||
if (_button.BackgroundColor == Color.Default)
|
||||
{
|
||||
if (!_drawableEnabled)
|
||||
return;
|
||||
|
||||
if (_defaultDrawable != null)
|
||||
_nativeButton.SetBackground(_defaultDrawable);
|
||||
|
||||
_drawableEnabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_backgroundDrawable == null)
|
||||
_backgroundDrawable = new ButtonDrawable(_nativeButton.Context.ToPixels);
|
||||
|
||||
_backgroundDrawable.Button = _button;
|
||||
|
||||
if (_drawableEnabled)
|
||||
return;
|
||||
|
||||
if (_defaultDrawable == null)
|
||||
_defaultDrawable = _nativeButton.Background;
|
||||
|
||||
_nativeButton.SetBackground(_backgroundDrawable);
|
||||
_drawableEnabled = true;
|
||||
}
|
||||
|
||||
_nativeButton.Invalidate();
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
if (_drawableEnabled)
|
||||
{
|
||||
_drawableEnabled = false;
|
||||
_backgroundDrawable?.Reset();
|
||||
_backgroundDrawable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateBackgroundColor()
|
||||
{
|
||||
UpdateDrawable();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!_disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_backgroundDrawable?.Dispose();
|
||||
_backgroundDrawable = null;
|
||||
_defaultDrawable?.Dispose();
|
||||
_defaultDrawable = null;
|
||||
if (_button != null)
|
||||
{
|
||||
_button.PropertyChanged -= ButtonPropertyChanged;
|
||||
_button = null;
|
||||
}
|
||||
_nativeButton = null;
|
||||
}
|
||||
_disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
void ButtonPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName.Equals(Button.BorderColorProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(Button.BorderWidthProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(Button.BorderRadiusProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(VisualElement.BackgroundColorProperty.PropertyName))
|
||||
{
|
||||
Reset();
|
||||
UpdateDrawable();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,15 +1,19 @@
|
|||
using System;
|
||||
using System.ComponentModel;
|
||||
using Android.Content;
|
||||
using Android.Content.Res;
|
||||
using Android.Graphics;
|
||||
using Android.Graphics.Drawables;
|
||||
using Android.Support.V7.Widget;
|
||||
using Android.Util;
|
||||
using Android.Views;
|
||||
using Xamarin.Forms.Internals;
|
||||
using GlobalResource = Android.Resource;
|
||||
using AView = Android.Views.View;
|
||||
using AMotionEvent = Android.Views.MotionEvent;
|
||||
using AMotionEventActions = Android.Views.MotionEventActions;
|
||||
using static System.String;
|
||||
using Object = Java.Lang.Object;
|
||||
|
||||
namespace Xamarin.Forms.Platform.Android.FastRenderers
|
||||
{
|
||||
|
@ -26,7 +30,6 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
readonly AutomationPropertiesProvider _automationPropertiesProvider;
|
||||
readonly EffectControlProvider _effectControlProvider;
|
||||
VisualElementTracker _tracker;
|
||||
ButtonBackgroundTracker _backgroundTracker;
|
||||
|
||||
public event EventHandler<VisualElementChangedEventArgs> ElementChanged;
|
||||
public event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged;
|
||||
|
@ -131,11 +134,6 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
oldElement.PropertyChanged -= OnElementPropertyChanged;
|
||||
}
|
||||
|
||||
if (_backgroundTracker == null)
|
||||
_backgroundTracker = new ButtonBackgroundTracker(Button, this);
|
||||
else
|
||||
_backgroundTracker.Button = Button;
|
||||
|
||||
Color currentColor = oldElement?.BackgroundColor ?? Color.Default;
|
||||
if (element.BackgroundColor != currentColor)
|
||||
{
|
||||
|
@ -194,8 +192,6 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
_automationPropertiesProvider?.Dispose();
|
||||
_tracker?.Dispose();
|
||||
|
||||
_backgroundTracker?.Dispose();
|
||||
|
||||
if (Element != null)
|
||||
{
|
||||
Element.PropertyChanged -= OnElementPropertyChanged;
|
||||
|
@ -223,10 +219,6 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
|
||||
void OnElementChanged(ElementChangedEventArgs<Button> e)
|
||||
{
|
||||
if (e.OldElement != null)
|
||||
{
|
||||
_backgroundTracker?.Reset();
|
||||
}
|
||||
if (e.NewElement != null && !_isDisposed)
|
||||
{
|
||||
this.EnsureId();
|
||||
|
@ -238,7 +230,6 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
UpdateIsEnabled();
|
||||
UpdateInputTransparent();
|
||||
UpdateBackgroundColor();
|
||||
UpdateDrawable();
|
||||
|
||||
ElevationHelper.SetElevation(this, e.NewElement);
|
||||
}
|
||||
|
@ -275,6 +266,10 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
else if (e.PropertyName == VisualElement.InputTransparentProperty.PropertyName)
|
||||
{
|
||||
UpdateInputTransparent();
|
||||
}
|
||||
else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
|
||||
{
|
||||
UpdateBackgroundColor();
|
||||
}
|
||||
|
||||
ElementPropertyChanged?.Invoke(this, e);
|
||||
|
@ -306,7 +301,54 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
|
||||
void UpdateBackgroundColor()
|
||||
{
|
||||
_backgroundTracker?.UpdateBackgroundColor();
|
||||
if (Element == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Color backgroundColor = Element.BackgroundColor;
|
||||
if (backgroundColor.IsDefault)
|
||||
{
|
||||
if (SupportBackgroundTintList != null)
|
||||
{
|
||||
Context context = Context;
|
||||
int id = GlobalResource.Attribute.ButtonTint;
|
||||
unchecked
|
||||
{
|
||||
using (var value = new TypedValue())
|
||||
{
|
||||
try
|
||||
{
|
||||
Resources.Theme theme = context.Theme;
|
||||
if (theme != null && theme.ResolveAttribute(id, value, true))
|
||||
#pragma warning disable 618
|
||||
{
|
||||
SupportBackgroundTintList = Resources.GetColorStateList(value.Data);
|
||||
}
|
||||
#pragma warning restore 618
|
||||
else
|
||||
{
|
||||
SupportBackgroundTintList = new ColorStateList(ColorExtensions.States,
|
||||
new[] { (int)0xffd7d6d6, 0x7fd7d6d6 });
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Internals.Log.Warning("Xamarin.Forms.Platform.Android.ButtonRenderer",
|
||||
"Could not retrieve button background resource: {0}", ex);
|
||||
SupportBackgroundTintList = new ColorStateList(ColorExtensions.States,
|
||||
new[] { (int)0xffd7d6d6, 0x7fd7d6d6 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int intColor = backgroundColor.ToAndroid().ToArgb();
|
||||
int disableColor = backgroundColor.MultiplyAlpha(0.5).ToAndroid().ToArgb();
|
||||
SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { intColor, disableColor });
|
||||
}
|
||||
}
|
||||
|
||||
internal void OnNativeFocusChanged(bool hasFocus)
|
||||
|
@ -468,11 +510,5 @@ namespace Xamarin.Forms.Platform.Android.FastRenderers
|
|||
|
||||
_textColorSwitcher.Value.UpdateTextColor(this, Button.TextColor);
|
||||
}
|
||||
|
||||
void UpdateDrawable()
|
||||
{
|
||||
_backgroundTracker?.UpdateDrawable();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@ using Xamarin.Forms.Platform.Android;
|
|||
[assembly: ExportRenderer (typeof (Stepper), typeof (StepperRenderer))]
|
||||
[assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))]
|
||||
[assembly: ExportRenderer (typeof (ScrollView), typeof (ScrollViewRenderer))]
|
||||
[assembly: ExportRenderer (typeof (Toolbar), typeof (ToolbarRenderer))]
|
||||
[assembly: ExportRenderer (typeof (ActivityIndicator), typeof (ActivityIndicatorRenderer))]
|
||||
[assembly: ExportRenderer (typeof (Frame), typeof (FrameRenderer))]
|
||||
[assembly: ExportRenderer (typeof (NavigationMenu), typeof (NavigationMenuRenderer))]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using Android.Graphics;
|
||||
using Android.Graphics.Drawables;
|
||||
using System;
|
||||
|
||||
namespace Xamarin.Forms.Platform.Android
|
||||
{
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
using System;
|
||||
using System.ComponentModel;
|
||||
using Android.Content.Res;
|
||||
using Android.Content;
|
||||
using Android.Graphics;
|
||||
using Android.Graphics.Drawables;
|
||||
using Android.Util;
|
||||
using static System.String;
|
||||
using AButton = Android.Widget.Button;
|
||||
|
@ -14,10 +16,12 @@ namespace Xamarin.Forms.Platform.Android
|
|||
{
|
||||
public class ButtonRenderer : ViewRenderer<Button, AButton>, AView.IOnAttachStateChangeListener
|
||||
{
|
||||
ButtonBackgroundTracker _backgroundTracker;
|
||||
ButtonDrawable _backgroundDrawable;
|
||||
TextColorSwitcher _textColorSwitcher;
|
||||
Drawable _defaultDrawable;
|
||||
float _defaultFontSize;
|
||||
Typeface _defaultTypeface;
|
||||
bool _drawableEnabled;
|
||||
bool _isDisposed;
|
||||
int _imageHeight = -1;
|
||||
|
||||
|
@ -75,7 +79,11 @@ namespace Xamarin.Forms.Platform.Android
|
|||
|
||||
if (disposing)
|
||||
{
|
||||
_backgroundTracker?.Dispose();
|
||||
if (_backgroundDrawable != null)
|
||||
{
|
||||
_backgroundDrawable.Dispose();
|
||||
_backgroundDrawable = null;
|
||||
}
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
|
@ -104,11 +112,15 @@ namespace Xamarin.Forms.Platform.Android
|
|||
button.AddOnAttachStateChangeListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
if (_backgroundTracker == null)
|
||||
_backgroundTracker = new ButtonBackgroundTracker(Element, Control);
|
||||
else
|
||||
_backgroundTracker.Button = e.NewElement;
|
||||
{
|
||||
if (_drawableEnabled)
|
||||
{
|
||||
_drawableEnabled = false;
|
||||
_backgroundDrawable.Reset();
|
||||
_backgroundDrawable = null;
|
||||
}
|
||||
}
|
||||
|
||||
UpdateAll();
|
||||
}
|
||||
|
@ -123,20 +135,27 @@ namespace Xamarin.Forms.Platform.Android
|
|||
UpdateEnabled();
|
||||
else if (e.PropertyName == Button.FontProperty.PropertyName)
|
||||
UpdateFont();
|
||||
else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
|
||||
UpdateDrawable();
|
||||
else if (e.PropertyName == Button.ImageProperty.PropertyName)
|
||||
UpdateBitmap();
|
||||
else if (e.PropertyName == VisualElement.IsVisibleProperty.PropertyName)
|
||||
UpdateText();
|
||||
|
||||
|
||||
if (_drawableEnabled &&
|
||||
(e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName || e.PropertyName == Button.BorderColorProperty.PropertyName || e.PropertyName == Button.BorderRadiusProperty.PropertyName ||
|
||||
e.PropertyName == Button.BorderWidthProperty.PropertyName))
|
||||
{
|
||||
_backgroundDrawable.Reset();
|
||||
Control.Invalidate();
|
||||
}
|
||||
|
||||
base.OnElementPropertyChanged(sender, e);
|
||||
}
|
||||
|
||||
protected override void UpdateBackgroundColor()
|
||||
{
|
||||
if (Element == null || Control == null)
|
||||
return;
|
||||
|
||||
_backgroundTracker?.UpdateBackgroundColor();
|
||||
// Do nothing, the drawable handles this now
|
||||
}
|
||||
|
||||
void UpdateAll()
|
||||
|
@ -207,7 +226,34 @@ namespace Xamarin.Forms.Platform.Android
|
|||
|
||||
void UpdateDrawable()
|
||||
{
|
||||
_backgroundTracker.UpdateDrawable();
|
||||
if (Element.BackgroundColor == Color.Default)
|
||||
{
|
||||
if (!_drawableEnabled)
|
||||
return;
|
||||
|
||||
if (_defaultDrawable != null)
|
||||
Control.SetBackground(_defaultDrawable);
|
||||
|
||||
_drawableEnabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_backgroundDrawable == null)
|
||||
_backgroundDrawable = new ButtonDrawable(Context.ToPixels);
|
||||
|
||||
_backgroundDrawable.Button = Element;
|
||||
|
||||
if (_drawableEnabled)
|
||||
return;
|
||||
|
||||
if (_defaultDrawable == null)
|
||||
_defaultDrawable = Control.Background;
|
||||
|
||||
Control.SetBackground(_backgroundDrawable);
|
||||
_drawableEnabled = true;
|
||||
}
|
||||
|
||||
Control.Invalidate();
|
||||
}
|
||||
|
||||
void UpdateEnabled()
|
||||
|
|
|
@ -116,7 +116,6 @@
|
|||
<Compile Include="AndroidApplicationLifecycleState.cs" />
|
||||
<Compile Include="AndroidTitleBarVisibility.cs" />
|
||||
<Compile Include="AppCompat\FrameRenderer.cs" />
|
||||
<Compile Include="ButtonBackgroundTracker.cs" />
|
||||
<Compile Include="Elevation.cs" />
|
||||
<Compile Include="FastRenderers\AutomationPropertiesProvider.cs" />
|
||||
<Compile Include="AppCompat\PageExtensions.cs" />
|
||||
|
|
Загрузка…
Ссылка в новой задаче