是否可以缩放drawableleft& textview中的drawableright?

时间:2011-03-30 08:26:10

标签: android textview

我的项目列表是TextView;并使用drawableleft& drawableright使TextView成为可能。 问题是,每当textview中的文本较大时,drawableleft& drawableleft没有根据TextView的高度自动缩放。

是否可以缩放drawableleft&的高度。 textview中的drawableright? (我正在使用9个补丁图片)

textview drawableleft & drawableright's height problem

9 个答案:

答案 0 :(得分:23)

这可能会帮到你。 有两个属性 scaleX scaleY

下面的代码将缩小图像和文本的30%。 因此,您必须使用许多" sp"来增加字体大小,以便在重新调整大小(缩放)时,它将适合" sp"你更喜欢。

实施例。如果我将字体设置为18,那么18%中的30%是5.4sp,那么粗略地说,这是我所针对的值,因为当它被缩放时,它将变为13sp

<TextView
        android:textSize="18sp"
        android:scaleX="0.7"
        android:scaleY="0.7"

最后要做的是设置CompundDrawable。

tview.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.xxx), null, null, null);

答案 1 :(得分:8)

我通过引入ScaleDrawable并覆盖其.getIntrisicHeight()来解决等效用例,使其至少为TextView高度。在TextView.addOnLayoutChangeListener尺寸更改中重新绑定Drawable所需的TextView部分适用于API11 +

Drawable underlyingDrawable = 
        new BitmapDrawable(context.getResources(), result);

// Wrap to scale up to the TextView height
final ScaleDrawable scaledLeft = 
        new ScaleDrawable(underlyingDrawable, Gravity.CENTER, 1F, 1F) {
    // Give this drawable a height being at
    // least the TextView height. It will be
    // used by
    // TextView.setCompoundDrawablesWithIntrinsicBounds
    public int getIntrinsicHeight() {
        return Math.max(super.getIntrinsicHeight(), 
                        competitorView.getHeight());
    };
};

// Set explicitly level else the default value
// (0) will prevent .draw to effectively draw
// the underlying Drawable
scaledLeft.setLevel(10000);

// Set the drawable as a component of the
// TextView
competitorView.setCompoundDrawablesWithIntrinsicBounds(
        scaledLeft, null, null, null);

// If the text is changed, we need to
// re-register the Drawable to recompute the
// bounds given the new TextView height
competitorView.addOnLayoutChangeListener(new OnLayoutChangeListener() {

    @Override
    public void onLayoutChange(View v, int left, int top, int right, 
            int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        competitorView.setCompoundDrawablesWithIntrinsicBounds(scaledLeft, null, null, null);
    }
});

答案 2 :(得分:3)

希望这个帮助

Textview tv = (TextView) findViewById(R.id.tv_dummy)
int imageResource =  R.mipmap.ic_image;
Drawable drawable = ContextCompat.getDrawable(context, imageResource);
int pixelDrawableSize = (int)Math.round(tv.getLineHeight() * 0.7); // Or the percentage you like (0.8, 0.9, etc.)
drawable.setBounds(0, 0, pixelDrawableSize, pixelDrawableSize); // setBounds(int left, int top, int right, int bottom), in this case, drawable is a square image
tv.setCompoundDrawables(
 null, //left
 null, //top
 drawable, //right
 null //bottom
);

答案 3 :(得分:1)

我没找到方法。但是你显示的看起来像一个项目列表。每个项目都是一个LinearLayout水平,其中imagesView从左到右,文本在中心。图像尺寸执行android:scaleType =“fitXY”,以便将文本视图高度调整为大小。 如果您不想变形图像,请使用scaleType =“CENTER_INSIDE”。 http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

<LinearLayout
     android:layout_width="fill_parent"
     android:id="@+id/HeaderList" 
     android:layout_gravity="top"
     android:layout_height="wrap_content" >  


     <ImageView
         android:id="@+id/backImg"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_centerInParent="true"
         android:adjustViewBounds="true"
         android:background="@color/blancotransless"
         android:src="@drawable/header"
         android:scaleType="fitXY" >
     </ImageView>

         <TextView 
             android:layout_height="wrap_content"
             android:layout_width="wrap_content" 
             android:id="@+id/NameText"
             android:text="The time of prayer" 
             android:textColor="#FFFFFF"
             android:textSize="30sp" 
             android:layout_alignParentLeft="true"
             android:layout_alignParentTop="true" 
             android:paddingLeft="4dp"
             android:paddingTop="4dp" 
             />
    <ImageView
         android:id="@+id/backImg"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_centerInParent="true"
         android:adjustViewBounds="true"
         android:background="@color/blancotransless"
         android:src="@drawable/header"
         android:scaleType="fitXY" >
     </ImageView>

</LinearLayout> 

答案 4 :(得分:1)

只需使9路背景重复此模式。

而且,如果模式将应用于列表而不是单个项目,它似乎会更好看。

答案 5 :(得分:1)

我认为最干净的解决方案是覆盖TextView。这是一个示例:

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

我改变了一点:

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]);
}

通过这种方式可以设置可绘制对象的大小,但是如果您关心宽高比,请按照自己的方式进行设置。

现在,如果您希望它自动匹配文本视图的高度,则还可以覆盖TextView的方法onSizeChanged

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

您还希望声明每侧的大小,例如leftCompoundDrawableWidth,rightCompoundDrawableWidth等。

请注意,它不能与Shape一起绘制。听起来TextView仅在具有size属性的情况下才接受它,因此可以通过使用setSize或setIntrinsicWidth或...未测试来更新shapedrawable的大小来实现它。

答案 6 :(得分:1)

另一种为 TextView 内的可绘制对象创建自定义大小的方法是使用 BindingAdapter。使用它,您将能够在 xml 中设置图像大小。

例如,TextViewBindingAdapter.java

public class TextViewBindingAdapter {
    @BindingAdapter({"android:imageSize"})
    public static void bindIconSize(TextView textView, int size) {
        Drawable[] drawables = textView.getCompoundDrawables();
        if(drawables[0] != null) {
            drawables[0].setBounds(0, 0, size, size); // setBounds(int left, int top, int right, int bottom), in this case, drawable is a square image
            textView.setCompoundDrawables(
                    drawables[0], //left
                    null, //top
                    null, //right
                    null //bottom
            );
        }
        if(drawables[1] != null) {
            drawables[1].setBounds(0, 0, size, size); // setBounds(int left, int top, int right, int bottom), in this case, drawable is a square image
            textView.setCompoundDrawables(
                    null, //left
                    drawables[1], //top
                    null, //right
                    null //bottom
            );
        }
        if(drawables[2] != null) {
            drawables[2].setBounds(0, 0, size, size); // setBounds(int left, int top, int right, int bottom), in this case, drawable is a square image
            textView.setCompoundDrawables(
                    null, //left
                    null, //top
                    drawables[2], //right
                    null //bottom
            );
        }
        if(drawables[3] != null) {
            drawables[3].setBounds(0, 0, size, size); // setBounds(int left, int top, int right, int bottom), in this case, drawable is a square image
            textView.setCompoundDrawables(
                    null, //left
                    null, //top
                    null, //right
                    drawables[3] //bottom
            );
        }


    }
}

现在,您可以在 .xml 中设置 android:imageSize。

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:drawableLeft="@drawable/alpha_s_circle"
    android:drawablePadding="4dp"
    android:gravity="center_vertical"
    android:textSize="16sp"
    android:imageSize="@{300}"/>

并且不要忘记在您的 gradle.build 中设置以下代码:

android {
    ....
    buildFeatures {
        dataBinding = true
    }
}

答案 7 :(得分:0)

这里唯一可接受的答案应该是像往常一样使用具有scaleTypes的ImageView。 hacky解决方法可以在Android不支持的TextView上缩放图像。按预期使用SDK。

答案 8 :(得分:0)

也许值得一看 ImageSpan 。它是一个跨度,用一个Drawable替换它所附加的文本,该Drawable可以与底部或周围的基线对齐。我认为它也会根据textview的高度自动缩放比例。

https://developer.android.com/reference/android/text/style/ImageSpan