Revert "Fix border on android buttons (#941)" (#1178)

* Revert "Fix border on android buttons  (#941)"

This reverts commit aa9bca1341d4233a0fb3428968d31531c371d834.

* Fix merge conflicts
This commit is contained in:
Samantha Houts 2017-10-16 07:19:23 -07:00 коммит произвёл Rui Marinho
Родитель d141374a23
Коммит 8623fc25b2
7 изменённых файлов: 158 добавлений и 178 удалений

Просмотреть файл

@ -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" />