👋 Здравейте разработчици,
В тази статия ще научим как да създаваме анимирани екрани за вход, които ще подобрят потребителското изживяване и красотата на вашето приложение,

Предпоставки

  • Познаване на Kotlin
  • Познаване на XML
  • Android Studio
  • Основи на разработката на Android.

Следват стъпките за създаване наанимиран екран за влизане

Стъпка 1: - Добавете зависимостта на Rive

Добавете следните зависимости към вашия build.gradle файл във вашия проект:

dependencies {
    implementation 'app.rive:rive-android:5.0.0'
    implementation "androidx.startup:startup-runtime:1.1.1"
}

Забележка:Ако изграждането на Gradle е неуспешно поради конфликтв зависимостите, тогава намалете androidx.core:core-ktx до 1.7.0

implementation 'androidx.core:core-ktx:1.7.0'

Стъпка 2: - Инициализиране на Rive

Rive трябва да инициализира своето време за изпълнение, когато приложението ви стартира.

<application>
  :
  :
  <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
      <meta-data android:name="app.rive.runtime.kotlin.RiveInitializer"
        android:value="androidx.startup" />
  </provider>

  :
  :
</application>

Стъпка 3:- Добавете RiveAnimation към вашето оформление

Изтеглете файла riveResource от туки го преместете в нова директория raw

Забележка: Следвайте тези стъпки, за да създадете нова директория
Щракнете с десния бутон върхуres новДиректория→ и дайте име суров

добавете следния код към вашето xml оформление

<app.rive.runtime.kotlin.RiveAnimationView
        android:id="@+id/loginCharacter"
        android:paddingHorizontal="24dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:riveResource="@raw/login_screen_character" />

Забележка: Можете да създадете екран за влизане според вашите нужди, ако в случай, че искате изходен код за моето оформление, можете да го проверите тук

  • празен
  • проверка
  • виж
  • успех
  • провалят се
  • hand_up

Има четири действия, които потребителят може да извърши: -

  • Когато потребителят за първи път отвори екрана за вход, нашият герой ще бъде в неактивно състояние
  • Когато потребителят щракне върху (имейл идентификатор или идентификатор за вход), нашият герой ще бъде в Състояние на проверка.
    Икогато потребителят въведе своя имейл, нашият герой ще се премести окото му, за да види какво пише потребителят, това е Състояние на поглед
  • Когато потребителят въведе своята парола, тогава нашият герой ще затвори очи, това е състояние на вдигнати ръце
  • И накрая, ако идентификационните данни са правилни, нашият герой ще бъде в състояние на успех в противен случай в състояние на неуспех

Стъпка 4: - Внедряване на код

Има 3 различни метода за промяна на състоянието на нашия герой.

  • setBooleanState(stateMachineName: String, inputName: String, value: Boolean)
  • fireState(stateMachineName: String, inputName: String)
  • setNumberState(stateMachineName: String, inputName: String, value: Float)

Първо, глобално ще декларираме името на нашата машина.

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class SimpleActivity : AppCompatActivity() {

    // name of our state machine
    private val stateMachineName = "State Machine 1"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.simple)
    }
}

Сега ще внедрим нашите 6 различни състояния, инициализираме нашия герой, ако сме в неактивно състояние, не е нужно да правим нищо за това.

Нека внедрим Състояние на проверката, което означава, че ще щракнем върху имейл идентификатора, за да въведем идентификатора за вход

private fun onEmailFoucus() {

// we are using  focus listner to capture the currently focued input field
        binding!!.email.setOnFocusChangeListener { v, hasFocus ->

            // when user click on email to enter email id then our character will look it
            if (hasFocus) {

                // setBoolen will take 3 arguments machine name, state name and value
                binding!!.loginCharacter.controller.setBooleanState(
                    stateMachineName = stateMachineName,
                    inputName = "Check",
                    value = true
                )
            }
            // else character will changes its focus 
            else {
                binding!!.loginCharacter.controller.setBooleanState(
                    stateMachineName = stateMachineName,
                    inputName = "Check",
                    value = false
                )
            }
        }
    }

След Проверка на състоянието искаме, когато потребителят напише нещо, нашият герой и окото му ще променят позицията си, когато низът стане дълъг. Това е Състояние на поглед

private fun eyePostionChange() {

// we are using text changed listner to change position of eyes whenever user type new character
        binding!!.email.addTextChangedListener(object  : TextWatcher {
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {

            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                try {
                    // setNumber will take 3 input
                    // machine name, state name, and value
                    binding!!.loginCharacter.controller.setNumberState(stateMachineName, "Look", 2*p0!!.length.toFloat())
                } catch (_: Exception) {

                }
            }

            override fun afterTextChanged(p0: Editable?) {


            }

        })
    }

Сега ще внедрим състояние, когато потребител въведе парола, което е състояние hands_up

private fun onPasswordFoucus() {
           
// we are using  focus listner to capture the currently focued input field     
        binding!!.password.setOnFocusChangeListener { v, hasFocus ->
            // if focus is on password text field then close eyes
            if (hasFocus) {

                // setBoolen will take 3 arguments machine name, state name and value
                binding!!.loginCharacter.controller.setBooleanState(stateMachineName, "hands_up", true)
            } 
            
            // if focus is not on password text field then open eyes
            else {
                binding!!.loginCharacter.controller.setBooleanState(stateMachineName, "hands_up", false)
            }
        }
    }

И последното ни състояние е успех и провал

private fun LoginAccount(email: String, password: String) {

// if credentials matches the show success state
        if (email == "[email protected]" && password == "123456"){
            
            // using looper to use animation multiple times for 2s
            Handler(mainLooper).postDelayed({

                // fireState will take two input machine name and state
                binding!!.loginCharacter.controller.fireState(stateMachineName, "success")

            }, 2000)

            Toast.makeText(this, "Welcome", Toast.LENGTH_SHORT).show()
        }
        // if credentials mismatches then show failure state
        else{
            
            // using looper to use animation multiple times for 2s
            Handler(mainLooper).postDelayed({
                
                // fireState will take two input machine name and state
                binding!!.loginCharacter.controller.fireState(stateMachineName, "fail")

            },2000)

            Toast.makeText(this, "Invalid Id or Password", Toast.LENGTH_SHORT).show()
        }
    }

можете да проверите пълния код за тази дейност тук

Най-накрая създадохме красив изглеждащ екран за вход.

Ако има някакъв въпрос или объркване относно урока. Чувствайте се свободни да задавате въпросите си в коментарите по-долу.

Благодарим ви, че прочетохте тази статия. Ако сте намерили това за полезно и интересно, моля, пляскайте и ме последвайте за още такова съдържание.

можете също да разгледате моето ново приложение в playstore тук

Ако съм объркал нещо, споменете го в коментарите. Бих искал да се подобря.

Свържете се с мен в GitHub, Twitter и LinkedIn