我的项目列表是TextView
;并使用drawableleft& drawableright使TextView
成为可能。
问题是,每当textview中的文本较大时,drawableleft& drawableleft没有根据TextView
的高度自动缩放。
是否可以缩放drawableleft&的高度。 textview中的drawableright? (我正在使用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