属性动画实现旋转入场效果

这篇具有很好参考价值的文章主要介绍了属性动画实现旋转入场效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

属性动画和硬件加速

日常杂谈
06月07日

首先,我感觉这部分内容真的挺无聊的,没有什么让人新奇的感觉。不过为了博客的整体性,我还是想随便整理一下相关的知识和内容。

一如既往,聊聊我的日常生活,最近可能比较忙,所以可能没有那么多大段的时间来写博客。只能用那种零碎的时间来一点一点拼凑。虽然时间少不影响我追番,毕竟这个是我最大的爱好,也是我最大的解压和放松娱乐的方式,这点我不否认和排斥。

今天,停更一周的《我推的孩子》终于又要更新了,感觉非常非常的开心,说实话上一话的神结尾真的是震撼到我了,瞬间的场景变化,人物气场和表情的变化,女配光是通过肢体的不协调就看出了星野爱的未成年性体验经历。综上,期待今天晚上的番剧更新吧~

之前有人在我的博客下,说我的博客废话太多,然后另外一个人回复他说,他倒是挺喜欢我的这种博客方式的。然后那人就在那里阴阳怪气起来了,说什么你是懂反讽的。说实话,我挺惊讶的,没想到程序员圈子里还有这种货色,你是工作不饱和吗?来这里闲着还不如去多学习学习!


06月08日

随着工作强度的增加和要写的东西的复杂性增加,日常杂谈的篇幅可能要会分为好几部分了。正经人谁写日记啊,对,我就是那个不正经人。

前言

其实我感觉这部分的内容挺无趣的,不过我会尽量用比较有趣的案例来讲述吧。想了很久,到底用什么方式来讲述相关的内容会比较有趣,而不是单纯的在读教案。这点其实困惑了我挺久的,非常久,非常久,大概有10分钟左右吧,一直在想一直在想。然后我决定搞一个骚操作,弄个相对来说比较有挑战性的效果:变速旋转入场。

正文

其实想实现同一个动画效果存在非常非常多的方式,唯一的区别就是具体的实现是简单还是困难,性能高还是性能低而已。

首先,我们定义一个视图,在视图的正中间显示一张图片。

在我们的XML布局中定义我们所需要显示的图片信息,并将其居中显示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_view"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CiruyMainActivity">
    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/targetView"
        android:layout_margin="30dp"
        android:src="@drawable/avatar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</androidx.appcompat.widget.LinearLayoutCompat>

我们先来看一下怎么实现变速旋转入场,这里介绍两种可以实现对应效果的方法:

一、使用官方的动画API
因为我们需要实现的动画效果,实际上非常简单,单纯调用官方API就已经足够能够实现我们的需要。

在Activity中我们获取到XML文件中显示的视图,对其进行动画效果:

val targetView = findViewById<FlipView>(R.id.targetView)
        //旋转缩放入场
        targetView.animate()
            .rotation(360f)//原地旋转360度
            .scaleXBy(-0.5f)//缩小到原来的一半大小
            .scaleYBy(-0.5f)//缩小到原来的一半大小
            .setDuration(1000)//设置动画的时长
            .setStartDelay(1500)//设置动画开始的等待时间
            .start()	

通过如上代码,我们就能实现视图的旋转和同步缩放效果。

二、通过自定义属性动画的方式来实现对应的效果

这个相对于前面的方式可能会稍微复杂一些,但是优点在于这种方式更加灵活,当然也有缺点,这个在之后会进行提及。

这个方式主要分为如下几个步骤:

  1. 定义一个自定义视图,在自定义视图中定义一个参数,然后我们视图绘制就根据这个参数来进行绘制。

这里使用了kotlin中的重载操作符,让后续进行进度计算时,代码更加清晰。没办法,代码强迫症,不太喜欢让代码变得太过于复杂。

class ObjectAnimatorView(context: Context, attributeSet: AttributeSet) :
    View(context, attributeSet) {
    private val mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
    var mViewParam = ViewParam(0f, 1f)
    set(value) {
        field = value
        invalidate()//在接收到属性更新的时候,让视图在下次刷新页面的时候刷新状态
    }
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        //获取到图片文件,根据具体的scale值来动态决定到底获取多大的视图信息
        val bitmap = R.drawable.avatar.getBitmap(context, (width*mViewParam.scale).toInt())
        val bWidth = bitmap.width//图片宽度
        val bHeight = bitmap.height//图片高度
        canvas.save()
        //旋转图片
        canvas.translate(width/2f,height/2f)
        canvas.rotate(mViewParam.rotate)
        canvas.translate(-width/2f,-height/2f)
        canvas.drawBitmap(bitmap, width / 2f - bWidth / 2, height / 2f - bHeight / 2, mPaint)
        canvas.restore()
    }

}
//自定属性存储bean,重载操作符
data class ViewParam(val rotate: Float, val scale: Float){
    operator fun plus(other: ViewParam) = ViewParam(rotate+other.rotate,scale+other.scale)
    operator fun minus(other: ViewParam) = ViewParam(rotate-other.rotate,scale-other.scale)
    operator fun times(time:Float) = ViewParam(rotate*time,scale*time)
}
  1. 在Activity中获取到这个视图,自定义一个ObjectAnimator,启动动画。
val targetView: ObjectAnimatorView = findViewById<ObjectAnimatorView>(R.id.targetView)
        ObjectAnimator.ofObject(
            targetView,
            "mViewParam",
            typeEvaluator,
            ViewParam(360f, 0.5f)//原地旋转360度,同时缩小宽高到原来的一半
        ).apply { startDelay = 1000
        duration = 1000}
            .start()
//自定义每一个时刻的动画播放进度
 val typeEvaluator:TypeEvaluator<ViewParam> =
        TypeEvaluator<ViewParam> { fraction, startValue, endValue -> startValue + (endValue-startValue)*fraction }

另外再谈谈硬件加速吧,什么是硬件加速?设备中其实有一个叫GPU的好东西,它相对于CPU更擅长处理简单的动画变换效果。而将这部分所谓的简单的动画效果交给GPU来处理,

开启视图硬件加速的方式:在视图初始化代码中添加如下方法,

    init {
        setLayerType(LAYER_TYPE_HARDWARE, null)
    }

另外还需要再动画方法里面添加离屏缓存,即withLayer方法:

//旋转缩放入场
targetView.animate()
    .rotation(360f)
    .scaleXBy(-0.5f)
    .scaleYBy(-0.5f)
    .setDuration(1000)
    .setStartDelay(1500)
    .withLayer()
    .start()

注意:Android硬件加速只对如上这样官方定义的简单效果有性能提升效果,具体哪些有优化效果请参考官方文档。对于自定义的动画效果,反而会影响性能。文章来源地址https://www.toymoban.com/news/detail-476602.html

到了这里,关于属性动画实现旋转入场效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • JavaScript、Vue实现大数据大屏展示3D旋转动画效果

    最近在写一些数据大屏的时候客户需要做个3D旋转动效的效果,简单整理之后写了一个小demo做下记录,先看一下效果: 当点击next的时候,整个模块旋转切换到下个菜单,点击prev的时候也可以切换到上一个菜单效果。 首先我们先构建一个大体的dom结构,如下: 编写基本的css样

    2024年02月11日
    浏览(41)
  • 【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出

    在资金明细的页面中,点击按钮时筛选区域从左侧滑出,完成筛选点击确认后调用接口完成数据查询,筛选区域滑入左侧; https://www.cnblogs.com/yadiblogs/p/10145625.html  

    2024年02月10日
    浏览(48)
  • svg常用属性及动画效果

    在前端开发中,使用SVG(可缩放矢量图形)已经成为一种常见的技术选择。SVG是一种基于XML的图像格式,它使用矢量图形来描述图像,而不是像传统的位图图像那样使用像素。这使得SVG图像在缩放和调整大小时保持清晰度,无论是在高分辨率屏幕上还是在不同大小的设备上。

    2024年02月07日
    浏览(48)
  • 前端css/less绕椭圆轨道旋转动画 带遮挡效果 3D

    效果如图,多个物体在轨道上绕中心物体旋转,当旋转到物体后面时将被遮挡。主要使用css实现,为了简化代码,引入less进行处理。 本质上是使用动画控制轨道带动内部的物体进行旋转,计算出每个物体在椭圆轨道上的位置,使用绝对定位放置物体。由于轨道上物体有多个

    2024年02月03日
    浏览(93)
  • 【CSS笔记】CSS动画效果(2d、3d)之渐变色、过渡、变换、平移、缩放、旋转、倾斜、关键帧动画

    这篇文章,主要介绍CSS动画效果(2d、3d)之渐变色、过渡、变换、平移、缩放、旋转、倾斜、关键帧动画。 目录 一、2d动画 1.1、渐变色 (1)线性渐变色 (2)径向渐变色

    2024年02月02日
    浏览(93)
  • CSS动画属性关键帧Keyframes详解:创建令人惊叹的动画效果

    CSS中的关键帧(Keyframes)是一种强大的工具,可用于创建各种动画效果,从简单的渐变到复杂的运动路径。通过定义关键帧的属性值和时间轴上的位置,我们可以实现令人惊叹的视觉效果。本文将详细介绍CSS动画属性关键帧Keyframes的使用方法,并提供相应的源代码示例。 关键

    2024年01月23日
    浏览(59)
  • 2023-03-18 Android app 用进度条ProgressBar 圆形样式做加载loading效果,旋转动画

    一、activity_main.xml 布局文件 二、定义的图形资源progress_circle_bg.xml,把改文件放置drawable目录下面, 通过修改thicknessRatio值修改圆边边的粗细。 三、真机运行效果图如下 四、参考文章 Android组件篇--ProgressBar(二)改变滚动条样式_qing_soft的博客-CSDN博客  

    2024年02月14日
    浏览(35)
  • 微信小程序 - 签到打卡旋转 3D 动画功能,仿钉钉打卡签到时 “容器“ 动画翻转效果(超详细完整示例源码教程,代码简洁、丝滑流畅、示例复制即用)

    由于微信小程序的动画与普通 CSS 动画稍有不同,所以网上基本没有这方面的功能源码。 本文 实现了微信小程序开发中,类似钉钉签到打卡时的动画效果,圆形硬币形状的翻转功能, 您可以直接复制示例源码,功能都做好了只需要把你的内容放进入即可。 如下图所示,当点

    2024年02月11日
    浏览(100)
  • Flutter 类似onResume 监听,解决入场动画卡顿(2)

    接着完善上一篇内容,上一篇我们是能监听到初次进入路由页面节点,往往还想监听从当前路由跳转到其他路由后,再返回到当前路由页面,上一篇内容就无法满足当前需求了,不过我们完全可以按照上一篇的原理实现这个需求。 直接上代码 方法 initAsyncLoad 为第一次进入路

    2024年02月08日
    浏览(47)
  • 封装 vue3 入场动画 插件 并发布到 npm

    vue create entry-animate 只需要简单的项目框架即可,routervuex 都不用; src 目录下新建 package,package文件夹是存放我们封装的组件的; 还需要加一个入口文件,在 package 中加一个 index.js 文件,通过后期引入main.js 文件的时候,注册成全局组件; 目录图片 我写了一个 Vue3 的动画

    2024年02月15日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包