У меня вопрос: что такое лучшая практика? Я sh, чтобы анимировать кнопку и использовать анимацию во всех кнопках в приложении. Каков наилучший метод?
1) в макете xml добавить строку stateListAnimator:@animator/button_state_list_anim
<Button
android:id="@+id/register_btn_ar"
style="@style/ButtonOrange"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp"
android:layout_marginLeft="48dp"
android:layout_marginRight="48dp"
android:stateListAnimator="@animator/button_state_list_anim"
android:text="@string/button_sign_up" />
и файл аниматора:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed state -->
<item
android:state_pressed="true">
<set>
<objectAnimator
android:duration="100"
android:propertyName="scaleX"
android:valueTo="0.85"
android:valueType="floatType" />
<objectAnimator
android:duration="100"
android:propertyName="scaleY"
android:valueTo="0.85"
android:valueType="floatType" />
<objectAnimator
android:duration="100"
android:propertyName="alpha"
android:valueTo="0.8"
android:valueType="floatType" />
<objectAnimator
android:duration="100"
android:propertyName="translationZ"
android:valueTo="2dp"
android:valueType="floatType" />
</set>
</item>
<!-- base state -->
<item android:state_pressed="false">
<set>
<objectAnimator
android:duration="100"
android:propertyName="scaleX"
android:valueTo="1"
android:valueType="floatType" />
<objectAnimator
android:duration="100"
android:propertyName="scaleY"
android:valueTo="1"
android:valueType="floatType" />
<objectAnimator
android:duration="100"
android:propertyName="alpha"
android:valueTo="1"
android:valueType="floatType" />
<objectAnimator
android:duration="100"
android:propertyName="translationZ"
android:valueTo="6dp"
android:valueType="floatType" />
</set>
</item>
</selector>
и слушатель по щелчку:
viewID.setOnClickListener {
// click operation here
}
2) создать класс и функцию с анимом
class MyAnim{
companion object{
@SuppressLint("ClickableViewAccessibility")
fun buttonClickListenerWithScale(view: Button, listener: Animator.AnimatorListener){
view.setOnTouchListener { v, event ->
when(event.action){
MotionEvent.ACTION_DOWN -> {
scaleDown(view)
.start()
false
}
MotionEvent.ACTION_CANCEL -> {
scaleUp(view)
.start()
false
}
MotionEvent.ACTION_UP ->{
val anim = scaleUp(view)
anim.addListener(listener)
anim.start()
view.apply {
isEnabled = false
postDelayed({ isEnabled = true}, 500)
}
false
}
else -> {
false
}
}
}
}
private fun scaleDown(view: View): Animator {
val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 0.85f)
val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 0.85f)
val alpha = PropertyValuesHolder.ofFloat(View.ALPHA, 1f, 0.8f)
var animator = ObjectAnimator.ofPropertyValuesHolder(view, alpha, scaleX, scaleY)
animator.apply {
duration = 200
interpolator = OvershootInterpolator()
}
return animator
}
private fun scaleUp(view: View): Animator {
val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0.85f, 1f)
val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 0.85f, 1f)
val alpha = PropertyValuesHolder.ofFloat(View.ALPHA, 0.8f, 1f)
var animator = ObjectAnimator.ofPropertyValuesHolder(view, alpha, scaleX, scaleY)
animator.apply {
duration = 200
interpolator = OvershootInterpolator()
}
return animator
}
}
}
и использовать его следующим образом в упражнении или фрагменте:
MyAnim.buttonClickListenerWithScale( viewId , object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationEnd(animation: Animator?) {
// click operation here
}
override fun onAnimationStart(animation: Animator?) { }
}
)
Что является преимуществом или недостатком при использовании варианта 1 или 2? Есть ли лучший вариант?