Android 如何将drawableLeft图标与顶部对齐

Android 如何将drawableLeft图标与顶部对齐,android,textview,Android,Textview,现在我需要实现一个类似html标签的功能,请参见下图: 首先,我设置了drawableLeft,它显示如下: @Override protected void onDraw(Canvas canvas) { Drawable[] drawables = getCompoundDrawables(); if (drawables != null) { Drawable drawableLeft = drawables[0]; if (drawabl

现在我需要实现一个类似html标签的功能,请参见下图:

首先,我设置了
drawableLeft
,它显示如下:

@Override
protected void onDraw(Canvas canvas) {
    Drawable[] drawables = getCompoundDrawables();
    if (drawables != null) {
        Drawable drawableLeft = drawables[0];
        if (drawableLeft != null) {
            canvas.save();
            canvas.translate(10, 50);
            drawableLeft.draw(canvas);
            canvas.restore();
        }
    }
    super.onDraw(canvas);
}
<me.naiyu.android.textviewlidemo.widget.LiTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:drawableLeft="@drawable/circle_dot"
        android:drawablePadding="10dp"
        android:textColor="#000000"
        android:textSize="18sp"
        android:text="Displays text to the user and optionally allows them to edit it. A TextView is a complete text editor, however the basic class is configured to not allow editing"/>

这不是我该做的。之后,我创建了一个类'LiTextView'实现
TextView
,并重写
onDraw()
方法,如下所示:

@Override
protected void onDraw(Canvas canvas) {
    Drawable[] drawables = getCompoundDrawables();
    if (drawables != null) {
        Drawable drawableLeft = drawables[0];
        if (drawableLeft != null) {
            canvas.save();
            canvas.translate(10, 50);
            drawableLeft.draw(canvas);
            canvas.restore();
        }
    }
    super.onDraw(canvas);
}
<me.naiyu.android.textviewlidemo.widget.LiTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:drawableLeft="@drawable/circle_dot"
        android:drawablePadding="10dp"
        android:textColor="#000000"
        android:textSize="18sp"
        android:text="Displays text to the user and optionally allows them to edit it. A TextView is a complete text editor, however the basic class is configured to not allow editing"/>
xml文件如下所示:

@Override
protected void onDraw(Canvas canvas) {
    Drawable[] drawables = getCompoundDrawables();
    if (drawables != null) {
        Drawable drawableLeft = drawables[0];
        if (drawableLeft != null) {
            canvas.save();
            canvas.translate(10, 50);
            drawableLeft.draw(canvas);
            canvas.restore();
        }
    }
    super.onDraw(canvas);
}
<me.naiyu.android.textviewlidemo.widget.LiTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:drawableLeft="@drawable/circle_dot"
        android:drawablePadding="10dp"
        android:textColor="#000000"
        android:textSize="18sp"
        android:text="Displays text to the user and optionally allows them to edit it. A TextView is a complete text editor, however the basic class is configured to not allow editing"/>

它变成了这样(有两个圆圈):

如何实现图片一,我现在没有主意

之所以两次绘制“点”,是因为调用了
super.onDraw(canvas)
。您已经在顶部位置自己绘制了点,然后通过调用super让系统在原始位置绘制点

不幸的是,为了绘制文本,您必须调用
super.onDraw(canvas)
。实现所需的更好方法是创建一个自定义的
Drawable
,该方法包装要显示的可绘制文件,然后覆盖自定义可绘制文件的
draw(Canvas)
方法


有关示例,请参见。唯一的缺点是,您必须从代码而不是XML设置
drawableLeft

我会在其中使用带有ImageView和TextView的RelativeLayout,以便按照您的要求对齐它。我现在按照您所说的方式实现它。但是我有一个问题,如何将ImageView对齐到TextView的第一行的中心,如果有很多行?我真的不明白你的意思。我需要一个圆圈对齐TextView第一行的中心。只需在html标签上划线
  • 您就必须在ImageViewHi上设置一些android:layout_marginTop,我已经按照您在上所说的做了,但是左侧的可绘制文件不见了,这是不是我做错了什么?您是否在(内部)可绘制文件和自定义可绘制文件上都调用了
    .setBounds()
    ?注意:我忘记在示例中添加
    innerDrawable.setBounds(…)
    。我现在添加了它。我只需在InnerDrawable上调用“.setBounds()”,我今天将重试,谢谢@Reinier
    .setBounds()
    对于这两个可绘制文件的重要性是什么?@sam_k如果没有
    .setBounds()
    可绘制文件将渲染为其默认大小0px,因此不会绘制。代码可以简化,但主要思想是需要显式设置GravityComoundDrawable的边界,并且希望其边界与它所包装的Drawable的边界匹配。