android:在textView中适合DrawableLeft的高度

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

在此处输入图像描述

这是我的代码:

 

blue_line是一个jpg文件。 一个蓝色的矩形。 无论textview中的文本如何,它都以原始大小显示。 如何根据文字的高度动态调整其高度? 比如当文本少量文本时缩短,当文本更多时更长…

  • 如何设置一个空的drawable
  • 如何把文本放在drawable中?
  • 使用ShapedDrawable将ColorFilter应用于ImageView
  • android:在TextView中适合DrawableLeft的高度
  • 如何在图层列表中设置可绘制的大小
  • 在较旧的Android版本的图层列表中的矢量Drawable
  • 扫描渐变:它是什么和它的例子
  • 如何设置android评级栏的笔画颜色? (不是星星的颜色,而是BORDER)
  • 您可以通过设置图像的边界来尝试在代码中执行此操作

     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"?>  

    XML中的TextView:

      

    请尝试以下…

         

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

    您可以在textview中添加android:drawableLeft="@drawable/checkmark" 。 您还可以设置drawablePadding以保持textview的有序性。

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

    这是创建9patch drawable的链接

      

    您可以在可绘制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); 

    我抽象出这个方法。 当drawable位于TextView的左侧时,它可以动态缩放。 如果drawable在右侧,则此方法不起作用,需要弄清楚原因,但您可以直接使用带有正确大小的Drawable资源的textView.setcompounddrawableswithintrinsicbounds()

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

    我创建了一个扩展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; } }); } } 

    不幸的是, setBounds不适合我,所以我不得不做一个解决方法。

     // Turn wanted drawable to bitmap Drawable dr = getResources().getDrawable(R.drawable.somedrawable); Bitmap bitmap = ((BitmapDrawable) dr).getBitmap(); // I had a square image with same height and width so I needed only TextView height (getLineHeight) int size = textView1.getLineHeight(); Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, size, size, true)); textView1.setCompoundDrawables(d, null, null, null); // Now we can set some spacing between text and image textView1.setCompoundDrawablePadding(10); 

    它不是关于性能的最佳解决方案,因为新的位图已创建,但仍然有效。

    您需要制作一个水平的XML布局,其中包含蓝线和右侧的textview。 比使用该项目布局,并制作这些项目的ListView。 像这里的东西,但有点简单