Android 自己定义 TextView drawableTop 图标与文字左对齐(效果图)

public class DrawableTopLeftTextView extends TextView {

	private Paint mPaint;
	private float fFontHeight;
	private Drawable[] drawables;
	private int leftMargin = 40; //TODO 这个要通过代码获取,不能硬编码

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

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

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

	private void init() {
		mPaint = getPaint();
		//mPaint.setTextSize(56.0f);
		mPaint.setColor(Color.parseColor("#cccccccc"));
		FontMetrics fm = mPaint.getFontMetrics();
		fFontHeight = (float) Math.ceil(fm.descent - fm.ascent);
		drawables = getCompoundDrawables();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		if (drawables != null) {
			Drawable drawable = drawables[1]; // top
			if (drawable != null) {
				final float textY = getY() + drawable.getIntrinsicHeight() + fFontHeight - 5;
				canvas.drawText(getText().toString(), 0, textY, mPaint);
				canvas.clipRect(drawable.getBounds());
				canvas.drawBitmap(getBitmap(drawable), getLeft()+leftMargin, getTop(), mPaint);
				drawable.draw(canvas);
				canvas.save();
			}
		}
		super.onDraw(canvas);
	}
	
	private final static Bitmap getBitmap(Drawable drawable){
		BitmapDrawable bd = (BitmapDrawable) drawable;
		return bd.getBitmap();
	}
}


<com.bluetooth.light.widget.DrawableTopLeftTextView
            android:id="@+id/signal_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"
            android:drawableTop="@drawable/signal_logo"
            android:text="@string/signal"
            android:textColor="#cccccccc"
            android:textSize="24sp" />


效果图

原文地址:https://www.cnblogs.com/mengfanrong/p/5220265.html