Is it possible to scale drawableleft & drawableright in textview?

前端 未结 8 2191
悲&欢浪女
悲&欢浪女 2020-12-14 05:53

I have TextView with drawableLeft & drawableRight in List item. The problem is, whenever the height of TextView is l

8条回答
  •  醉梦人生
    2020-12-14 06:14

    I think the cleanest solution would be to override TextView. Here's an example:

    https://gist.github.com/hrules6872/578b52fe90c30c7445a2

    I changed a bit:

    private void resizeCompoundDrawables() {
        Drawable[] drawables = getCompoundDrawables();
        if (compoundDrawableWidth > 0 || compoundDrawableHeight > 0) {
            for (Drawable drawable : drawables) {
                if (drawable == null) continue;
    
                Rect realBounds = drawable.getBounds();
    
                float drawableWidth = realBounds.width();
                if(this.compoundDrawableWidth>0)
                    drawableWidth = this.compoundDrawableWidth;
                float drawableHeight = realBounds.height();
                if(this.compoundDrawableHeight>0)
                    drawableHeight = this.compoundDrawableHeight;
    
                realBounds.right = realBounds.left + Math.round(drawableWidth);
                realBounds.bottom = realBounds.top + Math.round(drawableHeight);
    
                drawable.setBounds(realBounds);
            }
        }
        super.setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]);
    }
    

    This way you can set the size of the drawable but if you care about width/height ratio make it the way suits you.

    Now if you want it to automatically match height of the textview you may also override the TextView's method onSizeChanged:

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        compoundDrawableHeight = h;
        resizeCompoundDrawables();
    }
    

    You my also want to declare sizes for each side, for example leftCompoundDrawableWidth, rightCompoundDrawableWidth and so on.

    Note that it does not work with a Shape as drawable. Sounds like TextView only accepts it if it has the size attributes, that way one can implement it by updating the size of the shapedrawable using setSize or setIntrinsicWidth or ... Not tested.

提交回复
热议问题