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" />效果图