BETA

CodeLab プロパティアニメーション

投稿日:2020-02-14
最終更新:2020-02-14

https://codelabs.developers.google.com/codelabs/advanced-android-kotlin-training-property-animation/#0

/*  
 * Copyright (C) 2019 The Android Open Source Project  
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");  
 * you may not use this file except in compliance with the License.  
 * You may obtain a copy of the License at  
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0  
 *  
 * Unless required by applicable law or agreed to in writing, software  
 * distributed under the License is distributed on an "AS IS" BASIS,  
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 * See the License for the specific language governing permissions and  
 * limitations under the License.  
 */  

package com.google.samples.propertyanimation  

import android.animation.*  
import android.graphics.Color  
import androidx.appcompat.app.AppCompatActivity  
import android.os.Bundle  
import android.view.View  
import android.view.ViewGroup  
import android.view.animation.AccelerateInterpolator  
import android.view.animation.LinearInterpolator  
import android.widget.Button  
import android.widget.FrameLayout  
import android.widget.ImageView  
import androidx.appcompat.widget.AppCompatImageView  


class MainActivity : AppCompatActivity() {  

    lateinit var star: ImageView  
    lateinit var rotateButton: Button  
    lateinit var translateButton: Button  
    lateinit var scaleButton: Button  
    lateinit var fadeButton: Button  
    lateinit var colorizeButton: Button  
    lateinit var showerButton: Button  

    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_main)  

        star = findViewById(R.id.star)  
        rotateButton = findViewById<Button>(R.id.rotateButton)  
        translateButton = findViewById<Button>(R.id.translateButton)  
        scaleButton = findViewById<Button>(R.id.scaleButton)  
        fadeButton = findViewById<Button>(R.id.fadeButton)  
        colorizeButton = findViewById<Button>(R.id.colorizeButton)  
        showerButton = findViewById<Button>(R.id.showerButton)  

        rotateButton.setOnClickListener {  
            rotater()  
        }  

        translateButton.setOnClickListener {  
            translater()  
        }  

        scaleButton.setOnClickListener {  
            scaler()  
        }  

        fadeButton.setOnClickListener {  
            fader()  
        }  

        colorizeButton.setOnClickListener {  
            colorizer()  
        }  

        showerButton.setOnClickListener {  
            shower()  
        }  
    }  

    // 回転する  
    private fun rotater() {  
        val animator = ObjectAnimator.ofFloat(star, View.ROTATION, -360f, 0f)  
        animator.duration = 1000  
        animator.disableViewDuringAnimation(rotateButton)  
        animator.start()  
    }  

    // 移動する  
    private fun translater() {  
        val animator = ObjectAnimator.ofFloat(star, View.TRANSLATION_X, 200f)  
        animator.repeatCount = 1  
        animator.repeatMode = ObjectAnimator.REVERSE  
        animator.disableViewDuringAnimation(translateButton)  
        animator.start()  
    }  

    // 拡大する  
    private fun scaler() {  
        val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 4f)  
        val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 4f)  
        val animator = ObjectAnimator.ofPropertyValuesHolder(star, scaleX, scaleY)  
        animator.repeatCount = 1  
        animator.repeatMode = ObjectAnimator.REVERSE  
        animator.disableViewDuringAnimation(scaleButton)  
        animator.start()  
    }  

    // フェードアウトする  
    private fun fader() {  
        val animator = ObjectAnimator.ofFloat(star, View.ALPHA, 0f)  
        animator.repeatCount = 1  
        animator.repeatMode = ObjectAnimator.REVERSE  
        animator.disableViewDuringAnimation(fadeButton)  
        animator.start()  
    }  

    // 色を変更する  
    private fun colorizer() {  
        var animator = ObjectAnimator.ofArgb(star.parent, "backgroundColor", Color.BLACK, Color.RED)  
        animator.duration = 500  
        animator.repeatCount = 1  
        animator.repeatMode = ObjectAnimator.REVERSE  
        animator.disableViewDuringAnimation(colorizeButton)  
        animator.start()  
    }  

    // シャワーのように降らせる  
    private fun shower() {  
        val container = star.parent as ViewGroup  
        val containerW = container.width  
        val containerH = container.height  
        var starW: Float = star.width.toFloat()  
        var starH: Float = star.height.toFloat()  

        val newStar = AppCompatImageView(this)  
        newStar.setImageResource(R.drawable.ic_star)  
        newStar.layoutParams = FrameLayout.LayoutParams(  
            FrameLayout.LayoutParams.WRAP_CONTENT,  
            FrameLayout.LayoutParams.WRAP_CONTENT)  
        container.addView(newStar)  

        newStar.scaleX = Math.random().toFloat() * 1.5f + .1f  
        newStar.scaleY = newStar.scaleX  
        starW *= newStar.scaleX  
        starH *= newStar.scaleY  

        newStar.translationX = Math.random().toFloat() * containerW - starW / 2  

        val mover = ObjectAnimator.ofFloat(newStar, View.TRANSLATION_Y, -starH, containerH + starH)  
        mover.interpolator = AccelerateInterpolator(1f)  
        val rotator = ObjectAnimator.ofFloat(newStar, View.ROTATION, (Math.random() * 1080).toFloat())  
        rotator.interpolator = LinearInterpolator()  

        val set = AnimatorSet()  
        set.playTogether(mover, rotator)  
        set.duration = (Math.random() * 1500 + 500).toLong()  

        set.addListener(object : AnimatorListenerAdapter() {  
            override fun onAnimationEnd(animation: Animator?) {  
                container.removeView(newStar)  
            }  
        })  
        set.start()  
    }  

}  

/**  
 *  アニメーション中は指定のViewのタップを不可にする拡張関数  
 */  
private fun ObjectAnimator.disableViewDuringAnimation(view: View) {  
    addListener(object : AnimatorListenerAdapter() {  
        override fun onAnimationStart(animation: Animator?) {  
            view.isEnabled = false  
        }  

        override fun onAnimationEnd(animation: Animator?) {  
            view.isEnabled = true  
        }  
    })  
}  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@tantanの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう