是否有可能在textview中绘制drawableleft&drawableright?

我有与该项目的列表是一个TextView ; 并使用drawableleft&drawableright来表示TextView 。 问题是,只要textview中的文本较大,drawableleft和drawableleft就不会根据TextView的高度自动缩放。

是否有可能在textview中缩放drawableleft和drawableright的高度? (我正在使用9个补丁映像)

textview drawableleft&drawableright的高度问题

这可能会帮助你。 有两个属性scaleXscaleY

下面的代码将缩小图像和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); 

我通过引入一个ScaleDrawable并覆盖它的.getIntrisicHeight()来解决一个等价的用例,至less是TextView高度。 TextView.addOnLayoutChangeListener部分,在TextView大小更改上重新绑定Drawable需要使用API​​11 +

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

我没有find方法。 但是,你显示看起来像一个项目列表。 每个项目将是一个LinearLayout水平与从左到右的图像和中心的文字。 图像尺寸做一个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> 

只是让9path的背景重复这种模式。

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

请尝试一下这段代码。 这可能会帮助你。

 Drawable TextViewDrawable = context.getResources().getDrawable(imageId); TextViewDrawable.setBounds(0, 0, TextViewDrawable.getIntrinsicWidth(), TextViewDrawable.getIntrinsicHeight()); text_view.setCompoundDrawables(left, top, right, bottom); 

希望这个帮助

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