Compose 实现页面侧滑返回

该博客分享了如何在Android中使用Jetpack Compose模仿iOS的全屏侧滑返回效果。主要通过组合使用Accompaint的Pager模块和反射技术,动态改变窗口透明度。在滑动到第一页时,利用反射将窗口设为透明,实现滑动返回的效果。同时,文中提供了使用HorizontalPager和Swipeable两种不同实现方式的代码示例,并强调了在特定情况下可能存在的滑动冲突问题。最后,博主提醒读者关闭activity的finish动画以完善体验。

最近研究了一下,使用Compose如何去做类似ios的全屏侧滑返回效果,下面展示成果:

总共需要几个功能进行搭配使用:

1.Accompaint的Pager模块

2.通过反射使当前窗口透明以及不透明

思路分析:

pager类似于android原生的viewpager,通过初始化两个page,默认定位到Index=1的page,index=0的page将其设置为带透明背景的page,在滑动到page=0的时候,将窗口设置为透明,则实现了滑动返回效果(滑动过程中,可以看到下方页面)

至于为何使用反射来实现动态的透明窗口,而不是使用在style中设置透明背景,很多博客都有所解释,有的是说会对动画效果产生影响,有的说会导致下层activity生命周期混乱,以及加大内存开销等等,博主并没有对这些东西进行求证,有兴趣的可以自行求证,那也在这里贴一下style实现透明窗口的方式(本文并未采用这种方式):

      <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>

下方贴代码讲述最终实现:

首先是反射将窗口设置透明的代码:

object SlideBackUtil {
    //当前是否是透明
     var isTrans = false

    /**
     * 反射将窗口转为透明
     */
    fun convertToTranslucent(activity: Activity) {
        if (activity.isTaskRoot|| isTrans) return
        try {
            getTranslucentConversionListenerClass()?.let { listenerClass ->
                val listener = getTranslucentConversionListener(listenerClass)
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    val activityOption =
                        Activity::class.java.getDeclaredMethod("getActivityOptions")
                    activityOption.isAccessible = true
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值