【问题标题】:Drawing background on TextView (not on its full width)在 TextView 上绘制背景(不是全宽)
【发布时间】:2016-03-27 16:19:40
【问题描述】:

我想在 TextView 上设置背景可绘制对象(或资源),而不考虑其复合可绘制宽度(和填充)。

获取复合的宽度(更准确地说是左边的),它的填充应该不是问题,但是在textview的宽度上设置背景减去复合drawable的宽度(如上所述) .

如果您对此有任何建议,请告诉我。

这是所需的结果:

PS。我考虑过使用 ImageView 和 TextView 作为其子级的水平 LinearLayout,并且仅在 textview 上设置背景,但我有兴趣使用更少的视图(在这种情况下,正好是一个)获得相同的结果,如果它是可能。

【问题讨论】:

  • textview 中的背景在哪里(在需要的结果中)?
  • @shreyansjain 在 TextView 的顶部或底部(图片中的分隔线),无论哪种方式都有效。

标签: android textview android-custom-view compound-drawables


【解决方案1】:

您可以使用支持插入的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 类。例如,以下 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 上设置(或更改其位置)可绘制对象(包括来自 xml)时,是否都会调用一种方法。即:setCompoundDrawables / setCompoundDrawablesRelative,还是我需要覆盖每一个并计算新的宽度和填充?
  • 抱歉,我不太关注你。如果您调用 setCompoundDrawables(),将调用 requestLayout() 来处理更改(测量、布局和绘图)。你想达到什么目的?
  • 我的意思是把左边的插图添加到 layerdrawable 的最佳位置在哪里,所以只要左边的 drawable 可见/消失或放置在其他地方,它就会自动改变自己?正如我试图在我的问题中解释的那样,我需要这条灰线不显示在图标上,而只显示在文本上。
  • 你可以为每个状态创建一个drawable并在它们之间切换,或者甚至可以编写你自己的Drawable类。
  • 我设法通过设置带有左填充的可绘制图层列表的背景来做到这一点。我有兴趣动态设置图层列表可绘制的左侧填充(每当我在 TextView 上设置左侧可绘制或左侧填充时,背景(视图顶部的分隔线)应相应缩小其宽度。你能帮我吗用那个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2013-02-13
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多