Кнопка пользовательских анимаций лучшие практики - PullRequest
0 голосов
/ 14 января 2020

У меня вопрос: что такое лучшая практика? Я 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? Есть ли лучший вариант?

1 Ответ

0 голосов
/ 14 января 2020

Если вы go с аниматором, вам нужно будет копировать ваш код снова и снова. В то время как с классом вы можете просто вызывать его в любом месте.

Это может быть только я, но я бы создал класс.

Класс кнопки

class myButtonAnim extends Button{
    public myButtonAnim(Context context) {
    super(context);
}

И ваш xml

<com.util.myButtonAnim
               <!--Additional attributes here-->
/>

Вы можете вызвать это в любой XML вам это нужно с дополнительными командами.

...