【问题标题】:How could I align the drawableLeft icon to the top如何将 drawableLeft 图标对齐到顶部
【发布时间】:2015-04-02 17:38:56
【问题描述】:

现在我需要实现一个和html标签一样的功能,见下图:

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

这不是我想的。之后我创建了一个类'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);
}

xml 文件如下:

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

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

如何实现图片一,我现在没有想法!

【问题讨论】:

  • 我会使用内部带有 ImageView 和 TextView 的 RelativeLayout,以便按照您的意愿对齐。
  • 我现在按照你说的实现它。但是我有一个问题,如果有很多行,如何将 ImageView 对齐到 TextView 的第一行?
  • 我不太明白你的意思。
  • 我需要圆圈对齐 TextView 第一行的中心。只需将 html 标签
  • 你必须在 ImageView 上设置一些 android:layout_marginTop
  • 标签: android textview


    【解决方案1】:

    之所以画了两次“点”,是因为你调用了super.onDraw(canvas)。你自己在最上面画了点,然后调用super让系统在原来的位置画点。

    很遗憾,您必须调用super.onDraw(canvas) 来绘制文本。实现你想要的更好的方法是创建一个自定义的Drawable,它包装你想要显示的Drawable,然后覆盖自定义Drawable的draw(Canvas)方法。

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

    【讨论】:

    • 嗨,我已经按照你在this 说的做了,但是左边的drawable 不见了,这是我做错了什么吗?
    • 您是否在(内部)Drawable 和自定义 Drawable 上都调用了 .setBounds()?注意:我忘记在示例中添加innerDrawable.setBounds(...)。我现在加了。
    • 我只是在 InnerDrawable 上调用 '.setBounds()',我今天再试一次,谢谢!
    • @Reinier .setBounds() 对于这两个drawables的重要性是什么?
    • @sam_k 如果没有.setBounds(),Drawable 将渲染为其默认大小 0px,因此它不会绘制。代码可以简化,但主要思想是您需要明确设置 GravityComoundDrawable 的边界(边界),并且您希望它的边界与它包装的 Drawable 的边界相匹配。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签