android:在TextView中适合DrawableLeft的高度

我试图在文本块旁边显示一条蓝线,非常像这样:

在这里输入图像说明

这是我的代码:

<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@drawable/blue_line" /> 

blue_line是一个jpg文件。 一个蓝色的长方形。 它将以原始大小显示,而不pipetextview中的文本是什么。 我怎样才能根据文本的高度dynamic调整它的高度? 当less量的文本和更长的文本时,使它更短….

Related of "android:在TextView中适合DrawableLeft的高度"

你可以尝试在代码中设置图像的边界

 textView1.getViewTreeObserver() .addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Drawable img = ActivityName.this.getContext().getResources().getDrawable( R.drawable.blue_line); img.setBounds(0, 0, img.getIntrinsicWidth() * textView1.getMeasuredHeight() / img.getIntrinsicHeight(), textView1.getMeasuredHeight()); textView1.setCompoundDrawables(img, null, null, null); textView1.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); 

最好的办法是把你的drawable包装在一个xml可绘制文件中,并在文本视图中将其设置为drawable,如下所示:

可绘制的XML文件:

 <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:scaleType="fitXY" android:src="@drawable/total_calories"/> 

XML中的TextView:

 <TextView android:id="@+id/title_total_cal" style="@style/title_stats_textview" android:drawableLeft="@drawable/total_calories_drawable"/> 

简单地说,保持您的图像为9patch绘制。

你可以添加android:drawableLeft="@drawable/checkmark"到你的textview。 您还可以设置drawablePadding来保持textview的组织。

 android:drawableLeft="@drawable/button_icon" android:drawablePadding="2dip" 

这里是创build9patch drawable的链接

 <TextView android:text="@string/txtUserName" android:id="@+id/txtUserName" android:layout_width="160dip" android:layout_height="60dip" android:layout_gravity="center" android:drawableLeft="@drawable/button_icon" android:drawablePadding="2dip" /> 

尝试如下…

 <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="match_parent" android:src="@drawable/btndr" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageView" /> </RelativeLayout> 

您可以在可绘制的canvas上绘制所需高度的线条,并将其设置为TextView的左侧绘制。 看一下这个:

 public class FullHeightLineDrawable extends Drawable { private Paint mPaint; private int mHeight; public FullHeightLineDrawable(int height) { mPaint = new Paint(); mPaint.setColor(CompatUtils.getColor(R.color.colorAccent)); mPaint.setAntiAlias(true); mPaint.setStrokeWidth(15); mHeight = height; } @Override public void draw(Canvas canvas) { canvas.drawLine(0, -mHeight, 0, mHeight, mPaint); } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter colorFilter) { } @Override public int getOpacity() { return 0; } } 

用法:

 final Drawable drawable = new FullHeightLineDrawable(getHeight()); mTextView.setTextColor(watchingColor); mTextView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); 

我抽象出这个方法。 当绘图位于TextView的左侧时,它就起作用,可以dynamic缩放。 如果drawable在右侧,这个方法不起作用,需要弄清楚为什么,但是你可以直接使用textView.setcompounddrawableswithintrinsicbounds()和正确尺寸的Drawable资源

 @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) public static void ajustCompoundDrawableSizeWithText(final TextView textView, final Drawable leftDrawable, final Drawable topDrawable, final Drawable rightDrawable, final Drawable bottomDrawable) { textView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if(leftDrawable != null){ leftDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); } if(topDrawable != null){ topDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); } if(rightDrawable != null){ rightDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); } if(bottomDrawable != null){ bottomDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); } textView.setCompoundDrawables(leftDrawable, topDrawable, rightDrawable, bottomDrawable); textView.removeOnLayoutChangeListener(this); } }); } 

我创build了一个扩展TextView ,并在onPreDrawListener调整drawable的onPreDrawListener

 public class MyTextView extends AppCompatTextView { public MyTextView(Context context, AttributeSet attrs, int style) { super(context, attrs, style); fitCompoundDrawableToLineHeight(); } private void fitCompoundDrawableToLineHeight() { OnPreDraw.run(this, () -> { final Drawable[] cd = getCompoundDrawables(); Arrays.stream(cd) .filter(drawable -> drawable != null) .forEach(d -> d.setBounds(0, 0, getLineHeight(), getLineHeight())); setCompoundDrawables(cd[0], cd[1], cd[2], cd[3]); }); } } // Convenience class that abstracts onPreDraw logic public class OnPreDraw { public static void run(View view, Runnable task) { view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { if (!view.getViewTreeObserver().isAlive()) { return true; } view.getViewTreeObserver().removeOnPreDrawListener(this); task.run(); return true; } }); } } 

你需要制作一个水平的XML布局,左边有蓝线,右边是textview。 比使用该项目的布局,并使这些项目的ListView。 像这里的东西,但有点简单