其实如果每条内容只有一行的话,用drawableLeft就可以实现了,问题是当有不止一行的情况下,这个drawableLeft是相对于整个TextView的高度居中的。
所有不能单纯的使用drawableLeft来显示。
所有不能单纯的使用drawableLeft来显示。
我的做法是自定义一个Drawable,继承Drawable类,并重写onDraw方法
LiDrawable
public class LiDrawable extends Drawable {
private Drawable mDrawable;
private int mLineHeight;
public LiDrawable(Drawable drawable, TextView tv) {
this.mDrawable = drawable;
this.mLineHeight = tv.getLineHeight();
}
@Override
public void draw(Canvas canvas) {
int halfCanvas= canvas.getHeight() / 2;
int halfDrawable = mDrawable.getIntrinsicHeight() / 2;
// TODO align to other positions;
canvas.save();
canvas.translate(0, -halfCanvas + halfDrawable + mLineHeight / 2);
mDrawable.draw(canvas);
canvas.restore();
}
@Override
public int getIntrinsicWidth() {
return mDrawable.getIntrinsicWidth();
}
@Override
public int getIntrinsicHeight() {
return mDrawable.getIntrinsicHeight();
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter cf) {
}
@Override
public int getOpacity() {
return 0;
}
}
LiTextView
public class LiTextView extends TextView {
private Drawable mDrawable;
private LiDrawable mLiDrawable;
public LiTextView(Context context) {
this(context, null);
}
public LiTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LiTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.LiTextView, 0, 0);
try {
mDrawable = a.getDrawable(R.styleable.LiTextView_liDrawable);
} finally {
a.recycle();
}
setupLiDrawable();
}
private void setupLiDrawable() {
if (mDrawable != null) {
mLiDrawable = new LiDrawable(mDrawable, this);
mDrawable.setBounds(0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight());
mLiDrawable.setBounds(0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight());
setCompoundDrawables(mLiDrawable, null, null, null);
}
}
public void setLiDrawable(Drawable drawable) {
this.mDrawable = drawable;
setupLiDrawable();
}
public void setLiDrawableResource(int drawableRes) {
this.mDrawable = getResources().getDrawable(drawableRes);
setupLiDrawable();
}
}