From 455e8f1a4b0d0c9ed2b33f54ac7e7f35e52ab43f Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Tue, 15 Dec 2020 11:43:00 +0100 Subject: [PATCH 1/2] fix(android): when possible only call setBackgroundColor # Conflicts: # packages/core/ui/styling/background.android.ts --- packages/core/ui/styling/background.android.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/core/ui/styling/background.android.ts b/packages/core/ui/styling/background.android.ts index dff881522b..90204423e9 100644 --- a/packages/core/ui/styling/background.android.ts +++ b/packages/core/ui/styling/background.android.ts @@ -44,8 +44,11 @@ export namespace ad { const constantState = drawable.getConstantState(); androidView._cachedDrawable = constantState || drawable; } - - if (isSetColorFilterOnlyWidget(nativeView) && drawable && !background.hasBorderWidth() && !background.hasBorderRadius() && !background.clipPath && !background.image && background.color) { + const onlyColor = !background.hasBorderWidth() && !background.hasBorderRadius() && !background.clipPath && !background.image && !!background.color; + if (drawable instanceof android.graphics.drawable.ColorDrawable && onlyColor) { + drawable.setColor(background.color.android); + drawable.invalidateSelf(); + } else if (isSetColorFilterOnlyWidget(nativeView) && drawable && onlyColor) { if (drawable instanceof org.nativescript.widgets.BorderDrawable && androidView._cachedDrawable) { if (!(androidView._cachedDrawable instanceof android.graphics.drawable.Drawable.ConstantState)) { return; @@ -60,6 +63,9 @@ export namespace ad { drawable.setColorFilter(backgroundColor, android.graphics.PorterDuff.Mode.SRC_IN); drawable.invalidateSelf(); // Make sure the drawable is invalidated. Android forgets to invalidate it in some cases: toolbar (drawable).backgroundColor = backgroundColor; + } else if (onlyColor) { + // this is the fastest way to change only background color + nativeView.setBackgroundColor(background.color.android); } else if (!background.isEmpty()) { let backgroundDrawable = drawable as org.nativescript.widgets.BorderDrawable; if (!(drawable instanceof org.nativescript.widgets.BorderDrawable)) { From 9bbcddb278bdef2cd440a94c3d789779bcbf85cf Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Wed, 30 Dec 2020 16:22:04 +0100 Subject: [PATCH 2/2] fix: check if already a borderDrawable --- packages/core/ui/styling/background.android.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/ui/styling/background.android.ts b/packages/core/ui/styling/background.android.ts index 90204423e9..f63c967d6a 100644 --- a/packages/core/ui/styling/background.android.ts +++ b/packages/core/ui/styling/background.android.ts @@ -44,6 +44,7 @@ export namespace ad { const constantState = drawable.getConstantState(); androidView._cachedDrawable = constantState || drawable; } + const isBorderDrawable = drawable instanceof org.nativescript.widgets.BorderDrawable; const onlyColor = !background.hasBorderWidth() && !background.hasBorderRadius() && !background.clipPath && !background.image && !!background.color; if (drawable instanceof android.graphics.drawable.ColorDrawable && onlyColor) { drawable.setColor(background.color.android); @@ -63,12 +64,12 @@ export namespace ad { drawable.setColorFilter(backgroundColor, android.graphics.PorterDuff.Mode.SRC_IN); drawable.invalidateSelf(); // Make sure the drawable is invalidated. Android forgets to invalidate it in some cases: toolbar (drawable).backgroundColor = backgroundColor; - } else if (onlyColor) { + } else if (!isBorderDrawable && onlyColor) { // this is the fastest way to change only background color nativeView.setBackgroundColor(background.color.android); } else if (!background.isEmpty()) { let backgroundDrawable = drawable as org.nativescript.widgets.BorderDrawable; - if (!(drawable instanceof org.nativescript.widgets.BorderDrawable)) { + if (!isBorderDrawable) { backgroundDrawable = new org.nativescript.widgets.BorderDrawable(layout.getDisplayDensity(), view.toString()); refreshBorderDrawable(view, backgroundDrawable); nativeView.setBackground(backgroundDrawable);