CompoundDrawable size

后端 未结 6 2051
臣服心动
臣服心动 2020-12-08 14:32

Android-Lint gives me this hint in some cases:

This tag and its children can be replaced by one and a compound drawable

I cou

6条回答
  •  青春惊慌失措
    2020-12-08 15:12

    I finally released a library for it:

    https://github.com/a-tolstykh/textview-rich-drawable

    Use this library to set size of compound drawable.

    Original answer

    You can add custom attribute to your view to work with size of drawable. Of course, this solution requires additional code, but only once! After you can solve the problem using xml only (only once change the control and use it in all project).

    See my example:

    TextViewDrawableSize.java

    public class TextViewDrawableSize extends TextView {
    
        private int mDrawableWidth;
        private int mDrawableHeight;
    
        public TextViewDrawableSize(Context context) {
            super(context);
            init(context, null, 0, 0);
        }
    
        public TextViewDrawableSize(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs, 0, 0);
        }
    
        public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context, attrs, defStyleAttr, 0);
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            init(context, attrs, defStyleAttr, defStyleRes);
        }
    
        private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextViewDrawableSize, defStyleAttr, defStyleRes);
    
            try {
                mDrawableWidth = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableWidth, -1);
                mDrawableHeight = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableHeight, -1);
            } finally {
                array.recycle();
            }
    
            if (mDrawableWidth > 0 || mDrawableHeight > 0) {
                initCompoundDrawableSize();
            }
        }
    
        private void initCompoundDrawableSize() {
            Drawable[] drawables = getCompoundDrawables();
            for (Drawable drawable : drawables) {
                if (drawable == null) {
                    continue;
                }
    
                Rect realBounds = drawable.getBounds();
                float scaleFactor = realBounds.height() / (float) realBounds.width();
    
                float drawableWidth = realBounds.width();
                float drawableHeight = realBounds.height();
    
                if (mDrawableWidth > 0) {
                    // save scale factor of image
                    if (drawableWidth > mDrawableWidth) {
                        drawableWidth = mDrawableWidth;
                        drawableHeight = drawableWidth * scaleFactor;
                    }
                }
                if (mDrawableHeight > 0) {
                    // save scale factor of image
    
                    if (drawableHeight > mDrawableHeight) {
                        drawableHeight = mDrawableHeight;
                        drawableWidth = drawableHeight / scaleFactor;
                    }
                }
    
                realBounds.right = realBounds.left + Math.round(drawableWidth);
                realBounds.bottom = realBounds.top + Math.round(drawableHeight);
    
                drawable.setBounds(realBounds);
            }
            setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]);
        }
    }

    attrs.xml

    
        
            
            
        
    
    

    And usage

        
    

提交回复
热议问题