-
新动画只需要继承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)
}
}
}