diff --git a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java index cc6d9ab..beed28d 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderController.java @@ -5,10 +5,16 @@ 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 +42,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 +63,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 +85,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(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, outRect.top, outRect.right, outRect.bottom); + } + 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..35d1e62 100644 --- a/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java +++ b/loaderviewlibrary/src/main/java/com/elyeproj/loaderviewlibrary/LoaderTextView.java @@ -21,8 +21,10 @@ 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 +33,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); @@ -57,6 +60,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 +124,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(); }