Skip to content

Commit f9935b0

Browse files
committed
处理文本渐变色属性没有适配 RTL 特性的问题
1 parent ae46a41 commit f9935b0

6 files changed

Lines changed: 71 additions & 17 deletions

File tree

library/src/main/java/com/hjq/shape/builder/TextColorBuilder.java

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.hjq.shape.builder;
22

3+
import android.content.Context;
34
import android.content.res.ColorStateList;
5+
import android.content.res.Configuration;
6+
import android.content.res.Resources;
47
import android.content.res.TypedArray;
58
import android.graphics.Canvas;
69
import android.graphics.Color;
@@ -11,6 +14,7 @@
1114
import android.support.annotation.Nullable;
1215
import android.text.SpannableStringBuilder;
1316
import android.text.Spanned;
17+
import android.view.View;
1418
import android.widget.LinearLayout;
1519
import android.widget.TextView;
1620
import android.widget.TextView.BufferType;
@@ -317,21 +321,16 @@ public void intoTextColor() {
317321
mTextView.postInvalidate();
318322
}
319323

320-
public void onDraw(@NonNull Canvas canvas, Paint paint) {
324+
public void onDraw(@NonNull View view, @NonNull Canvas canvas, Paint paint) {
321325
if (isTextGradientColorsEnable()) {
322-
LinearGradient linearGradient;
323-
if (mTextGradientOrientation == GRADIENT_ORIENTATION_VERTICAL) {
324-
linearGradient = new LinearGradient(
325-
mTextView.getPaddingLeft(), mTextView.getPaddingTop(), 0,
326-
(float) canvas.getHeight() - mTextView.getPaddingBottom(),
327-
mTextGradientColors, null, Shader.TileMode.CLAMP);
326+
int[] textGradientColors;
327+
if (mTextGradientOrientation == GRADIENT_ORIENTATION_HORIZONTAL &&
328+
getLayoutDirectionByContext(view.getContext()) == View.LAYOUT_DIRECTION_RTL) {
329+
textGradientColors = reverseArray(mTextGradientColors);
328330
} else {
329-
linearGradient = new LinearGradient(
330-
mTextView.getPaddingLeft(), mTextView.getPaddingTop(),
331-
(float) canvas.getWidth() - mTextView.getPaddingEnd(),
332-
(float) canvas.getHeight() - mTextView.getPaddingBottom(),
333-
mTextGradientColors, null, Shader.TileMode.CLAMP);
331+
textGradientColors = mTextGradientColors;
334332
}
333+
LinearGradient linearGradient = getLinearGradient(view, canvas, mTextGradientOrientation, textGradientColors);
335334
paint.setShader(linearGradient);
336335
} else {
337336
Shader shader = paint.getShader();
@@ -340,4 +339,59 @@ public void onDraw(@NonNull Canvas canvas, Paint paint) {
340339
}
341340
}
342341
}
342+
343+
/**
344+
* 获取线性渐变对象
345+
*/
346+
private static LinearGradient getLinearGradient(@NonNull View view, @NonNull Canvas canvas,
347+
int textGradientOrientation,
348+
@Nullable int[] textGradientColors) {
349+
LinearGradient linearGradient;
350+
if (textGradientOrientation == GRADIENT_ORIENTATION_VERTICAL) {
351+
linearGradient = new LinearGradient(
352+
view.getPaddingLeft(), view.getPaddingTop(), 0,
353+
(float) canvas.getHeight() - view.getPaddingBottom(),
354+
textGradientColors, null, Shader.TileMode.CLAMP);
355+
} else {
356+
linearGradient = new LinearGradient(
357+
view.getPaddingLeft(), view.getPaddingTop(),
358+
(float) canvas.getWidth() - view.getPaddingEnd(),
359+
(float) canvas.getHeight() - view.getPaddingBottom(),
360+
textGradientColors, null, Shader.TileMode.CLAMP);
361+
}
362+
return linearGradient;
363+
}
364+
365+
/**
366+
* 从 Context 中获取当前布局方向
367+
*/
368+
private static int getLayoutDirectionByContext(@Nullable Context context) {
369+
int layoutDirection;
370+
Resources resources = null;
371+
Configuration configuration = null;
372+
if (context != null) {
373+
resources = context.getResources();
374+
}
375+
if (resources != null) {
376+
configuration = resources.getConfiguration();
377+
}
378+
if (configuration != null) {
379+
layoutDirection = configuration.getLayoutDirection();
380+
} else {
381+
layoutDirection = View.LAYOUT_DIRECTION_LTR;
382+
}
383+
return layoutDirection;
384+
}
385+
386+
/**
387+
* 反转 int 数组
388+
*/
389+
public static int[] reverseArray(@NonNull int[] originalArray) {
390+
int length = originalArray.length;
391+
int[] newArray = new int[length];
392+
for (int i = 0; i < length; i++) {
393+
newArray[i] = originalArray[length - 1 - i];
394+
}
395+
return newArray;
396+
}
343397
}

library/src/main/java/com/hjq/shape/view/ShapeButton.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void setText(CharSequence text, BufferType type) {
6868

6969
@Override
7070
protected void onDraw(Canvas canvas) {
71-
mTextColorBuilder.onDraw(canvas, getPaint());
71+
mTextColorBuilder.onDraw(this, canvas, getPaint());
7272
super.onDraw(canvas);
7373
}
7474

library/src/main/java/com/hjq/shape/view/ShapeCheckBox.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void setText(CharSequence text, BufferType type) {
8383

8484
@Override
8585
protected void onDraw(Canvas canvas) {
86-
mTextColorBuilder.onDraw(canvas, getPaint());
86+
mTextColorBuilder.onDraw(this, canvas, getPaint());
8787
super.onDraw(canvas);
8888
}
8989

library/src/main/java/com/hjq/shape/view/ShapeEditText.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void setText(CharSequence text, BufferType type) {
6868

6969
@Override
7070
protected void onDraw(Canvas canvas) {
71-
mTextColorBuilder.onDraw(canvas, getPaint());
71+
mTextColorBuilder.onDraw(this, canvas, getPaint());
7272
super.onDraw(canvas);
7373
}
7474

library/src/main/java/com/hjq/shape/view/ShapeRadioButton.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void setText(CharSequence text, BufferType type) {
8383

8484
@Override
8585
protected void onDraw(Canvas canvas) {
86-
mTextColorBuilder.onDraw(canvas, getPaint());
86+
mTextColorBuilder.onDraw(this, canvas, getPaint());
8787
super.onDraw(canvas);
8888
}
8989

library/src/main/java/com/hjq/shape/view/ShapeTextView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void setText(CharSequence text, BufferType type) {
6868

6969
@Override
7070
protected void onDraw(Canvas canvas) {
71-
mTextColorBuilder.onDraw(canvas, getPaint());
71+
mTextColorBuilder.onDraw(this, canvas, getPaint());
7272
super.onDraw(canvas);
7373
}
7474

0 commit comments

Comments
 (0)