Kotlin--›Android 极致体验,图片转场动画(类似微信/QQ图片查看效果, 带拖拽返回, 高扩展, 支持任意类型界面过渡)

2023-05-16

效果图(大于2MB):
在这里插入图片描述
本文核心:

Transition
TransitionManager

文章目录

  • 1. Transition 入门
    • captureStartValues
    • captureEndValues
    • createAnimator
    • 例子1: ColorTransition(颜色过渡动画)
    • 例子2: AlphaTransition(透明度过渡动画)
  • 2.TransitionManager 使用
  • 联系作者

1. Transition 入门

转场动画, 是由若干个Transition对象组成的, 而Transition的本质, 依旧是Animator, 毕竟这才是Android的动画.

所以, Transition的作用, 就是用来创建 Animator 的.

Transition 的核心方法如下:

  public abstract void captureStartValues(@NonNull TransitionValues var1);

  public abstract void captureEndValues(@NonNull TransitionValues var1);
  
  @Nullable
   public Animator createAnimator(@NonNull ViewGroup sceneRoot, @Nullable TransitionValues startValues, @Nullable TransitionValues endValues) {
        return null;
   }

captureStartValues

此方法的作用, 就是保存动画开始时, 需要的值

captureEndValues

此方法的作用, 就是保存动画结束时, 需要的值

createAnimator

通过动画开始的值动画结束的值 创建动画.

举个例子:

例子1: ColorTransition(颜色过渡动画)

class ColorTransition : Transition() {
    companion object {
        private const val KEY = "android:ColorTransition:color"
    }

    override fun captureStartValues(values: TransitionValues) {
        captureValues(values)
    }

    override fun captureEndValues(values: TransitionValues) {
        captureValues(values)
    }

    private fun captureValues(values: TransitionValues) {
        val view = values.view
        if (targets.contains(view)) {
            (view.background as? ColorDrawable)?.let {
                values.values[KEY] = it.color
            }
        }
    }

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {
        if (startValues != null && endValues != null) {
            val startColor = startValues.values[KEY]
            val endColor = endValues.values[KEY]

            if (startColor != endColor) {
                val colorAnimator = ValueAnimator.ofObject(ArgbEvaluator(), startColor, endColor)
                colorAnimator.addUpdateListener { animation ->
                    val color = animation.animatedValue as Int//之后就可以得到动画的颜色了.
                    startValues.view.setBackgroundColor(color)//设置一下, 就可以看到效果..
                }
                colorAnimator.duration = duration
                colorAnimator.interpolator = interpolator
                return colorAnimator
            }
        }
        return null
    }
}

例子2: AlphaTransition(透明度过渡动画)

class AlphaTransition : Transition() {
    companion object {
        private const val KEY = "android:AlphaTransition:alpha"
    }

    override fun captureStartValues(values: TransitionValues) {
        captureValues(values)
    }

    override fun captureEndValues(values: TransitionValues) {
        captureValues(values)
    }

    private fun captureValues(values: TransitionValues) {
        val view = values.view
        if (targets.contains(view)) {
            values.values[KEY] = view.alpha
        }
    }

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {
        if (startValues != null && endValues != null) {
            val startAlpha: Float = startValues.values[KEY] as Float
            val endAlpha: Float = endValues.values[KEY] as Float

            if (startAlpha != endAlpha) {
                val animator = ValueAnimator.ofFloat(startAlpha, endAlpha)
                animator.addUpdateListener { animation ->
                    val value = animation.animatedValue as Float
                    startValues.view.alpha = value
                }
                animator.duration = duration
                animator.interpolator = interpolator
                return animator
            }
        }
        return null
    }
}

到这里, 是不是 觉得Transition很简单?

其实就是这么简单.

那怎么使用Transition对象呢?
莫急.
接下来就是…

2.TransitionManager 使用

注意,注意,注意:

使用Transition三步骤:

  1. 设置动画view动画开始时的属性
  2. 创建Transition对象, 调用 TransitionManager#beginDelayedTransition 方法.
  3. 设置动画view动画结束时的属性

之后, 动画就会自动执行.

写成代码就是如下步骤:

 open fun doTransition() {
     onTransitionBeforeValues()  //对应步骤1
     post { //请注意, post是核心操作, 必须使用post, 否则 `动画view`的属性还没有被 `captureStartValues` 捕捉, 就被 `onTransitionAfterValues` 覆盖了.
         onCreateTransition()    //对应步骤2
         onTransitionAfterValues()  //对应步骤3
     }
 }
 open fun createTransitionSet(): TransitionSet {
       val transitionSet = TransitionSet()
       transitionSet.addTransition(ChangeTransform())
       transitionSet.addTransition(ChangeScroll())
       transitionSet.addTransition(ChangeClipBounds())
       transitionSet.addTransition(ChangeImageTransform())
       transitionSet.addTransition(ChangeBounds())
       transitionSet.addTransition(ColorTransition())

       transitionSet.duration = ANIM_DURATION
       transitionSet.interpolator = FastOutSlowInInterpolator()
       transitionSet.addTarget(rootLayout)
       return transitionSet
   }

明白了核心关键, 剩下的就是针对项目的逻辑封装了.

各位, 请直接前往 砖厂地址 查看.

友情提示

如果使用Glide加载图片, 请使用原始大小的图片 requestOptions.override(Target.SIZE_ORIGINAL) , 否则图片在过渡的时候, 不能做到无缝切换.


群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此快速加群

请使用QQ扫码加群, 小伙伴们都在等着你哦!

关注我的公众号, 每天都能一起玩耍哦!

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

Kotlin--›Android 极致体验,图片转场动画(类似微信/QQ图片查看效果, 带拖拽返回, 高扩展, 支持任意类型界面过渡) 的相关文章

  • networkx画图

    使用networkx画图 xff0c 关键是掌握draw networkx edges draw networkx nodes和draw networkx labels三个方法的使用 xff0c 设置好位置列表 xff0c 节点列表 xff
  • virt-manager cannot open display

    解决方法 xff1a 1 vi etc ssh sshd config 2 找到 34 X11Forwarding no 34 修改为 34 X11Forwarding yes 34 3 service sshd restart 4 重启终
  • 【蓝牙模块】三款常用的基础蓝牙模块,HC05,JDY-31,CC2541介绍与测试说明

    文章目录 一 HC05二 JDY 311 介绍2 测试 二 CC2541 一 HC05 HC05与其他两款的区别是 xff0c 需要按住RST键进入AT指令模式 一 上电进入AT模式方法 先按住HC05蓝牙模块上面的RST按键 xff0c
  • #Ubuntu#SSH 新建虚拟机开启SSH服务

    由于Ubuntu默认未安装SSH服务 xff0c 所以需要通过联网下载安装SSH服务 前置条件 xff1a Ubuntu需要配置好网络地址 xff0c 并配置正确的DNS服务器 xff0c 能够正常上网 1 右键打开终端界面 xff0c 输
  • #Ubuntu#root 新建虚拟机怎么切换到root用户权限

    我现在新建了一台ubuntu xff0c 需要通过切换到root用户执行文件 xff0c 发现怎么切换都是失败的 通过su root命令 xff0c 输入普通用户的密码 xff0c 会显示认证错误 xff0c 百度了一下 xff0c 这是由
  • Gradle--›Spring Kotlin多模块项目搭建√

    文章目录 前言使用IntelliJ IDEA创建单模块工程搭建多模块环境创建主模块创建库模块 部署参考文档联系作者 前言 环境说明 工具版本IntelliJ IDEAUltimate 2021 1SpringBoot2 5 0Kotlin1
  • #华为 #usg 华为防火墙安全区域的概念

    简介 安全区域 xff08 Security Zone xff09 xff0c 或者简称为区域 xff08 Zone xff09 xff0c 是设备所引入的一个安全概念 xff0c 大部分的安全策略都基于安全区域实施 定义 一个安全区域是若
  • #VMware ESXI7.0的下载

    一 VMware ESXI7 0版本的下载 xff08 一 xff09 概述 VMware vSphere是VMware公司推出的服务器虚拟化解决方案 xff0c 包含两个重量级的产品 xff1a VMware ESXI和VMware vC
  • #VMware#ESXI 配置虚拟机服务器开机自启动

    目录 1 登录到esxi xff0c 配置管理模块 2 将虚拟机配置开机启动 3 返回主机管理界面 xff0c 完成配置 4 停电后重启主机 xff0c 查看并验证自启动是否生效 1 登录到esxi xff0c 配置管理模块 选择管理 系统
  • #VMware#ESXI ESXI如何修改管理IP

    目录 一 修改方法 1 进入硬件管理平台 2 登录虚拟控制台 二 实际操作 1 在主界面按 F2 并输入控制台界面root的密码 xff0c 进入设置界面 2 找到 configure Management Network 选项并按 Ent
  • #华为 #usg USG6000双链路透明部署实验(一)

    目录 一 实验背景 二 实验环境 三 实验步骤 1 在所有交换机创建对应vlan 2 在核心交换机创建网关 xff0c 所有的网段IP都是254 网段是10 10 10 0 24 10 10 13 0 24 3 配置接入交换机的管理IP x
  • #VMware#ESXI 修改主机的控制台HTTP/HTTPS端口

    目录 一 开启SSH服务 二 修改控制台的默认端口 1 关闭防火墙的情境下 xff1a 1 1 远程进入ESXI的后台 xff0c 修改HTTP端口配置文件 1 2 关闭ESXI防火墙 1 3 重启服务器 2 不关闭防火墙的情景下 xff1
  • #ESXI #Centos 业务服务器故障如何恢复盘

    一 环境描述 有一台centos7的业务服务器 xff0c 因为操作人员重大失误 xff0c 导致业务服务器宕机 xff0c 由于未做备份与快照 xff0c 无法进行恢复 xff0c 考虑通过将硬盘挂载在其他虚拟机上重新获取数据 设备环境为
  • pikachu 靶场搭建

    一 准备环境 1 搭建环境 win 10phpstudypikachu 2 下载链接 win10自行寻找资源 pickchu靶机下载地址 xff1a https github com zhuifengshaonianhanlu pikach
  • virtualbox命令行启动虚拟机和关闭虚拟机和虚拟机关闭防火墙

    查看virtualbox正在运行的虚拟机命令 VBoxManage list runningvms 根据查到的虚拟机 ip 号 使用后台命令启动虚拟机的方法 xff1a VBoxManage startvm ip 使用后台命令关闭虚拟机的方
  • android studio 最新3.0 kotlin与databinding 结合使用报错。

    最近android studio 3 0更新 xff0c 迫不及待将项目中的代码向kotlin转 其中转到有databinding的时候遇到报错 xff1a Unresolved reference databinding 找到网上解决办法
  • AS--›Android Studio内存大小设置和插件推荐(2021-1-14更新)

    调整AS的占用内存 多开工程毫无压力 AS 3 5 的版本 已经支持通过设置界面修改内存大小了 但是 旧方法依旧有效 文章目录 Windows修改方法MAC修改方法插件推荐 ignore A Search with GithubTransl
  • android Camera预览界面拉伸问题解决

    问题现象 项目中的扫一扫界面打开以后 xff0c 扫描二维码的界面显示的二维码被拉伸 xff0c 图片如下 xff1a 问题原因 通常 xff0c 拍照预览页面的视图拉伸主要与下面两个因素有关 xff1a Surfaceview的大小Cam
  • 什么是 AOP,AOP 的作用是什么?

    分析 amp 回答 AOP的介绍 AOP全称 xff08 Aspect Oriented Programming xff09 面向切片编程的简称 AOP面向方面编程基于IoC xff0c 是对OOP的有益补充 xff1b AOP利用一种称为
  • Ubuntu图形界面卡死的解决方法

    转到字符界面 xff1a Ctrl 43 Alt 43 F1 查看进程 xff1a ps t tty7 找到Xorg进程的PID号xxx xff0c 如992 杀死进程Xorg xff1a kill xxx xff08 这里是kill 99

随机推荐