parent
bc7ca1b9a5
commit
90df0fded0
@ -0,0 +1,104 @@ |
||||
package com.android.base.widget.ratio; |
||||
|
||||
import android.content.Context; |
||||
import android.graphics.Canvas; |
||||
import android.graphics.Paint; |
||||
import android.graphics.drawable.Drawable; |
||||
import android.text.TextPaint; |
||||
import android.util.AttributeSet; |
||||
import android.view.Gravity; |
||||
|
||||
/** |
||||
* 应用场景,比如:当 TextView 的 width 为 match 时,此时使用的 leftDrawable 是靠左的,且无法通过 Gravity 属性来修改其位置。该控件用于类似此种情况下使 Drawable 居中,仅支持单个方向的 Drawable。 |
||||
* 优先级为:左、上、右、下。 |
||||
* |
||||
* @author Ztiany |
||||
* Email: 1169654504@qq.com |
||||
*/ |
||||
public class CenterDrawableTextView extends RatioTextView { |
||||
|
||||
private Paint.FontMetrics metrics = new Paint.FontMetrics(); |
||||
|
||||
public CenterDrawableTextView(Context context) { |
||||
super(context); |
||||
} |
||||
|
||||
public CenterDrawableTextView(Context context, AttributeSet attrs) { |
||||
super(context, attrs); |
||||
} |
||||
|
||||
public CenterDrawableTextView(Context context, AttributeSet attrs, int defStyleAttr) { |
||||
super(context, attrs, defStyleAttr); |
||||
} |
||||
|
||||
@Override |
||||
protected void onDraw(Canvas canvas) { |
||||
Drawable[] compoundDrawables = getCompoundDrawables(); |
||||
setToCenterPadding(compoundDrawables, canvas); |
||||
super.onDraw(canvas); |
||||
} |
||||
|
||||
private void setToCenterPadding(Drawable[] compoundDrawables, Canvas canvas) { |
||||
if (compoundDrawables == null) { |
||||
return; |
||||
} |
||||
|
||||
Drawable leftDrawable = compoundDrawables[0]; |
||||
Drawable topDrawable = compoundDrawables[1]; |
||||
Drawable rightDrawable = compoundDrawables[2]; |
||||
Drawable bottomDrawable = compoundDrawables[3]; |
||||
|
||||
if (leftDrawable != null) { |
||||
setLeftDrawableCenter(canvas, leftDrawable); |
||||
} else if (topDrawable != null) { |
||||
setTopDrawableCenter(canvas, topDrawable); |
||||
} else if (rightDrawable != null) { |
||||
setRightDrawableCenter(canvas, rightDrawable); |
||||
} else if (bottomDrawable != null) { |
||||
setBottomDrawableCenter(canvas, bottomDrawable); |
||||
} |
||||
} |
||||
|
||||
private void setBottomDrawableCenter(Canvas canvas, Drawable downDrawable) { |
||||
setGravity(Gravity.BOTTOM | getGravity()); |
||||
|
||||
int compoundDrawablePadding = getCompoundDrawablePadding(); |
||||
TextPaint paint = getPaint(); |
||||
paint.getFontMetrics(metrics); |
||||
float contentHeight = (metrics.bottom - metrics.top + compoundDrawablePadding + downDrawable.getIntrinsicHeight()); |
||||
int measuredHeight = getMeasuredHeight(); |
||||
canvas.translate(0F, -(measuredHeight / 2.0F - contentHeight / 2)); |
||||
} |
||||
|
||||
private void setRightDrawableCenter(Canvas canvas, Drawable rightDrawable) { |
||||
setGravity(Gravity.END | getGravity()); |
||||
|
||||
int compoundDrawablePadding = getCompoundDrawablePadding(); |
||||
TextPaint paint = getPaint(); |
||||
float measureText = paint.measureText(getText().toString()); |
||||
float contentWidth = (measureText + compoundDrawablePadding + rightDrawable.getIntrinsicHeight()); |
||||
int measuredWidth = getMeasuredWidth(); |
||||
canvas.translate(-(measuredWidth / 2.0F - contentWidth / 2), 0F); |
||||
} |
||||
|
||||
private void setLeftDrawableCenter(Canvas canvas, Drawable leftDrawable) { |
||||
setGravity(Gravity.START | getGravity()); |
||||
|
||||
int compoundDrawablePadding = getCompoundDrawablePadding(); |
||||
TextPaint paint = getPaint(); |
||||
float measureText = paint.measureText(getText().toString()); |
||||
float contentWidth = (measureText + compoundDrawablePadding + leftDrawable.getIntrinsicHeight()); |
||||
int measuredWidth = getMeasuredWidth(); |
||||
canvas.translate((measuredWidth / 2.0F - contentWidth / 2), 0F); |
||||
} |
||||
|
||||
private void setTopDrawableCenter(Canvas canvas, Drawable topDrawable) { |
||||
int compoundDrawablePadding = getCompoundDrawablePadding(); |
||||
TextPaint paint = getPaint(); |
||||
paint.getFontMetrics(metrics); |
||||
float contentHeight = (metrics.bottom - metrics.top + compoundDrawablePadding + topDrawable.getIntrinsicHeight()); |
||||
int measuredHeight = getMeasuredHeight(); |
||||
canvas.translate(0F, (measuredHeight / 2.0F - contentHeight / 2)); |
||||
} |
||||
|
||||
} |
@ -1,58 +0,0 @@ |
||||
package com.android.base.widget.ratio; |
||||
|
||||
import android.content.Context; |
||||
import android.graphics.Canvas; |
||||
import android.graphics.Paint; |
||||
import android.graphics.drawable.Drawable; |
||||
import android.text.TextPaint; |
||||
import android.util.AttributeSet; |
||||
|
||||
/** |
||||
* 使 TopDrawable 居中,不要设置 gravity 属性为 center 或 center_vertical |
||||
* |
||||
* @author Ztiany |
||||
* Email: 1169654504@qq.com |
||||
*/ |
||||
public class TopDrawableCenterTextView extends RatioTextView { |
||||
|
||||
private Paint.FontMetrics metrics = new Paint.FontMetrics(); |
||||
|
||||
public TopDrawableCenterTextView(Context context) { |
||||
super(context); |
||||
} |
||||
|
||||
public TopDrawableCenterTextView(Context context, AttributeSet attrs) { |
||||
super(context, attrs); |
||||
} |
||||
|
||||
public TopDrawableCenterTextView(Context context, AttributeSet attrs, int defStyleAttr) { |
||||
super(context, attrs, defStyleAttr); |
||||
} |
||||
|
||||
@Override |
||||
protected void onDraw(Canvas canvas) { |
||||
Drawable[] compoundDrawables = getCompoundDrawables(); |
||||
setToCenterPadding(compoundDrawables, canvas); |
||||
super.onDraw(canvas); |
||||
} |
||||
|
||||
private void setToCenterPadding(Drawable[] compoundDrawables, Canvas canvas) { |
||||
if (compoundDrawables == null) { |
||||
return; |
||||
} |
||||
|
||||
Drawable topDrawable = compoundDrawables[1]; |
||||
|
||||
if (topDrawable == null) { |
||||
return; |
||||
} |
||||
|
||||
int compoundDrawablePadding = getCompoundDrawablePadding(); |
||||
TextPaint paint = getPaint(); |
||||
paint.getFontMetrics(metrics); |
||||
float contentHeight = (metrics.bottom - metrics.top + compoundDrawablePadding + topDrawable.getIntrinsicHeight()); |
||||
int measuredHeight = getMeasuredHeight(); |
||||
canvas.translate(0, measuredHeight / 2 - contentHeight / 2); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue