• Noser.com
facebook
linkedin
twitter
youtube
  • NOSERmobile
    • Android
    • HTML 5
    • Hybrid Apps
    • iOS
    • Windows Phone
  • NOSERembedded
    • Medizintechnik
  • NOSERprojektmanagement
  • NOSERtesting
  • NOSERlifecycle
    • .NET Allgemein
    • Application Lifecylce Management
    • Apps
    • Architektur
    • ASP.NET
    • Azure
    • Cleancode
    • Cloud
    • Silverlight
    • Visual Studio / Team Foundation Server
    • Windows 8
    • Windows Presentation Foundation
  • NOSERinnovation
    • Big Data
    • Cloud
    • IoT
    • Operations Research
    • Augmented Reality
    • RFID, NFC, Bluetooth LE

Android MotionLayout – A First Look

24. August 2018
Rehmann Christoph
0
android, animation, Mobile, UX

Google hat an der I/O 2018 das MotionLayout vorgestellt. Wie der Name erwarten lässt, ist das neue Layout für Animationen ausgelegt. Es basiert auf dem bereits bekannten CoordinatorLayout und kombiniert dessen Möglichkeit von Key-Frame Animationen mit dem Property Animation Framework. Somit eignet es sich sehr gut für die Animation von komplexen Layout-Änderungen.

Um das MotionLayout etwas besser kennen zu lernen, habe ich mich dazu entschieden, eine alte Demo-App von mir mit dem MotionLayout umzuschreiben. In dieser hatte ich demonstriert, wie man mit Hilfe vom CoordinatorLayout und dem TransitionManager eine Key-Frame Animation umsetzt. Details dazu findet man in einem früheren Blog-Beitrag.

Voraussetzungen

Das MotionLayout ist als Support Library verfügbar und ist bis zu API Level 18 (Android 4.3) abwärtskompatibel. Zum aktuellen Zeitpunkt gibt es noch keinen finalen Release sondern erst eine zweite Alpha Preview. Aus diesem Grund ist es gut möglich, dass es noch zu API Änderungen kommen kann. Um das Layout in einem Android Projekt verwenden zu können, reicht es, die folgende Abhängigkeit in der build.gralde Datei hinzuzufügen:

implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha2'

Funktionsweise des MotionLayout

Die Positionierung der Views eines MotionLayout definiert man neu mit Hilfe einer sogenannten MotionScene. Diese liegt in einer eigenen XML-Datei im res/xml Verzeichnis.

Darstellung, welche das Zusammenspiel von MotionLayout und MotionScene aufzeigt.

Darin werden die möglichen Zustände des Layouts beschrieben sowie der Animationsverlauf zwischen den Zuständen. Weiter kann man deklarativ das Verhalten bei Click- und Swipe-Gesten definieren.  Darin äussert sich auch ein weiterer Hauptunterschied vom MotionLayout zu den anderen Animation APIs von Android: eine laufende Animation kann aufgrund von Benutzereingaben fortlaufend gesteuert werden. Dies kann man gut in folgender Grafik nachvollziehen (man achte auf die Touch-Eingabe):

Animationsbeispiel

Dieses Beispiel konnte ohne eine Zeile Code rein durch ein MotionLayout (Source) und einer MotionScene (Source) implementiert werden. Die MotionScene enthält jeweils ein ConstraintSet für den ruhenden Startzustand und Endzustand des Layouts. Anschliessend wird in einer Transition die Zeitdauer und die Interpolation der Animation definiert:

<Transition
    android:id="@+id/my_transition"
    app:constraintSetEnd="@+id/ending_set"
    app:constraintSetStart="@+id/starting_set"
    app:duration="250"
    app:interpolator="linear">

    <OnSwipe
        app:dragDirection="dragUp"
        app:touchAnchorId="@+id/image_background"
        app:touchAnchorSide="bottom" />

</Transition>

Die Interaktivität mit der Swipe-Geste konnte einfach mit dem OnSwipe-Handler implementiert werden.

Weitere Informationen

Google hat mehrere sehr gute Beispiele zum MotionLayout veröffentlicht. Diese reichen von simplen Implementationen bis hin zu komplexe Animationsabläufen:

  • https://github.com/googlesamples/android-ConstraintLayoutExamples

Weiter haben die Entwickler von Google auch mehrere, sehr detaillierte  Artikel veröffentlicht. Diese beschreiben z.B. das Animieren von eigenen Attributen und die Verwendung von Key-Frames:

  • https://medium.com/google-developers/introduction-to-motionlayout-part-i-29208674b10d

Fazit

Obwohl das MotionLayout erst als Alpha Preview verfügbar ist und ich mir noch nicht jedes Detail genau anschauen konnte, bin ich davon sehr angetan. Besonders die deklarative Art, wie man den Verlauf von einem Layout zum anderen definieren kann, empfinde ich als angenehm. Google hat bekannt gegeben, dass mit der finalen Version des MotionLayouts auch ein Editor im Android Studio Designer erscheinen soll. Im Zusammenspiel mit diesem erhoffe ich mir einen schnellen Feedback-Loop bei der Implementierung von komplexen Animationsverläufen.

Shared Element Transition unter Android umsetzen

09. Juli 2018
Rehmann Christoph
0
android, animation, UX

Animationen sind ein wichtiges Mittel um die Ausdrucksstärke eines User Interfaces zu erhöhen. Sinnvoll eingesetzt lassen sich damit nicht nur Wartezeiten beim Laden von Inhalten überbrücken, sondern auch Informationen vermitteln. Eine in Apps oft eingesetzte Animation ist die sogenannte Shared Element Transition. Mit ihr werden räumliche oder hierarchische Zusammenhänge zwischen Elementen vermittelt und eine kontinuierliche User Experience ermöglicht.

In folgendem Beispiel möchte ich zeigen, wie man in wenigen Schritten eine Shared Element Transition unter Android implementiert. Die Animation wird in diesem Beispiel eingesetzt um von der Hauptansicht (Listenansicht) zu einer Detailansicht zu wechseln. Das fertige Resultat sieht wie folgt aus:

Beispiel der Shared Element Transition

Shared Element Transition

Der komplette Code samt Beispiel App kann hier gefunden werden.

Shared Element Transition – Walkthrough

Ab Android 5 kann man Shared Element Transitions bereits in wenigen Schritten implementieren:

Window Content Transitions aktivieren

Als erstes muss man Content Transitions im Application Theme aktivieren. Dazu setzt man folgendes Flag:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
	<item name="android:windowContentTransitions">true</item>
</style>

Transition Name festlegen

Shared Element Transitions können zwischen Fragments aber auch zwischen Activites stattfinden. In diesem Beispiel verwende ich zwei Activities mit eigenen Layouts. Das zu animierende Element muss in beiden Layouts den gleichen Transition Name besitzen. Diesen kann man entweder direkt im XML festlegen oder im Code per setTransitionName setzen. Da die Listenansicht eine vielzahl von dynamischen Elementen enthalten kann, konnte ich den Transition Name nicht statisch im XML setzten. Stattdessen habe die Implementierung innerhalb des Viewholders verwendet:

class ViewHolder(private val containerView: View, private val itemClick: (Monkey, ImageView) -> Unit)
        : RecyclerView.ViewHolder(containerView) {

        fun bind(monkey: Monkey) {
            with(monkey) {
                Picasso.get()
                        .load(monkey.imageUrl)
                        .placeholder(R.drawable.placeholder)
                        .into(containerView.imageView)
                containerView.textView_name.text = name
                containerView.setOnClickListener { itemClick(this, containerView.imageView) }
                containerView.imageView.transitionName = name
            }
        }
}

Einfachheitshalber habe ich es so gelöst, dass der Transition Name einer Item-View jeweils dem Namen des Objektes (in diesem Fall Affen) entspricht.

Activity starten

Als nächstes muss man nun die Detail-Activity starten. Dabei muss zusätzlich auch ein Bundle mitgegeben werden, welches die Optionen der Scene Transition enthält.

val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageView, monkey.name)
startActivity(MonkeyDetailActivity.newIntent(this, monkey), options.toBundle())

Da ich keinen statischen Transition Name verwendet habe, musste ich zusätzlich noch sicherstellen, dass auch auf der Detail-Activity der korrekte Transition Name gesetzt wird.

Weitere Optionen

Man hat man auch die Möglichkeit mehrere Elemente auf einmal zu animieren. Allerdings sollte man aufpassen, dass die Animation nicht zu überladen wirkt. Weiter kann man auch die Art der Animation beim hin- und zurücknavigieren anpassen. Dabei kann man eigene Transitions erstellen oder bereits bestehende verwenden (z.B. explode, slide, fade).

Fazit

Meiner Meinung nach sind Animationen ein wichtiger Bestandteil von modernen Apps und sie können einen wichtigen Beitrag zur User Experience leisten. Android liefert viele Mittel um Animationen schnell und einfach zu implementieren. Allerdings soll hier auch angemerkt sein, dass dieses Beispiel eher simpel gehalten wurde und durchaus auch komplexere und aufwendigere Implementationen möglich sind. Besonders im Fine-Tuning kann der Aufwand wieder ansteigen. Google liefert hierzu aber umfangreiche Beispiele und Erklärungen. Ebenso geben auch die Material Design Guidelines einen guten Einstieg in das Thema und zeigen Beispiele, wo man Animationen sinnvoll einsetzt.

Im Fall der Shared Element Transition ist ebenfalls zu beachten, dass diese erst ab Android 5 unterstützt werden.

1234567

Tag Cloud

.NET android Angular AngularJs app Arduino ASP.Net automated testing Azure Big Data C# C++ Cloud continuous integration Elm Embedded gRPC Internet of Things IoT Java Javascript M2M OWASP Projektmanagement protobuf Python Raspberry Pi Reactive Programming REST Scrum Security Softwarequalität SPA Testen testing Testmanagement Teststrategie Visual Studio WebAPI windows WPF Xamarin Xamarin.Android Xamarin.Forms Xamarin.iOS

Archive

Current Posts

  • Virtual pty/tty uart listener: Pitfalls on linux socat
  • Akzente setzen mit der Android Splash Screen API unter .NET MAUI
  • Do You have Your Personal Space?
  • Automated provisioning with ARM Templates
  • Asynchrone Beobachtungen und Versprechungen in Angular

Last Comments

  • Hans Reinsch bei Der Safety-Plan: Die wichtigsten Antworten mit Checkliste
  • George H. Barbehenn bei Modeling Optocouplers with Spice
  • Noser Blog Touch-Actions in Xamarin.Forms - Noser Blog bei Mach mehr aus Animationen in Xamarin.Forms mit SkiaSharp
  • Noser Blog Focus on the Secure Storage service of Trusted Firmware (TFM) - Noser Blog bei First run of the Trusted Firmware (TFM) application
  • Noser Blog First run of the Trusted Firmware (TFM) application - Noser Blog bei Focus on the Secure Storage service of Trusted Firmware (TFM)

Popular Posts

Xamarin.Android Code Obfuscation

6 Comments

ManuScripts: Wenn jemand eine Reise tut... Funktionale Programmierung mit Elm - Teil 1 - Aufbruch

5 Comments

ManuScripts: Wenn jemand eine Reise tut... Funktionale Programmierung mit Elm - Teil 2 - Kein Picknick

4 Comments

Contact us

  1. Name *
    * Please enter your name
  2. Email *
    * Please enter a valid email address
  3. Message *
    * Please enter message
© 2013 NOSER ENGINEERING AG. All rights reserved. Datenschutz | Cookie-Richtlinie