在看到此功能的许多问题并试图回答问题后,我仍然想知道是否有更清晰的示例?带有文本和图像的Android按钮
编辑:我试图做一个大的按钮,有一个图像和文字,在'中间'。它必须表现为一个按钮(StateList绘制)和图像/文本对应该进行分组和中心(作为一组)
在看到此功能的许多问题并试图回答问题后,我仍然想知道是否有更清晰的示例?带有文本和图像的Android按钮
编辑:我试图做一个大的按钮,有一个图像和文字,在'中间'。它必须表现为一个按钮(StateList绘制)和图像/文本对应该进行分组和中心(作为一组)
在试图救别人一些时间,我提供这样的:
布局/ some_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/menu_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- StateList Drawable to make it look like a button -->
android:background="@drawable/btn_std_holo_states"
<!-- Required so you can click on it like a button -->
android:clickable="true"
<!-- Recommended min height from the guidelines -->
android:minHeight="48dp"
<!-- OnClickEvent definition -->
android:onClick="onClickOk" >
<!-- Compound drawable of graphic and text -->
<TextView
android:id="@+id/txt_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- Center both the graphic and text inside the button -->
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
<!-- Draw the graphic to the left of the text -->
android:drawableLeft="@drawable/ic_ok"
<!-- Space between the graphic and the text-->
android:drawablePadding="16dp"
<!-- ensures the text and graphic are both centered vertically -->
android:gravity="center"
<!-- Text of the button -->
android:text="@android:string/ok"
<!-- Change the font to match the standard button settings (optional) -->
android:textAppearance="?android:attr/textAppearanceButton" />
</RelativeLayout>
绘制/ btn_std_holo_states.xml(上面提到的)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/abs__btn_cab_done_pressed_holo_dark" android:state_pressed="true"/>
<item android:drawable="@drawable/abs__btn_cab_done_focused_holo_dark" android:state_enabled="true" android:state_focused="true"/>
<item android:drawable="@android:color/transparent" android:state_enabled="true"/>
<item android:drawable="@android:color/transparent"/>
</selector>
注:不同@drawable和@android:这里颜色设置可以是任何东西和再仅供做出一个完整的例子
如果你可以使用'Button',为什么在'RelativeLayout'中包装'TextView'?由于'Button扩展了TextView',它支持复合drawables没有问题。你提出的建议看起来相当麻烦和低效。 –
当您使用按钮时,drawableLeft会在按钮的边缘绘制图形。我所寻找的是图形更加集中的东西。是的,你可以使用边距/填充来移动drawable,但是会影响按钮的区域,导致其他问题 –
使用RelativeLayout和TextView来装饰带图像的Button并不是一个矫枉过正的事情吗?这样的装饰可以很容易地完成一个自定义Drawable - 看看我的答案在这里 – pskink
试试这个:
Drawable appImg = getApplicationContext().getResources().getDrawable(R.drawable.ic_launcher);
appImg.setBounds(0, 0, appImg.getIntrinsicHeight(), appImg.getIntrinsicWidth());
Button btn_ok = (Button) findViewById(R.id.ok);
btn_ok.setCompoundDrawables(null, null, appImg, null);
希望它可以帮助你。
谢谢。
如果你喜欢有图像+文字的按钮,那么你为什么不使用CompoundDrawable?
例如:
同时检查:How do I use a compound drawable instead of a LinearLayout that contains an ImageView and a TextView
与我的其他评论类似,这导致了我所期望的不同视觉效果。这种方法不允许您从边缘移动图像,并且仍然保留较大的点击框和点击时的可视化日期。 –
试试这个自定义绘制对象:
class BackgroundDrawable extends StateListDrawable {
private StateListDrawable mDrawable;
private Bitmap mBitmap;
private Matrix mMatrix;
private boolean mScale;
private int mGravity;
private int mDx;
private int mDy;
public BackgroundDrawable(StateListDrawable sld, Resources res, int resId, boolean scale, int gravity, int dx, int dy) {
mDrawable = sld;
mBitmap = BitmapFactory.decodeResource(res, resId);
mMatrix = new Matrix();
mScale = scale;
mGravity = gravity;
mDx = dx;
mDy = dy;
}
public static void setupBackground(View v, int resId, boolean scale, int gravity, int horizontalPadding, int verticalPadding) {
Drawable d = v.getBackground();
if (d instanceof StateListDrawable) {
StateListDrawable sld = (StateListDrawable) d;
Drawable drawable = new BackgroundDrawable(sld, v.getResources(), resId, scale, gravity, horizontalPadding, verticalPadding);
v.setBackgroundDrawable(drawable);
}
}
@Override
protected boolean onStateChange(int[] stateSet) {
invalidateSelf();
return super.onStateChange(stateSet);
}
@Override
protected void onBoundsChange(Rect bounds) {
mDrawable.setBounds(bounds);
Rect b = new Rect(bounds);
b.inset(mDx, mDy);
RectF src = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
RectF dst = new RectF(b);
float[] values = new float[9];
if (mScale) {
mMatrix.setRectToRect(src, dst, ScaleToFit.START);
}
mMatrix.getValues(values);
float sx = values[Matrix.MSCALE_X];
float sy = values[Matrix.MSCALE_Y];
Rect outRect = new Rect();
Gravity.apply(mGravity, (int) (src.width() * sx), (int) (src.height() * sy), b, outRect);
mMatrix.postTranslate(outRect.left, outRect.top);
}
@Override
public void draw(Canvas canvas) {
int[] stateSet = getState();
mDrawable.setState(stateSet);
mDrawable.draw(canvas);
canvas.drawBitmap(mBitmap, mMatrix, null);
}
}
以及如何使用它:
Button b0 = (Button) findViewById(R.id.b0);
BackgroundDrawable.setupBackground(b0, R.drawable.ic_launcher, false, Gravity.BOTTOM | Gravity.RIGHT, 10, 5);
Button b1 = (Button) findViewById(R.id.b1);
BackgroundDrawable.setupBackground(b1, R.drawable.ic_launcher, false, Gravity.TOP, 0, 0);
我想知道你是否想要一个文字和图像并排放置在图像上或者文字要覆盖在图像上 –
@Corey Scott如果我给出的解决方案可以帮助您解决问题,那么您可以接受我的解决方案。谢谢。 –