针对drawableStart(Top、End、Bottom)边距的设置-Android布局技巧

2023-05-16

作为Android程序猿,在开发布局的过程中,我们的宗旨是能用一个View完成的效果,绝不会用两个View或者嵌套View来完成。至于它的好处,就不言而喻了吧。不懂的自行到网上看,或者大牛请直接跳过。今天就让我们针对下图中的布局点来讲述drawableStart的边距使用。
在这里插入图片描述
当我们看到图中第一个感觉可能是要通过三个View来实现这个效果,代码如下:

   <LinearLayout
            android:id="@+id/ll_check_in"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/personal_center_check_in_bg"
            android:gravity="center_vertical"
            android:minHeight="@dimen/dimen_30dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toBottomOf="@+id/iv_personal_avatar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="@+id/iv_personal_avatar">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dimen_10dp"
                android:src="@drawable/gold_icon"
                tools:ignore="ContentDescription" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/dimen_2dp"
                android:layout_marginEnd="@dimen/dimen_14dp"
                android:gravity="center_vertical"
                android:text="@string/check_in"
                android:textColor="@android:color/white"
                android:textSize="@dimen/dimen_13sp" />
   </LinearLayout>

但是大家有没有发现实现这个效果通过了两个层级,三个View实现的。这对于简单的布局层级可能影响不大,但是对于超复杂的页面,页面的布局有上百个View时,比如Launcher或者淘宝系的应用,就会带来多么可怕的灾难。

那我们可不可用通过android:drawableStart属性来实现上面的效果那,这样就可以通过一个View实现了。答案是可以的,不过会有一个坑,而解决这个坑就是我们今天要讲的主题。

对于这个坑,可能大家已经想到了,就是通过android:drawableStart设置的图片不能设置左边距。什么意思那,就是说Android提供了在TextView中文字和图片的边距,通过android:drawablePadding去设置。但是如果android:drawableStart设置图片后,想让图片和左边有一定的边距,从而实现上面的效果,这个在常规情况下是实现不了。
常规操作是如下效果:
在这里插入图片描述
代码如下:

    <TextView
            android:id="@+id/tv_check_in"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableStart="@drawable/gold_icon"
            android:drawablePadding="@dimen/dimen_2dp"
            android:paddingEnd="@dimen/dimen_14dp"
            android:background="@drawable/personal_center_check_in_bg"
            android:gravity="center_vertical"
            android:minHeight="@dimen/dimen_30dp"
            android:text="@string/check_in"
            android:textColor="@android:color/white"
            android:textSize="@dimen/dimen_13sp"
            app:layout_constraintBottom_toBottomOf="@+id/iv_personal_avatar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="@+id/iv_personal_avatar" />

对于解决这个问题,方案有二

第一个方案:

可以通过layer-list来解决,新建一个类型为layer-list的drawable,然后设置一个android:left的大小(是指左边距的大小),并将这个drawable设置到android:drawableStart即可达到上图的效果。

drawable的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/gold_icon"
        android:left="@dimen/dimen_10dp">
    </item>
</layer-list>

对于这种方案,其实我是不太建议使用的,因为它虽然能实现上图的效果,但是它多一层绘制层级,所以比较推荐下面的一种方案。

第二个方案:

对于这种方案,需要通过代码中textView.setCompoundDrawablesRelative进行动态设置,

  • 先获取需要展示Drawable
Drawable drawable = getResources().getDrawable(R.drawable.gold_icon);
  • 设置drawable的左边距,其实本质上就是设置左边距的绘制区域
int padding = (int) getResources().getDimension(R.dimen.dimen_10dp);
//设置Drawble的绘制区域,这一步是重点
drawable.setBounds(padding, 0, drawable.getIntrinsicWidth() + padding, drawable.getIntrinsicHeight());

*进行左边图片的展示

 textView.setCompoundDrawablesRelative(drawable,null,null,null);
  • 设置android:drawablePaddingandroid:minWidth,这一步也是重点
   //这个值设置的很重要,它必须包含边距和图片宽度的值,不然会导致显式异常
   android:minWidth="75dp"
   //这个值,必须包含边距的值,这个边距是指:图片距离左边的边距+图片距离文字的边距
   android:drawablePadding="@dimen/dimen_2dp"

至此上面的坑解决了,至于大家采用那种方案,可根据个人的需求选择。不过个人建议还是第二种方案比较节省绘制层级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对drawableStart(Top、End、Bottom)边距的设置-Android布局技巧 的相关文章

随机推荐

  • c++pthread多线程消费者问题

    分布式选修课上讲了多线程编程 xff0c 布置了一个生产者消费者的作业 xff0c 觉得挺有意思 xff0c 并且网络上的消费者问题多使用c语言编写 xff0c 故在此记录c 43 43 解决方法 由于是消费者线程各自计数 xff0c 故使
  • 红包动画

    lt DOCTYPE html gt lt html lang 61 34 en 34 data dpr 61 34 1 34 style 61 34 font size 32px 34 gt lt head gt lt meta char
  • Android中<xliff:g></xliff:g>的用法

    在查阅修改Android源码的过程中经常能在字符串资源中看到类似下面的标签 xff1a span class hljs tag lt span class hljs title resources span span class hljs
  • vue单文件组件的格式规范

    lt template gt lt template gt lt script gt export default name 39 39 mixins components props data return computed watch
  • Linux命令行安装weblogic12c

    Linux命令行安装weblogic12c 一 安装jdk 若已安装可跳过 1 Oracle官网下载jdk linux安装包 2 卸载linux系统中自带的jdk 使用rpm qa grep java查询出系统自带的jdk xff1b 使用
  • Ubuntu 远程免密码登录设置

    我们正常使用 ssh 远程登录服务器进行操作 xff0c 需要输入用户名 服务器ip以及密码 xff0c 当我们需要同时管理多个服务器的时候 xff0c 每次都需要重复输入这些东西会显得特别麻烦和浪费时间 xff0c 因此我们可以通过配置密
  • Mybatis resultMap启动时报错:Could not resolve type alias userResultMap Cannot find class: userResultMap

    MyBatis中在查询进行select映射的时候 xff0c 返回类型可以用resultType xff0c 也可以用resultMap xff0c resultType是直接 表示返回类型的 xff0c 而resultMap则是对外部Re
  • synchronized-锁总结

    目录 一 相关知识点 1 1 对象头 1 2 锁相关概念 1 3 查看对象头工具 二 锁流程 2 1 加锁 xff1a monitorenter 2 2 释放锁 xff1a monitorexit 一 相关知识点 在 JDK1 6 之前 x
  • 软件工程师校招面试救急包

    LeetCode牛人总结 xff08 手撕代码前看看 xff0c 抱佛脚 xff09 https github com labuladong fucking algorithm blob master README md 剑指offer x
  • 微信SDK中含有的支付功能怎么去掉?

    一 说在前面的话 这两天遇到一个特别让我DT的问题 xff0c 估计大家通过标题就能知道问题了 没错 xff0c 就是在应用中集成了微信SDK后 xff0c 它自动支持了微信分享 登录 收藏 支付等功能 这一点没啥 xff0c TM的关键点
  • Android中图片的镂空效果(不规则图形的镂空)

    一 说在前面的话 我们在做新手引导时 xff0c 经常会遇到凸显某一块功能时需求 xff0c 类似于下图 xff1a 看到这个功能点可能会有点头大 xff0c 不过好在Android为我们提供一个美好的工具 xff1a PorterDuff
  • 利用三层交换机实现VLAN间路由

    原理概述 xff1a VLAN将一个物理的LAN在逻辑上划分成多个广播域 VLAN内的主机间可以直接通信 xff0c 而VLAN间不能直接互通 在现实网络中 xff0c 经常会遇到需要跨VLAN相互访问的情况 xff0c 工程师通常会选择一
  • Failed to resolve attribute at index 6: TypedValue{t=0x2/d=0x7f0400cd a=7 r=0x7f06006e}

    今天在开发时 xff0c 遇到一个程序的Bug xff0c 记录一下 在Dialog中展示一个布局 xff0c 布局中包含了TextView报了下面的错误 xff0c 最开始还以为是颜色设置的问题 xff0c 反复核对了一下颜色设置并没有问
  • TextView的TextColor中使用selector的问题

    在TextView中如果设置选中 点击 获取焦点时 xff0c 文字颜色发生改变时 xff0c 一般我们会通过代码中设置 不过Android给我们提供了一个更简洁的方式 xff0c 就是通过selector去改变 只需要在Res目录下创建一
  • 彻底理解Java中堆和栈的区别

    1 概述 在Java中 xff0c 内存分为两部分 xff0c 一种是堆内存 xff0c 另一种就是栈内存 2 Java中变量在内存中的分配 1 类变量 static修饰的变量 xff1a 在程序加载时系统就为它在堆中开辟了内存 xff0c
  • 深入了解多线程的原理

    说在前面的话 使用多线程的目的 在多个CPU核心下 xff0c 多线程的好处是显而易见的 xff0c 不然多个CPU核心只跑一个线程其他的核心就都浪费了即便不考虑多核心 xff0c 在单核下 xff0c 多线程也是有意义的 xff0c 因为
  • An operation is not implemented: not implemented被坑之路[Kotlin]

    吐槽一下 xff0c 程序猿的辛酸史 今天在开发新项目时 xff0c 首次使用了Kotlin语言 xff0c 对于之前只在纸上谈兵 xff0c 未在项目中使用过的码农 xff0c 很是一脸懵逼 但是迫于公司的要求 xff0c 只能硬头皮冲吧
  • 开发Android Camera—使用Kotlin语言,完成第一个自定义相机

    对于首次使用Kotlin语言开发 xff0c 在网上苦于寻找不到Kotlin语言编写的相机代码 xff0c 故写下这篇博客 好了 xff0c 咱们进入主题 在Android 5 0 xff08 SDK 21 xff09 中 xff0c Go
  • Android ConstraintLayout性能分析

    这篇文件是讲述ConstraintLayout性能的分析 xff0c 如果对于使用ConstraintLayout不是很了解的情况下 xff0c 请查看Android ConstraintLayout完全解析和性能分析 xff08 章节一
  • 针对drawableStart(Top、End、Bottom)边距的设置-Android布局技巧

    作为Android程序猿 xff0c 在开发布局的过程中 xff0c 我们的宗旨是能用一个View完成的效果 xff0c 绝不会用两个View或者嵌套View来完成 至于它的好处 xff0c 就不言而喻了吧 不懂的自行到网上看 xff0c