最近项目中需要做一个按钮,设计图如下所示:

设计图按钮

首先看到图的第一反应就是在xml中添加android:drawableLeft 属性,然而发现结果是这样子的:

配置完android:drawableLeft属性按钮

切图暂时还未到位一切从简。

那么当我们需要Button的drawableLeft居中显示时,Android属性不能提供给我们相对应的Api时候我们想到了自定义View。

思路很简单,通过canvas平移字体跟drawable资源文件,平移距离:计算出drawable文件和text文字的宽度以及他们之间的padding距离,通过view的长度减去这个计算的距离除于2。这样的平移距离刚好居中:

下面上代码:

@Override

protected voidonDraw(Canvas canvas) {

Drawable[] drawables = getCompoundDrawables();

if(drawables !=null) {

Drawable drawableLeft = drawables[0];

if(drawableLeft !=null) {

floattextWidth = getPaint().measureText(getText().toString());

intdrawablePadding = getCompoundDrawablePadding();

intdrawableWidth =0;

drawableWidth = drawableLeft.getIntrinsicWidth();

floatbodyWidth = textWidth + drawableWidth + drawablePadding;

canvas.translate((getWidth() - bodyWidth) /2,0);

}

}

super.onDraw(canvas);

}


主要是onDraw方法。

xml中引用:

android:layout_width="match_parent"

android:layout_height="@dimen/dp50"

android:layout_marginBottom="@dimen/dp20"

android:layout_marginLeft="@dimen/dp30"

android:layout_marginRight="@dimen/dp30"

android:layout_marginTop="@dimen/dp50"

android:background="@drawable/bg_btn_payment"

android:drawableLeft="@drawable/ic_clear"

android:drawablePadding="@dimen/dp5"

android:gravity="center_vertical"

android:text="Test Now"

android:textColor="@color/white"

android:textSize="@dimen/dp16"/>

加一个android:gravity="center_vertical"  否则文字会垂直距离不居中。

最后我们的效果:

最终效果图,drawableleft居中的button

更多相关文章

  1. Android(安卓)开发之Matrix图片处理类的使用
  2. Android(安卓)TextView前加图标垂直居中第一行(仿大众点评购买须
  3. Android获取经纬度,计算距离,方位角
  4. Android仿IOS回弹效果 ScrollView回弹 总结
  5. android 横屏 竖屏 全屏 当前屏幕宽 高
  6. Android经纬度转化为距离
  7. Android中ActionBar居中
  8. Android(安卓)ScrollView自动滑动一段距离的问题解决
  9. Android(安卓)-- 设置textview文字居中或者控件居中

随机推荐

  1. Android单元测试
  2. Android教程-Android(安卓)五大布局讲解
  3. Android(安卓)慕课学习笔记整理(一)
  4. 转:基于 Android(安卓)NDK 的学习之旅----
  5. android:configChanges属性
  6. 两分钟彻底让你明白Android中onIntercept
  7. android shape 的使用。
  8. Android修改icon和roundIcon后,显示的图标
  9. 【摘录】Android(安卓)Building System
  10. Android中使用SQlite进行数据操作