如何将drawableLeft对齐而不是在android textview中居中?

问题描述:

TextView我设置了drawableLeft,其中drawable从中心显示。我需要对齐drawableLeft顶部TextView像这张图片。如何将drawableLeft对齐而不是在android textview中居中?

enter image description here

是否有可能实现这一目标?

+1

不简单。没有'drawableTopLeft'。因此,要实现您想要的,可以使用单独的ImageView或创建一个扩展TextView的新控件。 – 2014-09-01 10:24:19

+0

使用BitmapDrawable。setGravity方法,也要确保你的drawable界限高度等于textview高度 – pskink 2014-09-01 10:35:54

+0

@ FrankN.Stein你可能是对的。您能否详细介绍一下自定义控件。 – androidcodehunter 2014-09-01 10:38:57

您可以通过这种方式使用。愿它能帮助你。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="100dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/imageView1" 
     android:text=" Text Text Text Text Text Text Text Text Text Text Text Text 
     Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text" /> 
</RelativeLayout> 

+0

我不想按照这种方式,因为我们必须使用嵌套布局。 – androidcodehunter 2014-09-01 10:45:18

+1

外部RelativeLayout完全没用。由于包含API级别8,因此不推荐使用'fill_parent'。使用'match_parent',而不是 – 2014-09-01 10:48:13

+0

@androidcodehunter它是嵌套的布局或自定义代码,我们需要采取某种方式:我总是喜欢只有XML的解决方案,如果它相当好,这是正确实施的(你可以解决它如果使用'ConstraintLayout'或'RelativeLayout',你甚至不需要嵌套,但它仍然是2个视图。 – TWiStErRob 2018-01-18 17:37:58

my answer here

通过创建包装Drawable的自定义Drawable,可以将Compound-Drawable对齐到顶部(或底部),然后通过覆盖方法onDraw(Canvas)来操作自定义Drawable的绘图。

下面的示例是最简单的示例。这将图像对齐到顶部,但您也可以通过执行onDraw(Canvas)-方法中的所需逻辑,使其与TextView的底部,左侧或右侧对齐。您可能还想在onDraw(Canvas)中创建边距,以使您的设计实现像素完美。

使用范例:

GravityCompoundDrawable gravityDrawable = new GravityCompoundDrawable(innerDrawable); 
// NOTE: next 2 lines are important! 
innerDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight()); 
gravityDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight()); 
mTextView.setCompoundDrawables(gravityDrawable, null, null, null); 

示例代码:

public class GravityCompoundDrawable extends Drawable { 

    // inner Drawable 
    private final Drawable mDrawable; 

    public GravityCompoundDrawable(Drawable drawable) { 
     mDrawable = drawable; 
    } 

    @Override 
    public int getIntrinsicWidth() { 
     return mDrawable.getIntrinsicWidth(); 
    } 

    @Override 
    public int getIntrinsicHeight() { 
     return mDrawable.getIntrinsicHeight(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     int halfCanvas= canvas.getHeight()/2; 
     int halfDrawable = mDrawable.getIntrinsicHeight()/2; 

     // align to top 
     canvas.save(); 
     canvas.translate(0, -halfCanvas + halfDrawable); 
     mDrawable.draw(canvas); 
     canvas.restore(); 
    } 
} 
+0

如何使用它将文本和左边的drawable对齐到左边textview – TheReprator 2016-03-02 05:21:01

使用SpannableString和ImageSpan实现这一目标。

String msg=" "+"haii"; 
ImageSpan mImageSpan== new ImageSpan(mContext, R.drawable.icon); 
SpannableString text = new SpannableString(msg); 
text.setSpan(mImageSpan, 0, 1, 0); 
mTextView.setText(text); 

字符串变量中的额外空间被替换为图标。

+1

可爱的解决方案,但是图标和文字都不是相同的重力,你有什么建议吗? – Khan 2016-08-26 14:12:55

我觉得它比上述所有问题的答案更简单:你只需要做到这一点:

public class TopGravityDrawable extends BitmapDrawable { 

    public TopGravityDrawable(Resources res, Bitmap bitmap) { 
     super(res, bitmap); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     int halfCanvas = canvas.getHeight()/2; 
     int halfDrawable = getIntrinsicHeight()/2; 
     canvas.save(); 
     canvas.translate(0, -halfCanvas + halfDrawable); 
     super.draw(canvas); 
     canvas.restore(); 
    } 
} 

然后

final Bitmap bitmap = BitmapFactory.decodeResource(mTitle.getResources(), R.drawable.icon); 
icon = new TopGravityDrawable(mTitle.getResources(), bitmap); 
title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, icon); 

记住这个只有LEFTRIGHT正常工作复合绘图

你可以这样做:

public class DrawableTopLeftTextView extends TextView { 

    public DrawableTopLeftTextView(Context context) { 
     super(context); 
    } 

    public DrawableTopLeftTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DrawableTopLeftTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     if (!TextUtils.isEmpty(getText())) { 

      Drawable[] drawables = getCompoundDrawables(); 

      if (drawables != null) { 

       Drawable drawableLeft = drawables[0]; 

       if (drawableLeft != null) { 

        Paint.FontMetricsInt fontMetricsInt = getPaint().getFontMetricsInt(); 
        Rect bounds = new Rect(); 
        getPaint().getTextBounds((String) getText(), 0, length(), bounds); 
        int textVerticalSpace = Math.round(bounds.top - fontMetricsInt.top); 
        int offset = (getHeight() - drawableLeft.getIntrinsicHeight())/2 - textVerticalSpace - getPaddingTop()/2; 
        drawableLeft.setBounds(0, -offset, drawableLeft.getIntrinsicWidth(), drawableLeft.getIntrinsicHeight() - offset); 
       } 
      } 
     } 
     super.onDraw(canvas); 
    } 
} 

如果您想要一个纯粹的XML解决方案,那么您可以使用插入drawable来重新定位您想要的drawable。

<?xml version="1.0" encoding="utf-8"?> 
<inset 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/actual_image_to_be_shown" 
    android:insetTop="-32dp" /> 

根据您的情况,您可能需要使用插图值。然后在TextView的drawableLeft/Start定义中使用这个XML drawable。

+0

如果你打算给我一个投票,至少告诉我为什么你不喜欢这个解决方案 – 2018-01-18 03:42:06

+0

硬编码值不适用于动态文本,负偏移量取决于文本的行数+ fontSize和TextView的其他属性。乐行。 – TWiStErRob 2018-01-18 17:36:02