Escribir una aplicación de Android para fanáticos del cine - Parte 2 (Diseño)



Hola Habr!

En este artículo, consideraremos el proceso de creación de pantallas basadas en los diseños de la primera parte .

Diseño de pantalla


Pantalla de inicio


La pantalla principal contendrá fragmentos y menús de navegación. Escribamos el menú, después de crear los íconos. Para hacer esto, abra la carpeta dibujable , haga clic en Nuevo y seleccione Activos vectoriales . En la ventana que aparece, haga clic en Imágenes prediseñadas y seleccione los iconos Configuración , Búsqueda y Pegar contenido . El tamaño saldrá de 24 por 24.

Cree un archivo de cadenas en la carpeta de valores y agregue las siguientes líneas:

<resources> <string name="title_home">Home</string> <string name="title_search">Search</string> <string name="title_settings">Settings</string> </resources> 

Poner todas las líneas en un archivo simplificará la localización posterior de la aplicación.
Si desea agregar otro idioma, por ejemplo, ruso, cree un archivo con el atributo Locale , seleccione el idioma deseado de la lista de idiomas y agregue las mismas líneas, después de traducirlas.

Ahora procedemos directamente a crear el menú. En la carpeta del menú , cree el archivo de recursos del menú , asígnele el nombre " bottom_nav_menu " y agréguele el siguiente código:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/navigation_home" android:icon="@drawable/ic_content_paste_black_24dp" android:title="@string/title_home"/> <item android:id="@+id/navigation_search" android:icon="@drawable/ic_search_black_24dp" android:title="@string/title_search"/> <item android:id="@+id/navigation_settings" android:icon="@drawable/ic_settings_black_24dp" android:title="@string/title_settings"/> </menu> 

Cree un archivo de estilos en la carpeta de valores y agregue el siguiente código:

 <resources> <style name="MyLinearLayout"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> <item name="android:orientation">vertical</item> </style> </resources> 

Los estilos creados se utilizan para vistas para separar archivos de marcado y archivos de estilo. Contienen atributos de formato que son responsables de la apariencia y el comportamiento de los elementos. Primero, puede escribir todos los atributos en el archivo de marcado y luego exportarlos al archivo de estilos haciendo clic en la siguiente combinación: RMB -> Refactor -> Extraer -> Estilo . El estilo solo estará disponible dentro de las vistas. Lea más sobre esto aquí .

Después de eso, puede proceder directamente a crear un diseño para la Actividad. En la carpeta de diseño , cree un archivo de recursos de diseño, asígnele el nombre " activity_main " y agregue el siguiente código:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout 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" tools:context=".MainActivity" style="@style/MyLinearLayout"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment_container" android:layout_marginBottom="?attr/actionBarSize" /> <android.support.design.widget.BottomNavigationView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/nav_view" app:menu="@menu/bottom_nav_menu" android:background="#6986c2" android:layout_gravity="bottom"/> </FrameLayout> 

Veamos que pasó.



Pantalla de pestaña de inicio


Abra el archivo de estilos y agregue estilos para la barra de herramientas con un TextView secundario y RecyclerView:

  <style name="MyToolbar"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:background">#6986c2</item> </style> <style name="Toolbar_TextView"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> <item name="android:gravity">center</item> </style> <style name="MyRecyclerView"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> <item name="android:background">#fff</item> </style> 

Agregue las siguientes líneas al archivo de cadenas :

  <string name="desc_home">Notification list</string> <string name="movie_title">Movie title</string> <string name="default_imdb_rating">IMDb rating: 7,4</string> 

Ahora cree un diseño llamado " fragment_home " y agregue el siguiente código:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/MyLinearLayout"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar_home" style="@style/MyToolbar"> <TextView android:text="@string/desc_home" style="@style/Toolbar_TextView"/> </android.support.v7.widget.Toolbar> <android.support.v7.widget.RecyclerView android:id="@+id/recView_home" style="@style/MyRecyclerView"/> </LinearLayout> 

Agregue los iconos de Notificación y Notificación ninguno a la carpeta dibujable .

Pasemos a crear un elemento de lista. Agregue el archivo " item_movie " a la carpeta de diseño y escriba el siguiente código:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView 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="120dp" app:cardCornerRadius="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="8dp" android:layout_marginRight="16dp" android:layout_marginBottom="8dp" app:cardBackgroundColor="#00FFFFFF"> <ImageView android:layout_width="98dp" android:layout_height="98dp" app:srcCompat="@mipmap/ic_launcher" android:id="@+id/item_image" android:layout_gravity="center|start" android:layout_marginLeft="10dp"/> <TextView android:text="@string/movie_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/item_title" android:layout_marginTop="18dp" android:layout_marginLeft="120dp" android:textStyle="bold" android:textColor="@android:color/black" android:ellipsize="end" android:maxLines="1" android:layout_marginRight="16dp"/> <TextView android:text="@string/default_imdb_rating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/item_rating" android:layout_marginLeft="120dp" android:layout_marginTop="50dp"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_notifications_black_24dp" android:id="@+id/item_notification" android:layout_gravity="bottom|right" android:layout_marginRight="16dp" android:layout_marginBottom="16dp" tools:ignore="VectorDrawableCompat"/> </android.support.v7.widget.CardView> 

Veamos el resultado:



Pantalla de pestaña de búsqueda


En el archivo de cadenas , agregue el encabezado de la barra de herramientas:

 <string name="desc_settings">Preferences</string> 

Y cree un diseño llamado " fragment_search ", agregando simultáneamente el siguiente bloque de código:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/MyLinearLayout"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar_search" style="@style/MyToolbar"> <android.support.v7.widget.SearchView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/border_search_view" android:layout_marginRight="15dp" android:id="@+id/search_view"/> </android.support.v7.widget.Toolbar> <android.support.v7.widget.RecyclerView android:id="@+id/recView_search" style="@style/MyRecyclerView"/> </LinearLayout> 

Veamos el resultado:



Pantalla para la pestaña Configuración


Esta pantalla resultó ser la más voluminosa, porque tiene pocos estilos repetitivos.

Agregue el código para TextView y CardView al archivo de estilos :

  <style name="MyTextView"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:textStyle">bold</item> <item name="android:textColor">@android:color/black</item> <item name="android:layout_marginLeft">16dp</item> <item name="android:layout_marginTop">8dp</item> <item name="android:layout_marginBottom">8dp</item> <item name="android:typeface">normal</item> </style> <style name="MyCardView"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_margin">16dp</item> </style> 

Agregue también un par de líneas más al archivo de cadenas :

 <string name="imdb_rating">IMDb rating</string> <string name="default_rating">6</string> <string name="movie_genres">Movie genres</string> 

También debe agregar el ícono del borde Estrella a la carpeta dibujable .

Cree un diseño llamado " fragment_settings " y agregue el siguiente código:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" style="@style/MyLinearLayout" android:background="#fff"> <android.support.v7.widget.Toolbar style="@style/MyToolbar" android:id="@+id/toolbar_home" app:title="@string/desc_home"> <TextView android:text="@string/desc_settings" style="@style/Toolbar_TextView"/> </android.support.v7.widget.Toolbar> <android.support.v7.widget.CardView app:cardCornerRadius="16dp" app:cardBackgroundColor="#00FFFFFF" style="@style/MyCardView"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/ic_star_border_black_24dp" android:layout_gravity="right" android:layout_marginRight="50dp" android:layout_marginTop="8dp" tools:ignore="VectorDrawableCompat"/> <TextView android:text="@string/default_rating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rating_value" android:layout_gravity="right" android:layout_marginRight="40dp" android:layout_marginTop="8dp" android:textColor="#666666"/> <TextView android:text="@string/imdb_rating" android:id="@+id/textView" style="@style/MyTextView"/> <SeekBar style="@style/Widget.AppCompat.SeekBar.Discrete" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="10" android:progress="6" android:id="@+id/seek_bar" android:layout_marginLeft="16dp" android:layout_marginTop="50dp" android:layout_marginBottom="20dp" android:layout_marginRight="16dp"/> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView app:cardCornerRadius="16dp" app:cardBackgroundColor="#00FFFFFF" style="@style/MyCardView"> <TextView android:text="@string/movie_genres" style="@style/MyTextView"/> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00FFFFFF" android:layout_marginLeft="16dp" android:layout_marginTop="36dp" android:layout_marginBottom="16dp" android:layout_marginRight="16dp" android:id="@+id/recView_settings"/> </android.support.v7.widget.CardView> </LinearLayout> 

Crea un artículo para la lista. Agregue el archivo " item_genre " a la carpeta de diseño y escriba el siguiente código:

 <?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:text="@string/movie_genres" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/item_check_box" /> 

Veamos el resultado:



Prueba de diseño


Veamos con qué frecuencia se vuelve a dibujar la misma sección de la pantalla, es decir, se está haciendo un trabajo adicional.

BienMal



Color azul: redibuja una vez. Bueno
Color verde - redibuja dos veces. Se requiere optimización.
Color rojo claro: vuelve a dibujar tres veces. Que mal.
Color rojo: vuelve a dibujar más de 4 veces. Algo salió mal.
Y si no se pinta nada, entonces la trama no se vuelve a dibujar. Buen trabajo

¿Por qué está todo rojo en la segunda captura de pantalla? Se agregó un fondo blanco a cada Diseño, RecyclerView y CardView, lo que provocó la superposición de capas. Este no es el caso en el diseño descrito anteriormente, el ejemplo solo demuestra la aplicación fallida de la estilización.

En la primera captura de pantalla, solo se usó un fondo en LinearLayout para el fragmento Home, cuya redibujo se canceló mediante programación mediante el siguiente método:

 window.setBackgroundDrawable(null) 


Veamos cuánto tiempo se tarda en renderizar marcos.

Para el primer casoPara el segundo caso



Cyan es responsable del tiempo utilizado para crear y actualizar la Vista.
La parte púrpura representa el tiempo necesario para transferir los recursos de representación de la secuencia.
El rojo es el momento de dibujar.
Un color naranja indica cuánto tiempo tardó el procesador en esperar a que la GPU completara su trabajo. Es una fuente de problemas con grandes cantidades. - Alexander Klimov


En nuestro caso, casi todas las pestañas se dibujan en menos de 16 ms, es decir, debajo de la barra verde. Si la barra es más grande que esta línea, el programa puede ralentizarse.

Conclusión


En el próximo artículo, consideraremos trabajar con el servidor, y mientras el autor lo escribe, puede evaluar el diseño actual en la encuesta a continuación.

Si algún punto no está claro, haga preguntas en los comentarios.

Si cree que el diseño (XML) puede simplificarse o mejorarse, escríbalo.

Source: https://habr.com/ru/post/461249/


All Articles