在 TextView 上绘制背景(不是全宽)
Drawing background on TextView (not on its full width)
我想在 TextView 上设置背景可绘制对象(或资源),而不考虑其复合可绘制对象宽度(和填充)。
获取复合的宽度(更精确的是留一个),它的填充应该没有问题,但是背景设置在textview的宽度减去复合drawable的宽度(描述以上)。
如果您对此有任何建议,请告诉我。
这是所需的结果:
PS。我想过有一个水平的 LinearLayout,它有一个 ImageView 和 TextView 作为它的 children,并且只在 textview 上设置背景,但我有兴趣用更少的视图(在这种情况下,只有一个)获得相同的结果, 如果可能的话。
您可以使用支持插入的 LayerDrawable,例如:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:left="dimension" android:right="dimension">
<shape android:shape="rectangle">
<solid android:color="color" />
</shape>
</item>
</layer-list>
如果您想动态更改 Drawable,最好编写自己的 Drawable class。下面的 DividerDrawable 例如在白色背景上绘制一条线到给定的填充:
public class DividerDrawable extends Drawable {
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float mDensity;
private int mPaddingLeft = 0;
public DividerDrawable(Context context) {
mPaint.setColor(Color.BLACK);
mDensity = context.getResources().getDisplayMetrics().density;
}
@Override
public void draw(Canvas canvas) {
int width = canvas.getWidth();
int height = canvas.getHeight();
canvas.drawColor(Color.WHITE);
canvas.drawRect(mPaddingLeft, height - mDensity, width, height, mPaint);
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
public void setPaddingLeft(int paddingLeft) {
if (mPaddingLeft != paddingLeft) {
mPaddingLeft = paddingLeft;
invalidateSelf();
}
}
}
要根据您的左侧 CompoundDrawable 设置左侧填充,您可以这样做:
private void setBackground(TextView textView, DividerDrawable background) {
Drawable drawableLeft = textView.getCompoundDrawables()[0];
int paddingLeft = drawableLeft != null ?
textView.getPaddingLeft() + drawableLeft.getIntrinsicWidth() + textView.getCompoundDrawablePadding() :
textView.getPaddingLeft();
background.setPaddingLeft(paddingLeft);
textView.setBackground(background);
}
要充分利用这一切,请这样称呼它:
DividerDrawable dividerDrawable = new DividerDrawable(this);
TextView textView = (TextView) findViewById(R.id.text);
setBackground(textView, dividerDrawable);
我想在 TextView 上设置背景可绘制对象(或资源),而不考虑其复合可绘制对象宽度(和填充)。
获取复合的宽度(更精确的是留一个),它的填充应该没有问题,但是背景设置在textview的宽度减去复合drawable的宽度(描述以上)。
如果您对此有任何建议,请告诉我。
这是所需的结果:
PS。我想过有一个水平的 LinearLayout,它有一个 ImageView 和 TextView 作为它的 children,并且只在 textview 上设置背景,但我有兴趣用更少的视图(在这种情况下,只有一个)获得相同的结果, 如果可能的话。
您可以使用支持插入的 LayerDrawable,例如:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:left="dimension" android:right="dimension">
<shape android:shape="rectangle">
<solid android:color="color" />
</shape>
</item>
</layer-list>
如果您想动态更改 Drawable,最好编写自己的 Drawable class。下面的 DividerDrawable 例如在白色背景上绘制一条线到给定的填充:
public class DividerDrawable extends Drawable {
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float mDensity;
private int mPaddingLeft = 0;
public DividerDrawable(Context context) {
mPaint.setColor(Color.BLACK);
mDensity = context.getResources().getDisplayMetrics().density;
}
@Override
public void draw(Canvas canvas) {
int width = canvas.getWidth();
int height = canvas.getHeight();
canvas.drawColor(Color.WHITE);
canvas.drawRect(mPaddingLeft, height - mDensity, width, height, mPaint);
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
public void setPaddingLeft(int paddingLeft) {
if (mPaddingLeft != paddingLeft) {
mPaddingLeft = paddingLeft;
invalidateSelf();
}
}
}
要根据您的左侧 CompoundDrawable 设置左侧填充,您可以这样做:
private void setBackground(TextView textView, DividerDrawable background) {
Drawable drawableLeft = textView.getCompoundDrawables()[0];
int paddingLeft = drawableLeft != null ?
textView.getPaddingLeft() + drawableLeft.getIntrinsicWidth() + textView.getCompoundDrawablePadding() :
textView.getPaddingLeft();
background.setPaddingLeft(paddingLeft);
textView.setBackground(background);
}
要充分利用这一切,请这样称呼它:
DividerDrawable dividerDrawable = new DividerDrawable(this);
TextView textView = (TextView) findViewById(R.id.text);
setBackground(textView, dividerDrawable);