Android 使按钮中的icon图标和文字内容动态居中

本文介绍如何在Android的MaterialButton中使图标和文本动态居中,包括只有图标时的居中方法。通过计算按钮宽度和内容宽度,调整填充距离实现精确布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020/04/27 在看谷歌开发者文档时发现的新方法

只需设置iconGravity属性即可
在这里插入图片描述

下面是用代码计算高度和宽度来实现的方式

最近对Android 的Material风格比较感兴趣,MaterialButton很好用,不过插入icon时,icon本身会自动位于最右边,比如下面的注册按钮(随便放的一个icon):
在这里插入图片描述
查了一下,官方没有提供居中的方法,干脆自己写了两个方法:
一个是当按钮里只有图标时,将图标居中
另一个是当按钮里图标和文字存在时将他们居中。

思路很简单
1、先获取按钮的宽度,之后让按钮中的内容左填充到按钮宽度的一半
2、再获取按钮中内容的宽度,让按钮中的内容左填充到按钮宽度的一半之后又减去内容自身宽度的一 (就是内容先左填充按钮宽度一半的距离,再左填充负的内容自身一半的距离)

代码如下:
1.MaterialButton按钮中的icon图标和内容动态居中

   //复制这个方法就行
    public void getIconAndContentCenter(final MaterialButton btn){
        btn.post(new Runnable() {
            @Override
            public void run() {
                int btnwidth = btn.getWidth();
                btn.measure(0, 0);
                int contentwidth = btn.getMeasuredWidth();
                //可在下面的括号里适当加减整数来达到你想要的位置
                int paddingleft = ( btnwidth - contentwidth ) / 2; 
                btn.setPadding(paddingleft, 0, 0, 0);
            }
        });
    }

   //下面是调用例子
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       MaterialButton b = findViewById(R.id.btn_register);
       getIconAndContentCenter(b);
    }

结果:
在这里插入图片描述
2.MaterialButton按钮只有icon图标时的动态居中方法

    public void getIconcenter(final MaterialButton btn){
        btn.post(new Runnable() {
            @Override
            public void run() {
                int btnwidth = btn.getWidth();
                btn.measure(0, 0);
                int iconwidth = btn.getIcon().getIntrinsicWidth();
                int paddingleft = ( btnwidth - iconwidth  ) / 2;
                btn.setPadding( paddingleft , 0, 0, 0 );
            }
        });
    }

如果对你有用,请点个赞,嘻嘻

<think>嗯,用户想在Android中实现Button内的图片居中。我需要根据提供的引用资料来整理解决方法。首先,用户提到的引用中有几种不同的方法,比如使用drawableTop属性,但会导致图片靠近顶部,难以居中。还有使用LinearLayout的gravity或者layout_gravity属性,比如引用45提到布局中的居中对齐。另外,引用1提到通过设置android:button为null来移除默认样式,可能RadioButton有关,但用户问的是Button,可能需要调整。 首先,应该考虑Button的XML属性。引用23提到使用drawableStart或drawableTop等属性,但默认可能不居中。这时候可能需要结合gravity属性,设置按钮内部内容居中。例如,设置android:gravity="center"可以让图片文字居中显示。同时,如果使用drawableStart或drawableTop,可能需要调整padding或者使用自定义的drawable来达到居中效果。 另外,引用4中的例子是通过LinearLayout的layout_gravity来让Button在父容器中居中,但用户的问题是关于Button内部图片的居中,所以可能需要更关注Button自身的属性设置,比如android:gravitydrawable的定位。比如,设置Button的gravity为center,并且使用drawableTop,同时调整drawablePadding或者图片的大小,使其在按钮内部居中。 还有,引用3提到的问题是用drawableTop时图片靠近顶部,这时候可能需要设置Button的gravity为center,并且确保drawable本身的大小适合,或者使用自定义的drawable资源,通过XML设置图片的缩放类型为居中。例如,创建一个layer-list的drawable,将图片居中放置,然后设置为Button的背景或者drawable。 可能需要综合几种方法:移除默认背景(如果有干扰的话),设置drawable的位置属性,调整gravity,以及可能的自定义drawable。例如,设置android:drawableTop="@drawable/icon"同时设置android:gravity="center",这样图片文字都会垂直水平居中。另外,可能需要设置padding为0,避免默认的padding影响居中效果。 总结步骤可能是:1. 使用drawableTop、drawableStart等属性添加图片;2. 设置Button的gravity为center;3. 调整drawablePadding或自定义drawable来确保图片居中。或者,使用自定义的drawable XML,将图片居中显示,然后作为Button的背景或drawable。 需要检查各个引用中的有效方法,确保语法正确,比如正确的属性名称值。比如,android:gravity控制内容在View内部的对齐,而android:layout_gravity控制View在父容器中的对齐。因此,对于Button内部的图片居中,应使用android:gravity="center"。同时,结合drawable的放置属性,可能需要同时设置drawable的位置gravity。 另外,引用2中的例子使用了drawableStarttext一起居中,可能说明AppCompatButton支持drawable文本同时居中,所以推荐使用AppCompatButton并设置相应的属性。或者,使用支持库中的按钮样式,确保兼容性。 可能的解决方案包括:方法一,通过XML属性设置drawablegravity;方法二,自定义drawable资源;方法三,使用布局包裹图片。需要根据具体情况选择最适合的方法,并确保代码示例正确。</think>### Android Button图片居中实现方法 #### 方法一:使用`drawableTop`等属性结合`gravity`控制 1. **移除默认背景干扰**(若存在): 若Button设置了自定义背景,需先移除默认样式避免布局冲突: ```xml <Button android:background="@null" <!-- 移除默认背景 --> android:drawableTop="@drawable/ic_icon" android:gravity="center" <!-- 内容居中 --> ... /> ``` 2. **设置drawable与gravity属性**: 通过`drawableTop`、`drawableStart`等属性指定图标位置,并通过`gravity="center"`使图标文本居中: ```xml <Button android:drawableTop="@drawable/ic_icon" android:gravity="center" android:text="按钮" android:padding="0dp" <!-- 避免默认padding影响 --> ... /> ``` 此方法适用于同时显示图标文本的场景[^3][^2]。 #### 方法二:自定义Drawable实现精确控制 1. **创建图层列表XML**(如`drawable/button_icon.xml`): 使用`<layer-list>`将图标居中,并设置固定大小: ```xml <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:gravity="center"> <bitmap android:src="@drawable/ic_icon" android:gravity="center" android:width="24dp" android:height="24dp"/> </item> </layer-list> ``` 2. **应用自定义Drawable到Button**: 将上述XML设为Button的背景或单独drawable: ```xml <Button android:drawableStart="@drawable/button_icon" android:gravity="center" ... /> ``` 此方法适合需要精确控制图标尺寸位置的场景。 #### 方法三:通过布局容器包裹ImageButton 若仅需显示图标且无文本,可直接使用`ImageButton`并设置缩放类型: ```xml <ImageButton android:src="@drawable/ic_icon" android:scaleType="centerInside" <!-- 图片居中且自适应 --> android:adjustViewBounds="true" <!-- 保持宽高比 --> ... /> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值