Android小心心动画

网友投稿 317 2022-12-01

Android小心心动画

我们这个动画其实是由一系列的基本动画组成的。所以我们只要找出这些动画并将它们一个接一个执行起来,那么这些基本动画的的共同作用下就有了我们想要的效果。就像高中我们学的合力,合力就是我们最终的动画效果,分力就是我们的基本动画。

现在我们来分析一下这个每个心图片的动画效果有哪些基本动画,因为上面只是产生了多个心图片的动画,我们只需要分析一个就够:

translationX,translationY:理由是动画在水平方向和垂直方向都有移动scale:理由是动画有一个小变大的过程alpha:理由是动画的图片rotation:理由是图片有角度的变化

各个动画的实现

translationX

private fun createTranslationX(imageView: ImageView,x:Float): Animator { val animator = ObjectAnimator.ofFloat(imageView, "translationX", x,(x+Math.random()*60).toFloat(),(x-Math.random()*60).toFloat()) animator.duration = mDuration animator.interpolator = CycleInterpolator((1 * Math.random()).toFloat()) return animator }

translationY

private fun createTranslationY(imageView: ImageView,y:Float): Animator { val animator = ObjectAnimator.ofFloat(imageView, "translationY", y, 0f) animator.duration = mDuration animator.interpolator = AccelerateInterpolator() return animator }

scale

private fun createScale(imageView: ImageView): Animator { val animatorX = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 1.5f) val animatorY = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 1.5f) val animatorSet = AnimatorSet() animatorSet.duration = mDuration animatorSet.interpolator = AccelerateInterpolator() animatorSet.play(animatorX).with(animatorY) return animatorSet }

注意:scale要在两个方向上做,否则会变形

alpha

private fun createAlpha(imageView: ImageView): Animator { val animator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.1f) animator.duration = mDuration animator.interpolator = AccelerateInterpolator() return animator }

最后执行这一系列的动画

fun start(x:Float=(width/2).toFloat(),y:Float = (height/2).toFloat()) { val imageView = createHeartView() addView(imageView) val animatorSet = AnimatorSet() animatorSet.play(createTranslationX(imageView,x)) .with(createTranslationY(imageView,y)) .with(createScale(imageView)) .with(createRotation(imageView)) .with(createAlpha(imageView)) animatorSet.addListener(onEnd = { removeView(imageView) }) animatorSet.start() }

使用这个自定义的动画

Activity:

val layout = findViewById(R.id.relativeLayout); val tv = findViewById(R.id.tv) layout.setOnTouchListener { _, event -> if (event?.action == MotionEvent.ACTION_DOWN) { layout.start(event.x, event.y) } true }

xml布局:

​​Demo​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Socket编程-TCP方式
下一篇:Java 如何实现时间控制
相关文章

 发表评论

暂时没有评论,来抢沙发吧~