import com.winfo.gdmsaec.app.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.Button;
public class MyIconButton extends Button {
protected int drawableWidth;
protected DrawablePositions drawablePosition;
protected int iconPadding;
Rect bounds;
private enum DrawablePositions {
NONE,
LEFT_AND_RIGHT,
LEFT,
RIGHT
}
public MyIconButton(Context context) {
super(context);
bounds = new Rect();
}
public MyIconButton(Context context, AttributeSet attrs) {
super(context, attrs);
bounds = new Rect();
applyAttributes(attrs);
}
protected void applyAttributes(AttributeSet attrs) {
if (null == bounds) {
bounds = new Rect();
}
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MyIconButton);
int paddingId = typedArray.getDimensionPixelSize(R.styleable.MyIconButton_iconPadding, 0);
setIconPadding(paddingId);
typedArray.recycle();
}
public void setIconPadding(int padding) {
iconPadding = padding;
requestLayout();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Paint textPaint = getPaint();
String text = getText().toString();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int textWidth = bounds.width();
int factor = (drawablePosition == DrawablePositions.LEFT_AND_RIGHT) ? 2 : 1;
int contentWidth = drawableWidth + iconPadding * factor + textWidth;
int horizontalPadding = (int) ((getWidth() / 2.0) - (contentWidth / 2.0));
setCompoundDrawablePadding(-horizontalPadding + iconPadding);
switch (drawablePosition) {
case LEFT:
setPadding(horizontalPadding, getPaddingTop(), 0, getPaddingBottom());
break;
case RIGHT:
setPadding(0, getPaddingTop(), horizontalPadding, getPaddingBottom());
break;
case LEFT_AND_RIGHT:
setPadding(horizontalPadding, getPaddingTop(), horizontalPadding, getPaddingBottom());
break;
default:
setPadding(0, getPaddingTop(), 0, getPaddingBottom());
}
}
@Override
public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) {
super.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);
if (left != null && right != null) {
drawableWidth = left.getIntrinsicWidth() + right.getIntrinsicWidth();
drawablePosition = DrawablePositions.LEFT_AND_RIGHT;
} else if (left != null) {
drawableWidth = left.getIntrinsicWidth();
drawablePosition = DrawablePositions.LEFT;
} else if (right != null) {
drawableWidth = right.getIntrinsicWidth();
drawablePosition = DrawablePositions.RIGHT;
} else {
drawablePosition = DrawablePositions.NONE;
}
requestLayout();
}
}
使用时在xml文件头部加上
xmlns:padding="http://schemas.android.com/apk/res/项目包名"
<com....widget.MyIconButton
android:id="@+id/main_system_different"
style="@style/MyIconButton"
android:background="@drawable/main_btn_right_bg"
android:drawableLeft="@drawable/system_set"
android:text="@string/system_setting"
padding:iconPadding="3dp" />这个值是图片和文字之间的距离 使用者可根据情况设定
<style name="MyIconButton">
<item name="android:textSize">16sp</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">45dp</item>
<item name="android:layout_weight">1</item>
<item name="android:textColor">@color/black</item>
</style>