自定义Animation

  • 新动画只需要继承Animation这个抽象类,然后重写它的initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中进行相应的矩阵变换即可

    下面代码是围绕y轴旋转并且同时沿着z轴平移从而实现一种类似于3D的效果


class CustomerAnimation(
        private val mFromDegrees: Float,
        private val mToDegrees: Float,
        private val mCenterX: Float,
        private val mCenterY: Float,
        private val mDepthZ: Float,
        private val mReverse: Boolean
) : Animation() {

    private var mCamera: Camera? = null
    
    override fun initialize(width: Int, height: Int, parentWidth: Int, parentHeight: Int) {
        super.initialize(width, height, parentWidth, parentHeight)
        mCamera = Camera()
    }

    override fun applyTransformation(interpolatedTime: Float, t: Transformation?) {
        super.applyTransformation(interpolatedTime, t)
        val fromDegrees = mFromDegrees
        val degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime)
        val centerX = mCenterX
        val centerY = mCenterY
        val camera = mCamera
        val matrix = t!!.matrix
        camera!!.save()
        if (mReverse) {
            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime)
        } else {
            camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime))
        }
        camera.rotateY(degrees)
        camera.getMatrix(matrix)
        camera.restore()
        matrix.preTranslate(-centerX, -centerY)
        matrix.postTranslate(centerX, centerY)
    }

}

在Activity中引用


class MainActivity : AppCompatActivity() {
    private var TAG = "MainActivity"

    private var button: Button? = null
    override
    fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button = this.findViewById(R.id.btn)
        val customerAnimation = CustomerAnimation(0f, 1800f, 300f, 1000f, 1000f, false)
        customerAnimation.duration = 2000
        button!!.setOnClickListener {
            button!!.startAnimation(customerAnimation)
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值