CompoundDrawable大小

Android-Lint在某些情况下给了我这个提示:

这个标签和它的孩子可以用一个和一个复合可绘制来replace

我可以在一些地方做到这一点,但在缩放图像的其他地方很重要,我无法做到这一点。 有没有任何选项,我可以设置复合可绘制的大小?

Solutions Collecting From Web of "CompoundDrawable大小"

如果将代码中的图像缩放为可绘制对象,则可以使用TextView的setCompoundDrawables()方法将其设置为代码。 这将需要在Drawable上调用setBounds()。

据我所知,没有办法在XML中设置大小。

我终于为它发布了一个库:

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

使用这个库来设置复合绘图的大小。

原始答案

你可以添加自定义属性到你的视图来处理drawable的大小。 当然,这个解决scheme需要额外的代码,但只有一次! 只能使用xml解决问题(只能更改控件并在所有项目中使用它)。

看我的例子:

TextViewDrawableSize.java

公共类TextViewDrawableSize扩展TextView {

     private int mDrawableWidth;
    私人诠释mDrawableHeight;

    公共TextViewDrawableSize(上下文上下文){
        超级(上下文);
         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);

        尝试{
             mDrawableWidth = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableWidth,-1);
             mDrawableHeight = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableHeight,-1);
        最后{
             array.recycle();
         }

        如果(mDrawableWidth> 0 || mDrawableHeight> 0){
             initCompoundDrawableSize();
         }
     }

    私人无效initCompoundDrawableSize(){
         Drawable [] drawables = getCompoundDrawables();
         for(Drawable drawable:drawables){
             if(drawable == null){
                继续;
             }

             Rect realBounds = drawable.getBounds();
             float scaleFactor = realBounds.height()/(float)realBounds.width();

             float drawableWidth = realBounds.width();
             float drawableHeight = realBounds.height();

            如果(mDrawableWidth> 0){
                 //保存图像的比例因子
                 if(drawableWidth> mDrawableWidth){
                     drawableWidth = mDrawableWidth;
                     drawableHeight = drawableWidth * scaleFactor;
                 }
             }
            如果(mDrawableHeight> 0){
                 //保存图像的比例因子

                 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

 <resources> <declare-styleable name="TextViewDrawableSize"> <attr name="compoundDrawableWidth" format="dimension"/> <attr name="compoundDrawableHeight" format="dimension"/> </declare-styleable> </resources> 

和用法

  <com.alt.view.TextViewDrawableSize android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/logo" android:drawableStart="@drawable/logo" android:drawablePadding="@dimen/space_micro" app:compoundDrawableHeight="@dimen/small_logo_height" app:compoundDrawableWidth="@dimen/small_logo_width" /> 

有一个解决scheme,但它不是100%满意,因为你不能直接控制大小只有相对填充inset

background.xml

 <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="4dp" android:insetTop="4dp" android:insetLeft="4dp" android:insetRight="4dp"> <bitmap android:src="@drawable/your_icon"/> </inset> 

layout.xml

 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your text" android:drawableLeft="@drawable/background" android:drawablePadding="8dp" /> 

另一种解决scheme将ScaleDrawables ,但我想这将不会在不同的像素密度工作。

我知道这个答案有点晚,但我会build议使用quickfix:“添加忽略'UseCompoundDrawables'元素”

这将导致如下所示:

 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" tools:ignore="UseCompoundDrawables" > <!-- This will remove the warning --> <ImageView android:layout_width="@dimen/icon_width" android:layout_height="@dimen/icon_height" android:contentDescription="@string/item1" android:src="@drawable/icon1" /> <TextView android:text="@string/item1" android:textSize="@dimen/label_font_size" /> </LinearLayout> 

谨慎使用,并希望API或工具很快得到“修复”。