diff options
author | Rui Marinho <me@ruimarinho.net> | 2017-04-06 14:19:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-06 14:19:52 +0100 |
commit | 425fafb05723a299a5eaa0f6d801f87bdf7141fa (patch) | |
tree | a9e38aa0a0252e6a6d2da6990303d82f2163a5a9 /Xamarin.Forms.Platform.Android/Renderers | |
parent | 829a4bda76166ddffce5a0e84538183b9527a1bd (diff) | |
download | xamarin-forms-425fafb05723a299a5eaa0f6d801f87bdf7141fa.tar.gz xamarin-forms-425fafb05723a299a5eaa0f6d801f87bdf7141fa.tar.bz2 xamarin-forms-425fafb05723a299a5eaa0f6d801f87bdf7141fa.zip |
Android fastrenderers (#845)
* Obsolete IVisualElementRenderer.ViewGroup in favor of .View
* Fix NRE
* Changing TContainer in PlatformEffect to View
* Fix "View" type
* new VisualElementRenderer
* First attempt at a fast(er) button renderer
* Fast Label Renderer
* Let's try that again. Behold: Label Fast Renderer
* Move FrameRenderer into Fast Renderers
* Fix Disposable on VisualElementRenderer
* Simplify touch and click handlers
* Drop empty if clause
* [Android] Add initial Image fast renderer
* Split accessibility out to a separate helper class; fix tapgesture bug with label
* [Android] Small fixes to VisualElementRenderer
* Move accessiblity stuff to a separate class (which needs a good name)
* Prevent query from looking to parent for fast renderers
* [Android] ImageRenderer refactoring
* Fix elevation/z-index bugs with Button (e.g., 40173)
* Move SetLabeledBy to Accessibilitizer
* Un-break automation IDs for Labels
* Move gesture handling to its own class
* Split gesture and effect management into separate classes
* Remove unneeded packager from LabelRenderer
* LabelRenderer inherits from FormsTextView
* Batch updates to View
* Fix isOnParentRenderer check for non-Android platforms
* [Controls] Update Xamarin.Forms.ControlGallery.iOS.csproj
* [Android,IOS] Small fixes to rebase and use of Internals
* [Android] Ignroe warning for now
* Fast renderers now passing InputTransparent and IsEnabled tests
* Fast and legacy renderers now pass the Enabled and InputTransparent tests
* Change PlatformEffect back, default container to null
* Fix mangled using directives
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers')
14 files changed, 75 insertions, 101 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs index e07a2be5..7bb97945 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs @@ -26,6 +26,7 @@ namespace Xamarin.Forms.Platform.Android public ButtonRenderer() { + System.Diagnostics.Debug.WriteLine("Slow Button!"); AutoPackage = false; } diff --git a/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs b/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs index efee571d..c31e8e69 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/CarouselPageAdapter.cs @@ -55,7 +55,7 @@ namespace Xamarin.Forms.Platform.Android Page destroyedPage = holder.Instance.Item2; IVisualElementRenderer renderer = Platform.GetRenderer(destroyedPage); - renderer.ViewGroup.RemoveFromParent(); + renderer.View.RemoveFromParent(); holder.Instance.Item1.RemoveFromParent(); } @@ -90,7 +90,7 @@ namespace Xamarin.Forms.Platform.Android Platform.SetRenderer(child, Platform.CreateRenderer(child)); IVisualElementRenderer renderer = Platform.GetRenderer(child); - renderer.ViewGroup.RemoveFromParent(); + renderer.View.RemoveFromParent(); ViewGroup frame = new PageContainer(_context, renderer); @@ -130,7 +130,7 @@ namespace Xamarin.Forms.Platform.Android IVisualElementRenderer childPageRenderer = Platform.GetRenderer(childPage); if (childPageRenderer != null) { - childPageRenderer.ViewGroup.RemoveFromParent(); + childPageRenderer.View.RemoveFromParent(); childPageRenderer.Dispose(); Platform.SetRenderer(childPage, null); } diff --git a/Xamarin.Forms.Platform.Android/Renderers/ConditionalFocusLayout.cs b/Xamarin.Forms.Platform.Android/Renderers/ConditionalFocusLayout.cs index 311db6b8..5b3002ce 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ConditionalFocusLayout.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ConditionalFocusLayout.cs @@ -30,7 +30,7 @@ namespace Xamarin.Forms.Platform.Android return; IVisualElementRenderer renderer = Platform.GetRenderer(viewCell.View); - (renderer?.ViewGroup?.GetChildAt(0) as EditText)?.SetOnTouchListener(this); + GetEditText(renderer)?.SetOnTouchListener(this); foreach (Element descendant in viewCell.View.Descendants()) { @@ -38,8 +38,14 @@ namespace Xamarin.Forms.Platform.Android if (element == null) continue; renderer = Platform.GetRenderer(element); - (renderer?.ViewGroup?.GetChildAt(0) as EditText)?.SetOnTouchListener(this); + GetEditText(renderer)?.SetOnTouchListener(this); } } + + internal EditText GetEditText(IVisualElementRenderer renderer) + { + var viewGroup = renderer?.View as ViewGroup; + return viewGroup?.GetChildAt(0) as EditText; + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/Renderers/FormsImageView.cs b/Xamarin.Forms.Platform.Android/Renderers/FormsImageView.cs index ae32e16c..dc0bd2fc 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/FormsImageView.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/FormsImageView.cs @@ -5,7 +5,7 @@ using Android.Widget; namespace Xamarin.Forms.Platform.Android { - internal class FormsImageView : ImageView + internal class FormsImageView : ImageView, IImageRendererController { bool _skipInvalidate; diff --git a/Xamarin.Forms.Platform.Android/Renderers/FormsTextView.cs b/Xamarin.Forms.Platform.Android/Renderers/FormsTextView.cs index 1dc25ea9..2b2bcb7a 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/FormsTextView.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/FormsTextView.cs @@ -6,7 +6,7 @@ using Android.Widget; namespace Xamarin.Forms.Platform.Android { - internal class FormsTextView : TextView + public class FormsTextView : TextView { bool _skip; diff --git a/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs index fee05f1b..57937d89 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs @@ -1,14 +1,18 @@ using System; using System.ComponentModel; -using System.IO; -using System.Threading.Tasks; using Android.Graphics; using Android.Views; using AImageView = Android.Widget.ImageView; using Xamarin.Forms.Internals; +using static Xamarin.Forms.Platform.Android.ImageViewExtensions; namespace Xamarin.Forms.Platform.Android { + internal interface IImageRendererController + { + void SkipInvalidate(); + } + public class ImageRenderer : ViewRenderer<Image, AImageView> { bool _isDisposed; @@ -16,6 +20,7 @@ namespace Xamarin.Forms.Platform.Android public ImageRenderer() { + System.Diagnostics.Debug.WriteLine(">>>>> Old Image Renderer"); AutoPackage = false; } @@ -45,8 +50,9 @@ namespace Xamarin.Forms.Platform.Android } _motionEventHelper.UpdateElement(e.NewElement); + + Control.UpdateBitmap(e.NewElement, e.OldElement); - UpdateBitmap(e.OldElement); UpdateAspect(); } @@ -55,7 +61,7 @@ namespace Xamarin.Forms.Platform.Android base.OnElementPropertyChanged(sender, e); if (e.PropertyName == Image.SourceProperty.PropertyName) - UpdateBitmap(); + Control.UpdateBitmap(Element); else if (e.PropertyName == Image.AspectProperty.PropertyName) UpdateAspect(); } @@ -66,66 +72,12 @@ namespace Xamarin.Forms.Platform.Android Control.SetScaleType(type); } - async void UpdateBitmap(Image previous = null) - { - if (Device.IsInvokeRequired) - throw new InvalidOperationException("Image Bitmap must not be updated from background thread"); - - if (previous != null && Equals(previous.Source, Element.Source)) - return; - - ((IImageController)Element).SetIsLoading(true); + public override bool OnTouchEvent(MotionEvent e) + { + if (base.OnTouchEvent(e)) + return true; - var formsImageView = Control as FormsImageView; - formsImageView?.SkipInvalidate(); - - Control.SetImageResource(global::Android.Resource.Color.Transparent); - - ImageSource source = Element.Source; - Bitmap bitmap = null; - IImageSourceHandler handler; - - if (source != null && (handler = Internals.Registrar.Registered.GetHandler<IImageSourceHandler>(source.GetType())) != null) - { - try - { - bitmap = await handler.LoadImageAsync(source, Context); - } - catch (TaskCanceledException) - { - } - catch (IOException ex) - { - Log.Warning("Xamarin.Forms.Platform.Android.ImageRenderer", "Error updating bitmap: {0}", ex); - } - } - - if (Element == null || !Equals(Element.Source, source)) - { - bitmap?.Dispose(); - return; - } - - if (!_isDisposed) - { - if (bitmap == null && source is FileImageSource) - Control.SetImageResource(ResourceManager.GetDrawableByName(((FileImageSource)source).File)); - else - Control.SetImageBitmap(bitmap); - - bitmap?.Dispose(); - - ((IImageController)Element).SetIsLoading(false); - ((IVisualElementController)Element).NativeSizeChanged(); - } - } - - public override bool OnTouchEvent(MotionEvent e) - { - if (base.OnTouchEvent(e)) - return true; - - return _motionEventHelper.HandleMotionEvent(Parent); - } - } + return _motionEventHelper.HandleMotionEvent(Parent); + } + } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/Renderers/ListViewRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ListViewRenderer.cs index a0906915..bd241c1a 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ListViewRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ListViewRenderer.cs @@ -45,14 +45,14 @@ namespace Xamarin.Forms.Platform.Android if (_headerRenderer != null) { - _headerRenderer.ViewGroup.RemoveAllViews(); + (_headerRenderer.View as ViewGroup)?.RemoveAllViews(); _headerRenderer.Dispose(); _headerRenderer = null; } if (_footerRenderer != null) { - _footerRenderer.ViewGroup.RemoveAllViews(); + (_footerRenderer.View as ViewGroup)?.RemoveAllViews(); _footerRenderer.Dispose(); _footerRenderer = null; } @@ -352,12 +352,12 @@ namespace Xamarin.Forms.Platform.Android set { if (_child != null) - RemoveView(_child.ViewGroup); + RemoveView(_child.View); _child = value; if (value != null) - AddView(value.ViewGroup); + AddView(value.View); } } @@ -389,7 +389,7 @@ namespace Xamarin.Forms.Platform.Android int widthSpec = MeasureSpecFactory.MakeMeasureSpec((int)ctx.ToPixels(width), MeasureSpecMode.Exactly); int heightSpec = MeasureSpecFactory.MakeMeasureSpec((int)ctx.ToPixels(request.Request.Height), MeasureSpecMode.Exactly); - _child.ViewGroup.Measure(widthMeasureSpec, heightMeasureSpec); + _child.View.Measure(widthMeasureSpec, heightMeasureSpec); SetMeasuredDimension(widthSpec, heightSpec); } } diff --git a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs index a7bebf1e..fd028df1 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailContainer.cs @@ -54,12 +54,12 @@ namespace Xamarin.Forms.Platform.Android if (renderer == null) Platform.SetRenderer(childView, renderer = Platform.CreateRenderer(childView)); - if (renderer.ViewGroup.Parent != this) + if (renderer.View.Parent != this) { - if (renderer.ViewGroup.Parent != null) - renderer.ViewGroup.RemoveFromParent(); + if (renderer.View.Parent != null) + renderer.View.RemoveFromParent(); SetDefaultBackgroundColor(renderer); - AddView(renderer.ViewGroup); + AddView(renderer.View); renderer.UpdateLayout(); } } @@ -148,7 +148,7 @@ namespace Xamarin.Forms.Platform.Android if (ChildView.BackgroundColor == Color.Default) { TypedArray colors = Context.Theme.ObtainStyledAttributes(new[] { global::Android.Resource.Attribute.ColorBackground }); - renderer.ViewGroup.SetBackgroundColor(new global::Android.Graphics.Color(colors.GetColor(0, 0))); + renderer.View.SetBackgroundColor(new global::Android.Graphics.Color(colors.GetColor(0, 0))); } } } diff --git a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs index d18781a7..7e744bc7 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs @@ -73,6 +73,13 @@ namespace Xamarin.Forms.Platform.Android public event EventHandler<VisualElementChangedEventArgs> ElementChanged; + event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged; + event EventHandler<PropertyChangedEventArgs> IVisualElementRenderer.ElementPropertyChanged + { + add { ElementPropertyChanged += value; } + remove { ElementPropertyChanged -= value; } + } + public SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint) { Measure(widthConstraint, heightConstraint); @@ -142,10 +149,8 @@ namespace Xamarin.Forms.Platform.Android Tracker.UpdateLayout(); } - public ViewGroup ViewGroup - { - get { return this; } - } + public ViewGroup ViewGroup => this; + AView IVisualElementRenderer.View => this; protected override void Dispose(bool disposing) { @@ -237,6 +242,7 @@ namespace Xamarin.Forms.Platform.Android void HandlePropertyChanged(object sender, PropertyChangedEventArgs e) { + ElementPropertyChanged?.Invoke(this, e); if (e.PropertyName == "Master") UpdateMaster(); else if (e.PropertyName == "Detail") diff --git a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs index bf6540b9..5d678287 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs @@ -183,13 +183,13 @@ namespace Xamarin.Forms.Platform.Android void RemovePage(Page page) { IVisualElementRenderer rendererToRemove = Platform.GetRenderer(page); - PageContainer containerToRemove = rendererToRemove == null ? null : (PageContainer)rendererToRemove.ViewGroup.Parent; + PageContainer containerToRemove = rendererToRemove == null ? null : (PageContainer)rendererToRemove.View.Parent; containerToRemove.RemoveFromParent(); if (rendererToRemove != null) { - rendererToRemove.ViewGroup.RemoveFromParent(); + rendererToRemove.View.RemoveFromParent(); rendererToRemove.Dispose(); } @@ -213,8 +213,8 @@ namespace Xamarin.Forms.Platform.Android Page pageToRemove = _current; IVisualElementRenderer rendererToRemove = pageToRemove == null ? null : Platform.GetRenderer(pageToRemove); - PageContainer containerToRemove = rendererToRemove == null ? null : (PageContainer)rendererToRemove.ViewGroup.Parent; - PageContainer containerToAdd = (PageContainer)rendererToAdd.ViewGroup.Parent ?? new PageContainer(Context, rendererToAdd); + PageContainer containerToRemove = rendererToRemove == null ? null : (PageContainer)rendererToRemove.View.Parent; + PageContainer containerToAdd = (PageContainer)rendererToAdd.View.Parent ?? new PageContainer(Context, rendererToAdd); containerToAdd.SetWindowBackground(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/PageContainer.cs b/Xamarin.Forms.Platform.Android/Renderers/PageContainer.cs index 06e33e18..a4e77361 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/PageContainer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/PageContainer.cs @@ -7,7 +7,7 @@ namespace Xamarin.Forms.Platform.Android { public PageContainer(Context context, IVisualElementRenderer child, bool inFragment = false) : base(context) { - AddView(child.ViewGroup); + AddView(child.View); Child = child; IsInFragment = inFragment; } @@ -23,8 +23,8 @@ namespace Xamarin.Forms.Platform.Android protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) { - Child.ViewGroup.Measure(widthMeasureSpec, heightMeasureSpec); - SetMeasuredDimension(Child.ViewGroup.MeasuredWidth, Child.ViewGroup.MeasuredHeight); + Child.View.Measure(widthMeasureSpec, heightMeasureSpec); + SetMeasuredDimension(Child.View.MeasuredWidth, Child.View.MeasuredHeight); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/Renderers/ScrollViewContainer.cs b/Xamarin.Forms.Platform.Android/Renderers/ScrollViewContainer.cs index c79e6137..c9354ce2 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ScrollViewContainer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ScrollViewContainer.cs @@ -32,10 +32,10 @@ namespace Xamarin.Forms.Platform.Android if ((renderer = Platform.GetRenderer(_childView)) == null) Platform.SetRenderer(_childView, renderer = Platform.CreateRenderer(_childView)); - if (renderer.ViewGroup.Parent != null) - renderer.ViewGroup.RemoveFromParent(); + if (renderer.View.Parent != null) + renderer.View.RemoveFromParent(); - AddView(renderer.ViewGroup); + AddView(renderer.View); } } diff --git a/Xamarin.Forms.Platform.Android/Renderers/ScrollViewRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ScrollViewRenderer.cs index b7961411..69020de6 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ScrollViewRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ScrollViewRenderer.cs @@ -7,6 +7,7 @@ using Android.Views; using Android.Widget; using Xamarin.Forms.Internals; using AScrollView = Android.Widget.ScrollView; +using AView = Android.Views.View; namespace Xamarin.Forms.Platform.Android { @@ -39,6 +40,13 @@ namespace Xamarin.Forms.Platform.Android public event EventHandler<VisualElementChangedEventArgs> ElementChanged; + event EventHandler<PropertyChangedEventArgs> ElementPropertyChanged; + event EventHandler<PropertyChangedEventArgs> IVisualElementRenderer.ElementPropertyChanged + { + add { ElementPropertyChanged += value; } + remove { ElementPropertyChanged -= value; } + } + public SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint) { Measure(widthConstraint, heightConstraint); @@ -90,10 +98,9 @@ namespace Xamarin.Forms.Platform.Android Tracker.UpdateLayout(); } - public ViewGroup ViewGroup - { - get { return this; } - } + public ViewGroup ViewGroup => this; + + AView IVisualElementRenderer.View => this; public override void Draw(Canvas canvas) { @@ -239,6 +246,8 @@ namespace Xamarin.Forms.Platform.Android void HandlePropertyChanged(object sender, PropertyChangedEventArgs e) { + ElementPropertyChanged?.Invoke(this, e); + if (e.PropertyName == "Content") LoadContent(); else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName) diff --git a/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs index f2878a80..2d5f3b02 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TabbedRenderer.cs @@ -71,7 +71,7 @@ namespace Xamarin.Forms.Platform.Android if (Platform.GetRenderer(view) == null) Platform.SetRenderer(view, Platform.CreateRenderer(view)); - AddView(Platform.GetRenderer(view).ViewGroup); + AddView(Platform.GetRenderer(view).View); } } }
\ No newline at end of file |