效果图
Kotlin实现:

package com.net.calendardemo

import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.ImageView
import kotlinx.android.synthetic.main.activity_anim.*

class AnimatorActivity : AppCompatActivity() {
    private var isOpen = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_anim)
        root.setOnClickListener {
            if (!isOpen) {
                isOpen = true
                transation(root1, 0.0f, -400.0f, 500)
                transation(
                    root2,
                    -(Math.cos(Math.toRadians(66.0)) * 400).toFloat(),
                    -(Math.sin(Math.toRadians(66.0)) * 400).toFloat(),
                    500
                )
                transation(
                    root3,
                    -(Math.cos(Math.toRadians(44.0)) * 400).toFloat(),
                    -(Math.sin(Math.toRadians(44.0)) * 400).toFloat(),
                    500
                )
                transation(
                    root4,
                    -(Math.cos(Math.toRadians(22.0)) * 400).toFloat(),
                    -(Math.sin(Math.toRadians(22.0)) * 400).toFloat(),
                    500
                )
                transation(root5, -400.0f, 0.0f, 500)
            } else {
                isOpen = false
                transationClose(root1, 0.0f, 400.0f, 500)
                transationClose(
                    root2,
                    (Math.cos(Math.toRadians(66.0)) * 400).toFloat(),
                    (Math.sin(Math.toRadians(66.0)) * 400).toFloat(),
                    500
                )
                transationClose(
                    root3,
                    (Math.cos(Math.toRadians(44.0)) * 400).toFloat(),
                    (Math.sin(Math.toRadians(44.0)) * 400).toFloat(),
                    500
                )
                transationClose(
                    root4,
                    (Math.cos(Math.toRadians(22.0)) * 400).toFloat(),
                    (Math.sin(Math.toRadians(22.0)) * 400).toFloat(),
                    500
                )
                transationClose(root5, 400.0f, 0.0f, 500)
            }
        }
    }


    private fun transation(view: ImageView, transationx: Float, transationy: Float, time: Long) {
        val animatorSet = AnimatorSet()
        val animatorx = ObjectAnimator.ofFloat(view, "translationX", 0f, transationx)
        animatorx.duration = time
        val animatory = ObjectAnimator.ofFloat(view, "translationY", 0f, transationy)
        animatory.duration = time
        val animatorScaleX = ObjectAnimator.ofFloat(view, "scaleX", 0f, 1.0f)
        animatorScaleX.duration = time

        val animatorScaleY = ObjectAnimator.ofFloat(view, "scaleY", 0f, 1.0f)
        animatorScaleY.duration = time

        val animatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 0f, 1.0f)
        animatorAlpha.duration = time

        animatorSet.playTogether(animatorx, animatory, animatorScaleX, animatorScaleY, animatorAlpha)
        animatorSet.start()
    }

    private fun transationClose(view: ImageView, transationx: Float, transationy: Float, time: Long) {
        val animatorSet = AnimatorSet()
        val animatorx = ObjectAnimator.ofFloat(view, "translationX", -transationx, 0f)
        animatorx.duration = time
        val animatory = ObjectAnimator.ofFloat(view, "translationY", -transationy, 0f)
        animatory.duration = time
        val animatorScaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.0f, 0f)
        animatorScaleX.duration = time

        val animatorScaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.0f, 0.0f)
        animatorScaleY.duration = time

        val animatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0.0f)
        animatorAlpha.duration = time
        animatorSet.playTogether(animatorx, animatory, animatorScaleX, animatorScaleY, animatorAlpha)
        animatorSet.start()
    }
}

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="30dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/root"
            android:src="@drawable/wangguan"/>
    <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="30dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/root1"
            android:src="@drawable/wangguan"/>
    <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="30dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/root2"
            android:src="@drawable/wangguan"/>
    <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="30dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/root3"
            android:src="@drawable/wangguan"/>
    <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="30dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/root4"
            android:src="@drawable/wangguan"/>
    <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginRight="30dp"
            android:layout_marginBottom="30dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:id="@+id/root5"
            android:src="@drawable/wangguan"/>


</RelativeLayout>

参考:https://wiki.jikexueyuan.com/project/android-animation/10.html

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐