Cubo en escala de animación con ViewPager en Android

El Android ViewPager se ha convertido en un concepto muy interesante entre las aplicaciones de Android. Permite a los usuarios cambiar sin problemas entre fragmentos que tienen una interfaz de usuario común y es la mejor manera de hacer que su aplicación sea extraordinaria entre los demás. Los ViewPagers proporcionan continuidad visual. Básicamente, realizan un seguimiento de qué página está visible y luego le piden a PageAdapter que muestre la siguiente página en la jerarquía. No solo esto, ¡incluso te permite crear todo tipo de increíbles efectos de diapositivas y animaciones! 

¿Qué vamos a construir en este artículo? 

En este artículo, vamos a implementar una animación de cubo en escala usando ViewPager. A continuación se proporciona un GIF de muestra para tener una idea de lo que vamos a hacer en este artículo.

Hay 3 componentes básicos para la implementación completa de ViewPager:

Por ejemplo, consulte el artículo: ViewPager usando fragmentos en Android con un ejemplo .

Implementación paso a paso

Aquí, crearemos un control deslizante de imagen usando ViewPager y luego aplicaremos la animación de cubo en escala.

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación.

Paso 2: Diseño de la interfaz de usuario

A continuación se muestra el código para el archivo activity_main.xml . Hemos agregado solo un ViewPager para mostrar las imágenes. A continuación se muestra el código completo del archivo activity_main.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  
    <!-- viewpager to show images -->
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPagerMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
  
</androidx.constraintlayout.widget.ConstraintLayout>

Ahora, cree un nuevo archivo de recursos de diseño item.xml dentro de la aplicación > res > carpeta de diseño. A continuación se muestra el código del archivo item.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  
    <!-- image viewer to view the images -->
    <ImageView
        android:id="@+id/imageViewMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:contentDescription="image" />
  
</LinearLayout>

Paso 3: trabajar con los archivos ViewPagerAdapter.kt y MainActivity.kt

Primero, cree una clase ViewPagerAdapter , un adaptador para ViewPager. A continuación se muestra el código completo de la clase ViewPagerAdapter.kt . Se agregan comentarios dentro del código para comprender cada línea del código.

Kotlin

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import androidx.viewpager.widget.PagerAdapter
import java.util.*
  
internal class ViewPagerAdapter(private val context: Context, private val images: IntArray) : PagerAdapter() {
  
    // Layout Inflater
    var mLayoutInflater: LayoutInflater
    override fun getCount(): Int {
        // return the number of images
        return images.size
    }
  
    init {
        mLayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    }
  
    override fun isViewFromObject(view: View, `object`: Any): Boolean {
        return view === `object` as LinearLayout
    }
  
    override fun instantiateItem(container: ViewGroup, position: Int): Any {
          
        // inflating the item.xml
        val itemView: View = mLayoutInflater.inflate(R.layout.item, container, false)
  
        // referencing the image view from the item.xml file
        val imageView: ImageView = itemView.findViewById(R.id.imageViewMain)
  
        // setting the image in the imageView
        imageView.setImageResource(images[position])
  
        // Adding the View
        Objects.requireNonNull(container).addView(itemView)
        return itemView
    }
  
    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        container.removeView(`object` as LinearLayout)
    }
}

 A continuación se muestra el código completo del archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender cada línea del código.

Kotlin

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
  
class MainActivity : AppCompatActivity() {
      
    // creating object of ViewPager
    lateinit var mViewPager: ViewPager
  
    // images array
    private var images = intArrayOf(R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4)
  
    // Creating Object of ViewPagerAdapter
    private lateinit var mViewPagerAdapter: ViewPagerAdapter
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // Initializing the ViewPager Object
        mViewPager = findViewById(R.id.viewPagerMain)
  
        mViewPager.setPageTransformer(true, CubeInScalingAnimation())
  
        // Initializing the ViewPagerAdapter
        mViewPagerAdapter = ViewPagerAdapter(this@MainActivity, images)
  
        // Adding the Adapter to the ViewPager
        mViewPager.adapter = mViewPagerAdapter
    }
}

Paso 4: Cree una nueva clase CubeInScalingAnimation.kt para aplicar la animación Cube-in-scaling. A continuación se muestra el código completo del archivo CubeInScalingAnimation.kt . Se agregan comentarios dentro del código para comprender cada línea del código.

Kotlin

import android.view.View
import androidx.viewpager.widget.ViewPager
import kotlin.math.abs
  
class CubeInScalingAnimation : ViewPager.PageTransformer {
  
    override fun transformPage(page: View, position: Float) {
        page.cameraDistance = 20000F
        when {
            position < -1 -> {   //{-infinity,-1}
                // page offset to left side
                page.alpha = 0F
            }
            position <= 0 -> {
                // transition from left 
                // side of page to current page
                page.alpha = 1F
                page.pivotX = page.width.toFloat()
                page.rotationY = 90F * abs(position)
            }
            position <= 1 -> {
                // transition form current 
                // page to right side
                page.alpha = 1F
                page.pivotX = 0F
                page.rotationY = -90F * abs(position)
            }
            //{1,+infinity}
            else -> { //Page offset to right side
                page.alpha = 0F
            }
        }
  
        when {
            // transition between page1 and page2
            abs(position) <= 0.5 -> {
                page.scaleY = Math.max(0.4f, 1 - abs(position))
            }
            abs(position) <= 1 -> {
                page.scaleY = Math.max(0.4f, abs(position))
            }
        }
    }
}

Ahora, ejecuta la aplicación

Producción:

Código fuente: Haga clic aquí

Publicación traducida automáticamente

Artículo escrito por anju1406 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *