From 21f30edddcc5a53682fe0fae021adab13d5f44a7 Mon Sep 17 00:00:00 2001 From: Ashutosh Gangwar Date: Mon, 14 Feb 2022 02:03:19 +0530 Subject: [PATCH 1/3] let loader views respect 'android:gravity' and 'android:textAlignment' --- .../loaderviewlibrary/LoaderController.java | 32 +++++++++++++++---- .../loaderviewlibrary/LoaderImageView.java | 6 ++++ .../loaderviewlibrary/LoaderTextView.java | 27 ++++++++++++++++ .../loaderviewlibrary/LoaderView.java | 2 ++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java index cc6d9ab..438bd0e 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java @@ -5,9 +5,13 @@ import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Paint; +import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.view.animation.LinearInterpolator; +import androidx.core.text.TextUtilsCompat; +import androidx.core.view.GravityCompat; +import java.util.Locale; /* * Copyright 2016 Elye Project @@ -36,6 +40,7 @@ class LoaderController implements ValueAnimator.AnimatorUpdateListener { private float heightWeight = LoaderConstant.MAX_WEIGHT; private boolean useGradient = LoaderConstant.USE_GRADIENT_DEFAULT; private int corners = LoaderConstant.CORNER_DEFAULT; + private RectF loaderContainer; private final static int MAX_COLOR_CONSTANT_VALUE = 255; private final static int ANIMATION_CYCLE_DURATION = 750; //milis @@ -56,21 +61,17 @@ public void onDraw(Canvas canvas) { } public void onDraw(Canvas canvas, float left_pad, float top_pad, float right_pad, float bottom_pad) { - float margin_height = canvas.getHeight() * (1 - heightWeight) / 2; rectPaint.setAlpha((int) (progress * MAX_COLOR_CONSTANT_VALUE)); if (useGradient) { prepareGradient(canvas.getWidth() * widthWeight); } - canvas.drawRoundRect(new RectF(0 + left_pad, - margin_height + top_pad, - canvas.getWidth() * widthWeight - right_pad, - canvas.getHeight() - margin_height - bottom_pad), - corners, corners, - rectPaint); + prepareLoaderContainer(canvas, left_pad, top_pad, right_pad, bottom_pad); + canvas.drawRoundRect(loaderContainer, corners, corners, rectPaint); } public void onSizeChanged() { linearGradient = null; + loaderContainer = null; startLoading(); } @@ -82,6 +83,23 @@ private void prepareGradient(float width) { rectPaint.setShader(linearGradient); } + private void prepareLoaderContainer(Canvas canvas, float left_pad, float top_pad, float right_pad, float bottom_pad) { + if (loaderContainer != null) { + return; + } + final Rect outRect = new Rect(); + GravityCompat.apply(loaderView.getLoaderGravity(), + Math.round(canvas.getWidth() * widthWeight), + Math.round(canvas.getHeight() * heightWeight), + new Rect(0, 0, canvas.getWidth(), canvas.getHeight()), + outRect, + TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault())); + loaderContainer = new RectF(outRect.left + left_pad, + outRect.top + top_pad, + outRect.right - right_pad, + outRect.bottom - bottom_pad); + } + public void startLoading() { if (valueAnimator != null && !loaderView.valueSet()) { valueAnimator.cancel(); diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderImageView.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderImageView.java index 0796273..de56f13 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderImageView.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderImageView.java @@ -24,6 +24,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.util.AttributeSet; +import android.view.Gravity; import androidx.appcompat.widget.AppCompatImageView; import androidx.core.content.ContextCompat; @@ -85,6 +86,11 @@ public boolean valueSet() { return (getDrawable() != null); } + @Override + public int getLoaderGravity() { + return Gravity.NO_GRAVITY; + } + @Override public void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java index fd84fb5..bfa1ab4 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java @@ -16,13 +16,16 @@ * limitations under the License. */ +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; +import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; +import android.view.Gravity; import androidx.appcompat.widget.AppCompatTextView; import androidx.core.content.ContextCompat; @@ -31,6 +34,7 @@ public class LoaderTextView extends AppCompatTextView implements LoaderView { private LoaderController loaderController; private int defaultColorResource; private int darkerColorResource; + private int loaderGravity; public LoaderTextView(Context context) { super(context); @@ -47,6 +51,7 @@ public LoaderTextView(Context context, AttributeSet attrs, int defStyleAttr) { init(attrs); } + @SuppressLint("SwitchIntDef") private void init(AttributeSet attrs) { loaderController = new LoaderController(this); TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.loader_view, 0, 0); @@ -57,6 +62,23 @@ private void init(AttributeSet attrs) { defaultColorResource = typedArray.getColor(R.styleable.loader_view_custom_color, ContextCompat.getColor(getContext(), R.color.default_color)); darkerColorResource = typedArray.getColor(R.styleable.loader_view_custom_color, ContextCompat.getColor(getContext(), R.color.darker_color)); typedArray.recycle(); + loaderGravity = getGravity(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // prefer text alignment when available. + final int verticalGravity = loaderGravity & Gravity.VERTICAL_GRAVITY_MASK; + switch (getTextAlignment()) { + case android.view.View.TEXT_ALIGNMENT_CENTER: + loaderGravity = verticalGravity | Gravity.CENTER_HORIZONTAL; + break; + case android.view.View.TEXT_ALIGNMENT_TEXT_END: + case android.view.View.TEXT_ALIGNMENT_VIEW_END: + loaderGravity = verticalGravity | Gravity.END; + break; + case android.view.View.TEXT_ALIGNMENT_TEXT_START: + case android.view.View.TEXT_ALIGNMENT_VIEW_START: + loaderGravity = verticalGravity | Gravity.START; + break; + } + } } @Override @@ -104,6 +126,11 @@ public boolean valueSet() { return !TextUtils.isEmpty(getText()); } + @Override + public int getLoaderGravity() { + return loaderGravity; + } + @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderView.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderView.java index e688680..547a550 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderView.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderView.java @@ -24,4 +24,6 @@ interface LoaderView { void invalidate(); boolean valueSet(); + + int getLoaderGravity(); } From 41917a0af9b622af1e106762c7eeb79d874fae44 Mon Sep 17 00:00:00 2001 From: Ashutosh Gangwar Date: Mon, 14 Feb 2022 02:18:07 +0530 Subject: [PATCH 2/3] remove suppress lint annotation from LoaderTextView#init() --- .../java/com/elyeproj/loaderviewlibrary/LoaderTextView.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java index bfa1ab4..35d1e62 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java @@ -16,7 +16,6 @@ * limitations under the License. */ -import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -51,7 +50,6 @@ public LoaderTextView(Context context, AttributeSet attrs, int defStyleAttr) { init(attrs); } - @SuppressLint("SwitchIntDef") private void init(AttributeSet attrs) { loaderController = new LoaderController(this); TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.loader_view, 0, 0); From e3760f41f7fdf89e579f7e4e19493c6e6297bc23 Mon Sep 17 00:00:00 2001 From: Ashutosh Gangwar Date: Wed, 23 Feb 2022 13:04:16 +0530 Subject: [PATCH 3/3] fix padding calculation for loader container --- .../elyeproj/loaderviewlibrary/LoaderController.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java index 438bd0e..beed28d 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java @@ -9,8 +9,10 @@ import android.graphics.RectF; import android.graphics.Shader; import android.view.animation.LinearInterpolator; + import androidx.core.text.TextUtilsCompat; import androidx.core.view.GravityCompat; + import java.util.Locale; /* @@ -91,13 +93,13 @@ private void prepareLoaderContainer(Canvas canvas, float left_pad, float top_pad GravityCompat.apply(loaderView.getLoaderGravity(), Math.round(canvas.getWidth() * widthWeight), Math.round(canvas.getHeight() * heightWeight), - new Rect(0, 0, canvas.getWidth(), canvas.getHeight()), + new Rect(Math.round(left_pad), + Math.round(top_pad), + Math.round(canvas.getWidth() - right_pad), + Math.round(canvas.getHeight() - bottom_pad)), outRect, TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault())); - loaderContainer = new RectF(outRect.left + left_pad, - outRect.top + top_pad, - outRect.right - right_pad, - outRect.bottom - bottom_pad); + loaderContainer = new RectF(outRect.left, outRect.top, outRect.right, outRect.bottom); } public void startLoading() {