Jetapck Compose 去除点击水波纹效果

这篇具有很好参考价值的文章主要介绍了Jetapck Compose 去除点击水波纹效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:Jetpack Compose 中使用 Material 包中的控件,点击默认会有水波纹效果。如何去除这个点击水波纹效果呢?
看下 Modifier.clickable 的签名:

fun Modifier.clickable(
    interactionSource: MutableInteractionSource,
    indication: Indication?,
    enabled: Boolean = true,
    onClickLabel: String? = null,
    role: Role? = null,
    onClick: () -> Unit
)

其实就是 indication 这个参数决定的。

针对局部单个点击去除水波纹效果,我们只需要将该参数设置为 null 即可。
针对全局如何设置呢? indication 参数默认值是 indication = LocalIndication.current。显然这是通过 CompositionLocal 的方式传递下来的。那么我们只需要自己定义一个 Indication,在上层把这个属性值给替换掉即可。比如需要对整个 Activity 生效,就在该 Activity 的根组合项中替换,如果需要整个应用生效,可以在主题中进行替换。

先看一下默认的 Indication 是如何实现的:

val LocalIndication = staticCompositionLocalOf<Indication> {
    DefaultDebugIndication
}

private object DefaultDebugIndication : Indication {

    private class DefaultDebugIndicationInstance(
        private val isPressed: State<Boolean>,
        private val isHovered: State<Boolean>,
        private val isFocused: State<Boolean>,
    ) : IndicationInstance {
        override fun ContentDrawScope.drawIndication() {
            drawContent()
            if (isPressed.value) {
                drawRect(color = Color.Black.copy(alpha = 0.3f), size = size)
            } else if (isHovered.value || isFocused.value) {
                drawRect(color = Color.Black.copy(alpha = 0.1f), size = size)
            }
        }
    }

    @Composable
    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {
        val isPressed = interactionSource.collectIsPressedAsState()
        val isHovered = interactionSource.collectIsHoveredAsState()
        val isFocused = interactionSource.collectIsFocusedAsState()
        return remember(interactionSource) {
            DefaultDebugIndicationInstance(isPressed, isHovered, isFocused)
        }
    }
}

其实在这个文件中已经实现了一个 NoIndication, 只不过是 private 的:

private object NoIndication : Indication {
    private object NoIndicationInstance : IndicationInstance {
        override fun ContentDrawScope.drawIndication() {
            drawContent()
        }
    }

    @Composable
    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {
        return NoIndicationInstance
    }
}

这里面涉及到了两个接口:

@Stable
interface Indication {

    @Composable
    fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance
}

interface IndicationInstance {

    fun ContentDrawScope.drawIndication()
}

看起来,逻辑很清晰,自定义一个 Indication 需要两步:

  1. 实现IndicationInstance 接口,实现 ContentDrawScope.drawIndication() 方法。并把这个对象返回。看方法名,应该就是绘制点击效果。默认实现中使用到了 interactionSource ,根据点击的状态不同,绘制出不同的效果。
  2. 实现 Indication 的接口,实现 rememberUpdatedInstance 方法,返回上面的 IndicationInstance 类型的对象。

有了理论基础,我们实操一下,去掉点击水波纹效果,也分为两步:

  1. 定义一个无点击效果的 Indication。直接把源码中的那个私有的照抄就行了,让我们应用可用。
object NoIndication: Indication {
    private object NoIndicationInstance: IndicationInstance {
        override fun ContentDrawScope.drawIndication() {
            drawContent()
        }

    }

    @Composable
    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {
        return NoIndicationInstance
    }

}
  1. 应用这个 Indication
@Composable
fun CustomTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    ...
    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = {
            CompositionLocalProvider(LocalIndication provides NoIndication) {
                content()
            }
        }
    )
}

Done !!!

相信有了这个理论基础,我们完全可以自定义自己想要的点击效果了。文章来源地址https://www.toymoban.com/news/detail-859373.html

到了这里,关于Jetapck Compose 去除点击水波纹效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity 实现水的波纹效果

    之前的实现过这个效果,可惜没有记笔记,所以现在有点遗忘,连多个波纹一起在水面上实现的效果都忘记了,所以,查看了下之前实现的代码,现在再记一下笔记。 要实现波纹,首先要知道波纹的中心点,这个位置应该是世界空间坐标系的位置,然后还要知道扩散到了哪里

    2024年02月09日
    浏览(43)
  • Android水波纹按压效果(不按时透明)

    按压后的效果(左边\\\"Cancle\\\"是不按压的效果)  button_water_ripple_bg.xml button_water_ripple.xml 参考链接 1、Android 按钮实现按压水波纹效果_安卓按钮效果_路宇的博客-CSDN博客 2、https://www.cnblogs.com/baiqiantao/p/8b57d809d212be6301bf5af850c115c7.html (讲解了android:id/mask)

    2024年02月14日
    浏览(42)
  • OLED透明屏水波纹效果:打造独特的显示体验

    OLED透明屏水波纹效果是一种独特的显示技术,通过模拟水波纹的视觉效果,为用户带来更加生动逼真的观感。 根据市场调研报告显示,OLED透明屏水波纹效果已经在广告、游戏和商业领域得到广泛应用,为品牌提供了新的展示方式,同时也为用户带来了更加震撼和独特的观感

    2024年02月11日
    浏览(41)
  • UnityShader基础案例(二)——UI流光,扭曲,外边框,波纹效果

    结果:                   实现需要三张图片,一个便是要显示的主纹理,一个是主纹理的透明通道纹理(用于识别边框),一个是流光纹理。         还有一种UI流光是在外面一直转圈的。         不只是局限于UI,场景中的传送门也可以这样做,加个广告牌技术,

    2024年02月02日
    浏览(62)
  • Android Button修改背景颜色及实现Button水波纹效果

    Android Button修改背景颜色及实现Button水波纹效果,效果如下:   以下基于API33(Android13.0),向下兼容至API24(Android7.0)。 我们可以发现在布局xml文件中直接修改background是没有作用的,会变成默认的主题色(themes.xml中的colorPrimary颜色,默认为紫色) 这是由于在Android4.1之后的

    2024年02月07日
    浏览(49)
  • 【ArcGIS Pro微课1000例】0029:绘制全球海洋波纹荡漾效果图

    本文讲解ArcGIS Pro3.0中,基于全球航洋面状矢量数据,绘制震撼全球海洋波纹荡漾效果图。 绘制好的海水波纹荡漾效果图如下: 下面我们来学习绘制过程。 波纹荡漾效果需要在全局或者局部场景中制作。打开软件,点击新建地图→新建全局场景。 全局场景: 加载配套案例数

    2024年02月15日
    浏览(46)
  • Android RecyclerView之最基本使用教程完整示例(列表/分隔线/点击事件响应/水波纹特效等实现)

    前面几篇文章我们学了Listview的一些基本使用和面向实用优化性的一些进阶自定义用法。这篇文章开始学习RecyclerView,还是先从一个最简单的示例开始。 本篇文章我们将用RecyclerView实现如下效果图(实现一个带分隔线有点击事件的列表,类似Listview ArrayAdapter的示例)  Listvi

    2024年02月08日
    浏览(50)
  • Jetpack Compose 深入探索系列四: Compose UI

    通过 Compose runtime 集成 UI Compose UI 是一个 Kotlin 多平台框架。它提供了通过可组合函数发出 UI 的构建块和机制。除此之外,这个库还包括 Android 和 Desktop 源代码,为 Android 和 Desktop 提供集成层。 JetBrains积极维护Desktop代码库,而Google维护Android和通用代码库。Android和Desktop源代码

    2024年02月12日
    浏览(48)
  • Jetpack Compose 学习汇总

    关于 Jetpack Compose 的学习本想只是简单的快速学习一下,结果万万没想到,竟然一下子折腾了好几个月。。。 下面将之前记录的 Jetpack Compose 相关的学习博文进行一个汇总链接整理,方便我以后自己查阅,也希望能帮到一些有正在学习 Compose 的道友。 Jetpack Compose 中的基础组件

    2024年02月12日
    浏览(41)
  • Jetpack Compose(6)——动画

    目录 一、低级别动画 API 1.1 animate*AsState 1.2 Animatable 1.3 Transition 动画 1.3.1 updateTransition 1.3.2 createChildTransition 1.3.3 封装并复用 Transition 动画 1.4 remeberInfiniteTransition —— 无限循环的 transition 动画 1.5 小结 二、Android Studio 对 Compose 动画调试的支持 三、AnimationSpec 动画规格 3.1 Sprin

    2024年04月26日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包