2012-12-18 87 views
3

在看到此功能的许多问题并试图回答问题后,我仍然想知道是否有更清晰的示例?带有文本和图像的Android按钮

编辑:我试图做一个大的按钮,有一个图像和文字,在'中间'。它必须表现为一个按钮(StateList绘制)和图像/文本对应该进行分组和中心(作为一组)

+0

我想知道你是否想要一个文字和图像并排放置在图像上或者文字要覆盖在图像上 –

+0

@Corey Scott如果我给出的解决方案可以帮助您解决问题,那么您可以接受我的解决方案。谢谢。 –

回答

2

在试图救别人一些时间,我提供这样的:

布局/ 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:这里颜色设置可以是任何东西和再仅供做出一个完整的例子

+1

如果你可以使用'Button',为什么在'RelativeLayout'中包装'TextView'?由于'Button扩展了TextView',它支持复合drawables没有问题。你提出的建议看起来相当麻烦和低效。 –

+0

当您使用按钮时,drawableLeft会在按钮的边缘绘制图形。我所寻找的是图形更加集中的东西。是的,你可以使用边距/填充来移动drawable,但是会影响按钮的区域,导致其他问题 –

+0

使用RelativeLayout和TextView来装饰带图像的Button并不是一个矫枉过正的事情吗?这样的装饰可以很容易地完成一个自定义Drawable - 看看我的答案在这里 – pskink

0

试试这个:

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); 

希望它可以帮助你。

谢谢。

1

试试这个自定义绘制对象:

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);