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

news/2024/11/15 17:50:03/

属性动画和硬件加速

日常杂谈
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.AppCompatImageViewandroid: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 = valueinvalidate()//在接收到属性更新的时候,让视图在下次刷新页面的时候刷新状态}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 = 1000duration = 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硬件加速只对如上这样官方定义的简单效果有性能提升效果,具体哪些有优化效果请参考官方文档。对于自定义的动画效果,反而会影响性能。


http://www.ppmy.cn/news/284345.html

相关文章

IP2723中文规格书

IP2723T 是一款集成多种协议、用于 USB 输出端口的快充协议 IC。支持多种快充协议&#xff0c;包括 USBTypeC DFP&#xff0c;PD2.0/PD3.0/PPS,HVDCPQC4/QC4/QC3.0/QC2.0 &#xff08; Quick Charge &#xff09;&#xff0c; FCP&#xff08;Hisilicon Fast Charge Protocol&a…

Linux下安装TP-LINK WN 725N无线网卡驱动

新买了个TP-LINK无线USB网卡&#xff0c;但纠结的是居然没提供Linux驱动。各种Google后终于找到解决方案&#xff0c;希望为后来人提供一点线索&#xff0c;少走点儿弯路。 首先请确认你的无线网卡型号&#xff1a;TL-WN725N 122TE1。 系统环境&#xff1a;ubuntu 12.04.2 64位…

STM32驱动NRF24L01

前言&#xff1a; 为了方便查看博客&#xff0c;特意申请了一个公众号&#xff0c;附上二维码&#xff0c;有兴趣的朋友可以关注&#xff0c;和我一起讨论学习&#xff0c;一起享受技术&#xff0c;一起成长。 1. 简介 NRF24L01是 nordic 的无线通信芯片&#xff0c;它具有以…

nRF24L01无线介绍

CE&#xff1a;RX或TX模式选择 CSN&#xff1a;SPI片选信号 SCK&#xff1a;SPI时钟 MOSI&#xff1a;SPI数据输入 MISO&#xff1a;SPI数据输出 IRQ&#xff1a;可屏蔽中断脚 51测试程序 实测可用! #define TX_ADR_WIDTH 5 #define RX_ADR_WIDTH 5 #define TX_PLOAD_WI…

深入理解深度学习——注意力机制(Attention Mechanism):Bahdanau注意力

分类目录&#xff1a;《深入理解深度学习》总目录 之前我们探讨了机器翻译问题&#xff1a; 通过设计一个基于两个循环神经网络的编码器—解码器架构&#xff0c; 用于序列到序列学习。 具体来说&#xff0c;循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量&…

TP-LINK TL-WR740N 升级系统 总结

今天把家里的TP-LINK路由器型号TL-WR740N升级了下其固件&#xff0c;本来家里的网络就经常会掉&#xff0c;昨晚又一直掉&#xff0c;小米盒子论坛说该路由器可能和新小米盒子有点问题&#xff08;关于最近小米盒子连接WIFI后其他设备无法上网的说明&#xff09;&#xff0c;那…

不同IP网段连接网络打印机

帮朋友买了个网络打印机&#xff0c;昨天打印机到了&#xff0c;他对电脑不是很懂&#xff0c;所以一定要我来帮忙设置。本来这个东西没什么复杂的&#xff0c;打印机机直接接到路由器上或交换机上&#xff0c;然后电脑端加驱动就行了&#xff0c;电脑一般会自动找到网络打印机…

详解NRF24L01无线收发模块

近日有粉丝朋友留言&#xff0c;希望介绍一下nRF24L01这款无线收发芯片&#xff0c;正巧前不久的电赛有些涉及&#xff0c;因此将自己的一些经验写在这里&#xff0c;希望能有所收获。 前面我们介绍过单片机的几种通信协议&#xff0c;并且初步了解如何操作寄存器进而控制芯片的…