Kaynağa Gözat

add shake animation for Button view

MrOzOn 5 yıl önce
ebeveyn
işleme
2e07e0c254

+ 3 - 0
feature_auth/src/main/java/com/mrozon/feature_auth/presentation/LoginFragment.kt

@@ -3,6 +3,7 @@ package com.mrozon.feature_auth.presentation
 import android.content.Context
 import android.os.Bundle
 import android.view.View
+import android.view.animation.AnimationUtils
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProvider
@@ -14,6 +15,7 @@ import com.mrozon.feature_auth.di.LoginFragmentComponent
 import com.mrozon.utils.base.BaseFragment
 import com.mrozon.utils.extension.hideKeyboard
 import com.mrozon.utils.extension.offer
+import com.mrozon.utils.extension.shake
 import com.mrozon.utils.extension.visible
 import com.mrozon.utils.network.Result
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -80,6 +82,7 @@ class LoginFragment : BaseFragment<FragmentLoginBinding>() {
                     }
                     Result.Status.ERROR -> {
                         binding?.progressBar?.visible(false)
+                        binding?.btnLogin?.shake()
                         showError(result.message!!)
                     }
                 }

+ 2 - 0
feature_auth/src/main/java/com/mrozon/feature_auth/presentation/RegistrationFragment.kt

@@ -16,6 +16,7 @@ import com.mrozon.feature_auth.di.RegistrationFragmentComponent
 import com.mrozon.utils.base.BaseFragment
 import com.mrozon.utils.extension.hideKeyboard
 import com.mrozon.utils.extension.offer
+import com.mrozon.utils.extension.shake
 import com.mrozon.utils.extension.visible
 import com.mrozon.utils.network.Result
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -84,6 +85,7 @@ class RegistrationFragment: BaseFragment<FragmentRegistrationBinding>() {
                     }
                     Result.Status.ERROR -> {
                         binding?.progressBar?.visible(false)
+                        binding?.btnRegistration?.shake()
                         showError(result.message!!)
                     }
                 }

+ 8 - 0
utils/src/main/java/com/mrozon/utils/extension/ViewExt.kt

@@ -1,9 +1,12 @@
 package com.mrozon.utils.extension
 
 import android.view.View
+import android.view.animation.AnimationUtils
+import android.widget.Button
 import android.widget.DatePicker
 import android.widget.EditText
 import androidx.core.widget.doOnTextChanged
+import com.mrozon.utils.R
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.channels.ConflatedBroadcastChannel
 import java.util.*
@@ -31,4 +34,9 @@ fun DatePicker.getDate(): Date {
     val calendar = Calendar.getInstance()
     calendar.set(year, month, dayOfMonth)
     return calendar.time
+}
+
+fun Button.shake() {
+    val shake = AnimationUtils.loadAnimation(this.context, R.anim.shake)
+    this.startAnimation(shake)
 }

+ 19 - 0
utils/src/main/res/anim/shake.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <rotate
+        android:duration="70"
+        android:fromDegrees="-5"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:repeatCount="5"
+        android:repeatMode="reverse"
+        android:interpolator="@android:anim/linear_interpolator"
+        android:toDegrees="5" />
+    <translate
+        android:fromXDelta="-10"
+        android:toXDelta="10"
+        android:repeatCount="5"
+        android:repeatMode="reverse"
+        android:interpolator="@android:anim/linear_interpolator"
+        android:duration="70" />
+</set>