实现"android TextView drawableLeft 多行文本 不居中"的方法共分为以下几个步骤:

步骤 操作
1 在布局文件中添加一个TextView控件,设置其文本内容和drawableLeft属性
2 创建一个自定义的Drawable类,用于调整drawableLeft的位置
3 在代码中使用自定义的Drawable类替换TextView的drawableLeft属性

下面将详细介绍每个步骤需要做的操作,并提供相应的代码示例和注释。

步骤1:在布局文件中添加TextView控件

首先,在你的布局文件中添加一个TextView控件,并设置其文本内容和drawableLeft属性。代码示例如下:

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="多行文本"
    android:drawableLeft="@drawable/ic_custom_drawable"
    android:drawablePadding="8dp"
    android:gravity="center_vertical"
    android:maxLines="2" />

在这段代码中,我们使用了一个自定义的drawable资源(ic_custom_drawable)作为drawableLeft,并设置了drawable与文本之间的间距(8dp),以及文本的垂直居中对齐方式和最大行数(2行)。

步骤2:创建自定义的Drawable类

接下来,你需要创建一个自定义的Drawable类,用于调整drawableLeft的位置。代码示例如下:

public class CustomDrawable extends Drawable {
    private Drawable drawable;

    public CustomDrawable(Drawable drawable) {
        this.drawable = drawable;
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        // 获取TextView的高度
        int height = getBounds().height();
        // 获取drawable的宽度
        int drawableWidth = drawable.getIntrinsicWidth();
        // 获取drawable的高度
        int drawableHeight = drawable.getIntrinsicHeight();
        // 计算drawable的左边距
        int leftMargin = (height - drawableHeight) / 2;
        // 设置drawable的绘制区域
        drawable.setBounds(leftMargin, 0, leftMargin + drawableWidth, drawableHeight);
        // 绘制drawable
        drawable.draw(canvas);
    }

    @Override
    public void setAlpha(int alpha) {
        drawable.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        drawable.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return drawable.getOpacity();
    }
}

在这段代码中,我们首先获取TextView的高度,然后计算出drawable的左边距,使其在垂直方向上居中显示。最后,设置drawable的绘制区域并绘制出来。

步骤3:使用自定义的Drawable类替换TextView的drawableLeft属性

最后,在代码中使用自定义的Drawable类替换TextView的drawableLeft属性。代码示例如下:

TextView textView = findViewById(R.id.textView);
Drawable customDrawable = getResources().getDrawable(R.drawable.ic_custom_drawable);
CustomDrawable customDrawableWrapper = new CustomDrawable(customDrawable);
textView.setCompoundDrawablesWithIntrinsicBounds(customDrawableWrapper, null, null, null);

在这段代码中,我们首先获取TextView的实例,并通过资源文件获取自定义的drawable(ic_custom_drawable)。然后,创建一个自定义Drawable类的实例(customDrawableWrapper),并将其作为drawableLeft属性传递给TextView的setCompoundDrawablesWithIntrinsicBounds方法。

至此,"android TextView drawableLeft 多行文本 不居中"的实现方法已经介绍完毕。你可以根据以上的步骤和代码示例,来调整和修改你的项目代码,以实现相应的效果。

下面是文章中的甘特图和序列图:

gantt
    title 实现"android TextView drawableLeft 多行文本 不居中"的流程
    dateFormat  YYYY-MM-DD
    section 布局文件
    添加TextView控件           :done, 2022-10-01, 1d
    section 自定义Drawable类
    创建CustomDrawable类        :done, 2022-10-02, 1d
    section 代码中替换drawableLeft属性
    使用自定义的Drawable类      :done, 2022-10-03, 1d
sequenceDiagram
    participant 小白
    participant 开发者