首页 > 编程知识 正文

iapp渐变背景颜色,h5变形动画

时间:2023-05-05 10:10:34 阅读:116952 作者:1474

简介:

最近的项目需要展示泡沫效应。 当界面中的数量发生变化时,数为1的气泡将变为动画,如下图所示。

效果说明:

首先,位移的起点是以数字为中心的位置,透明度开始变为0%,开始向上位移。 透明度渐变到100%,停留2秒钟。 下一个位移立即开始,下一个位移继续向上,透明度从100%渐变到0%,气泡消失。

思路:中,让我们一步一步地分析一下

首先,为了具有平移效果,平移效果还需要分为两个部分。 首先部分向上平移,然后根据第一个位移向上平移。 这是平移的部分。

然后是渐变。 当第一个线段移动时,渐变将从透明度0%变为100%,而下一个线段将从100%变为0%。

ok,分解分析很简单,从平移开始吧。

平移动画//构建属性动画-平移动画val translate1anim=平移动画(0.0f,0.0f, -100.0f ) /动画结束后是否停留在移动后的位置,true表示animation1Set.fillAfter=true//动画运行时间(单位:毫秒) animation 首先,构造方法的四个参数分别表示如下:

浮动起点x delta动画的起点与当前View X坐标的差异浮动起点tox delta动画的终点与当前View X坐标的差异浮动起点fromydelta动画的起点与当前View Y坐标的差异浮动起点toy delta动画

动画完成后请尝试一下。 在这里贴一下布局吧。 用直接使用的CardView制作圆形布局,里面嵌套有TextView

androidx.cardview.widget.cardviewandroid : id=' @ id/animation _ card ' Android : layout _ width=' 30dp ' Android 3360 layout _ height=' 30dp ' Android 3360 layout _ margining layout _ constraintstart _ to start of=' parent ' app : layout _ conns out d : id=' @ id/animation _ TV ' Android : layout _ width=' match _ parent ' Android : layout _ height=' match _ parent ' Android extcolor=' @ color/white ' Android 3360 text size=' 10sp之后,只需调用cardview start animation ()方法来运行动画效果。 这里不粘贴效果图,请自己尝试运行。

紧接在binding.animation card.start animation (translate1anim )之后的是第二段的位移。 第二段在第一段执行后停留2秒继续位移。 即使停留2秒钟,实际上也需要为运动属性动画创建对象。

//在动画的步骤2中平移,然后在步骤1中平移的位置单击100 val translate2anim=translate animation (0.0f、0.0f、-100.0f, -200.0f动画结束后,返回到原始位置,animation1set.fill after=false//动画运行时间(单位:毫秒) animation1Set.duration=1000第一个位移由于第一个位移朝向y轴,因此控件的当前位置为y轴上的-100f。 而且,由于我们需要将其再向上移动,所以这个距离将为x2,即-200f。 不能理解也没关系。 以后可以运行看看效果。

那么,我还写了第二段的换档动画。 我们应该如何把这两个动画联系起来呢? 是否应该有回调告诉我们在动画运行结束后进行后续处理? 这些属性动画已经给我考虑过了。 属性动画提供了三种回调方法:动画的开始、结束和重复执行。 要实现这个界面,需要三种方法:开始、结束和重新运行动画

期方法,所以我们可以在结束的生命周期方法中让其执行第二段位移:

translate1Anim.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) { //动画开启前布局显示 binding.animationCard.visibility = View.VISIBLE } override fun onAnimationEnd(animation: Animation?) { //第一轮动画结束后,先暂停2秒,然后再开启第二轮动画 GlobalScope.launch(Dispatchers.Main) { delay(2000) binding.animationCard.startAnimation(translate2Anim) } } override fun onAnimationRepeat(animation: Animation?) { }})

代码中可以看到,开始时我让布局显示出来,然后动画开始执行,执行结束后就会走onAnimationEnd方法,在此方法中去执行第二段位移动画,这里使用了Kotlin协程来做了一个2秒的等待,GlobalScope.launch(Dispatchers.Main){}表示开启协程,注意这里的参数,一定要是Dispatchers.Main在主线程中调用,否则会报错;不了解kotlin或者协程的同学可以百度一下,是一个非常强大的功能,非常非常值得学习~

使用Kotlin协程需要引入以下依赖:

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2"implementation 'androidx.core:core-ktx:1.3.2'implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32"

到这里我们平移部分的动画就已经做好了,下面看一下效果吧

(图有点太糊了,凑合一下看吧,还是能看出效果的爱听歌的战斗机)

渐变动画

渐变动画其实相对来说比较简单,其实就是从0-1然后再从1-0的一个渐变转换,废话不多说直接贴代码

//渐变动画第一步,从透明转变为实体val alpha1Anim = AlphaAnimation(0.0f, 1.0f)//渐变动画第二步,从实体转为透明val alpha2Anim = AlphaAnimation(1.0f, 0.1f)

ok,这就是两段的渐变动画代码,其实就是实例化了两个对象,构造中的两个参数表示透明度的转换,取值范围为0.0f - 1.0f(0% - 100%)

渐变动画好了,那么这里有一个问题,该怎么让两种动画结合在一起运行?

其实属性动画还有一个类叫AnimationSet,其实就是动画集合的意思,它可以将多种动画效果添加进来然后一起执行,所以这里我们使用AnimationSet来将平移和渐变动画添加进来:

//第一轮动画集,往上平移加渐变为实体颜色,并且设置动画时长为1秒加动画结束后停留在平移位置val animation1Set = AnimationSet(true)animation1Set.fillAfter = trueanimation1Set.duration = 1000animation1Set.addAnimation(translate1Anim)animation1Set.addAnimation(alpha1Anim)//第二轮动画集,继续往上平移加渐变为透明颜色,并且设置动画时长为1秒加动画结束后回复为原来位置val animation2Set = AnimationSet(true)animation2Set.fillAfter = falseanimation2Set.duration = 1000animation2Set.addAnimation(translate2Anim)animation2Set.addAnimation(alpha2Anim)

然后控件在调用startAnimation()的时候传入的参数不再是平移动画的对象,而是这个动画集

//第一轮动画开启binding.animationCard.startAnimation(animation1Set)

同理,动画的状态回调接口也是

animation1Set.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) { //动画开启前布局显示 binding.animationCard.visibility = View.VISIBLE } override fun onAnimationEnd(animation: Animation?) { //第一轮动画结束后,先暂停2秒,然后再开启第二轮动画 GlobalScope.launch(Dispatchers.Main) { delay(2000) binding.animationCard.startAnimation(animation2Set) } } override fun onAnimationRepeat(animation: Animation?) { }})animation2Set.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) {} override fun onAnimationEnd(animation: Animation?) { //结束后布局隐藏 binding.animationCard.visibility = View.GONE } override fun onAnimationRepeat(animation: Animation?) {}})

Ok,至此我们整个动画效果就算基本完成了,下面的是完整代码:

private fun startTranslateAnimation() { //平移动画第一步,从原点往上位移100, val translate1Anim = TranslateAnimation(0.0f, 0.0f, 0.0f, -100.0f) //平移动画第二步,在第一步平移的位置的基础上,再往上位移60 val translate2Anim = TranslateAnimation(0.0f, 0.0f, -100.0f, -200.0f) //渐变动画第一步,从透明转变为实体 val alpha1Anim = AlphaAnimation(0.0f, 1.0f) //渐变动画第二步,从实体转为透明 val alpha2Anim = AlphaAnimation(1.0f, 0.1f) //第一轮动画集,往上平移加渐变为实体颜色,并且设置动画时长为1秒加动画结束后停留在平移位置 val animation1Set = AnimationSet(true) animation1Set.fillAfter = true animation1Set.duration = 1000 animation1Set.addAnimation(translate1Anim) animation1Set.addAnimation(alpha1Anim) //第二轮动画集,继续往上平移加渐变为透明颜色,并且设置动画时长为1秒加动画结束后回复为原来位置 val animation2Set = AnimationSet(true) animation2Set.fillAfter = false animation2Set.duration = 1000 animation2Set.addAnimation(translate2Anim) animation2Set.addAnimation(alpha2Anim) //第一轮动画开启 binding.animationCard.startAnimation(animation1Set) animation1Set.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) { //动画开启前布局显示 binding.animationCard.visibility = View.VISIBLE } override fun onAnimationEnd(animation: Animation?) { //第一轮动画结束后,先暂停2秒,然后再开启第二轮动画 GlobalScope.launch(Dispatchers.Main) { delay(2000) binding.animationCard.startAnimation(animation2Set) } } override fun onAnimationRepeat(animation: Animation?) { } }) animation2Set.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) {} override fun onAnimationEnd(animation: Animation?) { binding.animationCard.visibility = View.GONE binding.animationCard.startAnimation(animation1Set) } override fun onAnimationRepeat(animation: Animation?) {} })}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。