scaleType
scaleType有8种枚举值,按缩放和等比分为三类:
- 原尺寸:MATRIX、CENTER
- 缩放不等比:FIT_XY
- 缩放等比:FIT_START、FIT_CENTER、FIT_END、CENTER_CROP、CENTER_INSIDE
ImageButton
ImageButton派生自ImageView,ImageButton又派生了一个ZoomButton,ZoomButton可以代表"放大"和"缩小"两个按钮。
ZoomButton的行为基本类似于ImageButton,只是Android默认提供了btn_minus,btn_plus两个
Drawable资源,只要为ZoomButton的android:src属性分别指定btn_minus,btn_plus,即可实现"缩
小"和"放大"按钮。
Android还提供了一个ZoomControls组件,该组件相当于于同时组合了"放大"和"缩小"两个按钮,并允许分别为两个按钮绑定不同的事件监听器备。
ImageButton还有一个子类:FloatingActionButton,它代表一个悬浮按钮。
QuickContactBadge关联联系人
QuickContactBadge继承自ImageView,因此它的本质也是图片按钮,也可以通过android:src属性指定它显示的图片。QuickContactBadge额外增加的功能是:该图片可以关联到手机中指定联系人,当用户单击该图片时系统会打开相应联系人的联系方式界面。
tintMode
android:tintMode 是 Android 中用于定义着色混合模式的属性,通常与 tint 属性配合使用,决定指定颜色如何与原图(Drawable)像素进行混合。其底层对应 Porter-Duff 混合算法。
核心属性与用法
- 属性名:XML 中推荐使用
app:tintMode(兼容旧版),原生为android:tintMode。 - 作用对象:主要作用于
ImageView的src、View的background/foreground以及TextView的复合 drawable。 - 默认值:
src_in(最常用,直接替换原图颜色)。 - 适用版本:API 21+ 原生支持;低版本需通过
DrawableCompat.setTintMode()或AppCompat控件实现。
常见混合模式详解
假设原图为黑色图标,Tint 颜色为红色:
| 模式值 | 对应代码 | 效果描述 | 适用场景 |
|---|---|---|---|
| src_in | PorterDuff.Mode.SRC_IN | 取原图形状,填充 Tint 颜色,透明区保持透明 | 图标变色首选,完全覆盖原色 |
| src_atop | PorterDuff.Mode.SRC_ATOP | 在原图不透明处绘制 Tint,透明处不变 | 保留原图部分细节叠加颜色 |
| multiply | PorterDuff.Mode.MULTIPLY | 颜色相乘,整体变暗 | 模拟阴影、深色滤镜 |
| screen | PorterDuff.Mode.SCREEN | 颜色滤色,整体变亮 | 模拟高光、浅色滤镜 |
| add | PorterDuff.Mode.ADD | 颜色值相加,可能过曝 | 发光效果(API 29+ 更稳定) |
| src_over | PorterDuff.Mode.SRC_OVER | Tint 颜色覆盖在原图之上 | 半透明叠加效果 |
XML 使用示例
xml
<!-- 将图标变为红色,使用默认的 src_in 模式 --> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_icon" app:tint="#FF0000" app:tintMode="src_in" />
代码动态设置
kotlin
// 需先 mutate() 避免影响其他引用同一资源的 View val drawable = ContextCompat.getDrawable(context, R.drawable.ic_icon)?.mutate() DrawableCompat.setTint(drawable!!, Color.RED) DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN) imageView.setImageDrawable(drawable)
注意事项
- Vector 图标限制:Vector XML 文件中不能直接写
tintMode,必须在引用该 Vector 的控件(如 ImageView)上设置。 - Fill Color 冲突:若 Vector 内部
fillColor非纯黑/透明,可能导致着色异常,建议 Vector 资源保持单色(黑/白)。 - 兼容性:在 API < 21 设备上,直接使用
android:tintMode无效,务必使用app:tintMode配合AppCompatImageView或代码方式。

8637

被折叠的 条评论
为什么被折叠?



