Bildschirmfolien sind Übergänge zwischen dem gesamten Bildschirm und häufig bei Benutzeroberflächen.
wie z. B. Einrichtungsassistenten oder Bildschirmpräsentationen. In dieser Lektion erfahren Sie, wie Sie Bildschirmfolien
Eine ViewPager
, die von der Supportbibliothek bereitgestellt wird.
ViewPager
Objekte können Bildschirmfolien animieren
automatisch. So sieht eine Bildschirmfolie aus, die
von einem Bildschirm mit Inhalten zum nächsten:
ViewPager
gehört zu AndroidX. Weitere Informationen finden Sie unter
Mit AndroidX
Ansichten erstellen
Erstellen Sie eine Layoutdatei, die Sie später für den Inhalt eines Fragments verwenden. Außerdem benötigen Sie um eine Zeichenfolge für den Inhalt des Fragments zu definieren. Im folgenden Beispiel enthält eine Textansicht zur Anzeige von Text:
<!-- fragment_screen_slide_page.xml --> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView style="?android:textAppearanceMedium" android:padding="16dp" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" /> </ScrollView>
Fragment erstellen
Erstellen Sie eine Fragment
-Klasse, die das Layout zurückgibt.
das Sie gerade in der onCreateView()
erstellt haben,
. Sie können dann Instanzen dieses Fragments in der übergeordneten Aktivität erstellen, wenn Sie eine neue Seite benötigen, um
angezeigt wird:
Kotlin
import android.support.v4.app.Fragment class ScreenSlidePageFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View = inflater.inflate(R.layout.fragment_screen_slide_page, container, false) }
Java
import android.support.v4.app.Fragment; ... public class ScreenSlidePageFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater.inflate( R.layout.fragment_screen_slide_page, container, false); return rootView; } }
ViewPager hinzufügen
ViewPager
Objekte haben integrierte Wischgesten zum Wechseln
Seiten und werden standardmäßig Bildschirmfolienanimationen angezeigt, sodass Sie keine
eine eigene Animation erstellen. ViewPager
verwendet
PagerAdapter
-Objekte als Angebot für neue Seiten, die angezeigt werden sollen. Die PagerAdapter
verwendet daher die
Fragment-Klasse, die Sie zuvor erstellt haben.
Erstellen Sie zuerst ein Layout, das ViewPager
enthält:
<!-- activity_screen_slide.xml --> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" />
Erstellen Sie eine Aktivität, die folgende Aufgaben erfüllt:
- Legt das Layout mit
ViewPager
als Inhaltsansicht fest. - Erstellt eine Klasse, die die abstrakte Klasse
FragmentStatePagerAdapter
erweitert und implementiert mit der MethodegetItem()
, Instanzen vonScreenSlidePageFragment
als neue Seiten. Für den Pager-Adapter müssen Sie außerdem den ParametergetCount()
-Methode, die die Anzahl der Seiten zurückgibt, die durch den Adapter erstellt werden (im Beispiel fünf). - Verbindet
PagerAdapter
mitViewPager
.
Kotlin
import android.support.v4.app.Fragment import android.support.v4.app.FragmentManager ... /** * The number of pages (wizard steps) to show in this demo. */ private const val NUM_PAGES = 5 class ScreenSlidePagerActivity : FragmentActivity() { /** * The pager widget, which handles animation and allows swiping horizontally to access previous * and next wizard steps. */ private lateinit var mPager: ViewPager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_screen_slide) // Instantiate a ViewPager and a PagerAdapter. mPager = findViewById(R.id.pager) // The pager adapter, which provides the pages to the view pager widget. val pagerAdapter = ScreenSlidePagerAdapter(supportFragmentManager) mPager.adapter = pagerAdapter } override fun onBackPressed() { if (mPager.currentItem == 0) { // If the user is currently looking at the first step, allow the system to handle the // Back button. This calls finish() on this activity and pops the back stack. super.onBackPressed() } else { // Otherwise, select the previous step. mPager.currentItem = mPager.currentItem - 1 } } /** * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in * sequence. */ private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { override fun getCount(): Int = NUM_PAGES override fun getItem(position: Int): Fragment = ScreenSlidePageFragment() } }
Java
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; ... public class ScreenSlidePagerActivity extends FragmentActivity { /** * The number of pages (wizard steps) to show in this demo. */ private static final int NUM_PAGES = 5; /** * The pager widget, which handles animation and allows swiping horizontally to access previous * and next wizard steps. */ private ViewPager mPager; /** * The pager adapter, which provides the pages to the view pager widget. */ private PagerAdapter pagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_screen_slide); // Instantiate a ViewPager and a PagerAdapter. mPager = (ViewPager) findViewById(R.id.pager); pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(pagerAdapter); } @Override public void onBackPressed() { if (mPager.getCurrentItem() == 0) { // If the user is currently looking at the first step, allow the system to handle the // Back button. This calls finish() on this activity and pops the back stack. super.onBackPressed(); } else { // Otherwise, select the previous step. mPager.setCurrentItem(mPager.getCurrentItem() - 1); } } /** * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in * sequence. */ private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return new ScreenSlidePageFragment(); } @Override public int getCount() { return NUM_PAGES; } } }
Animation mit PageTransformer anpassen
Um eine andere Animation als die standardmäßige Bildschirmfolienanimation anzuzeigen, implementieren Sie die
ViewPager.PageTransformer
-Schnittstelle und stellen Sie diese
Aufruf-Pager. Die Schnittstelle stellt die Methode transformPage()
zur Verfügung. An jedem Punkt des Bildschirmübergangs wird diese Methode einmal für jede sichtbare Seite (im Allgemeinen gibt es nur eine sichtbare Seite) und für benachbarte Seiten direkt neben dem Bildschirm aufgerufen.
Wenn z. B. Seite drei sichtbar ist und der Nutzer zu Seite vier zieht,
transformPage()
wird aufgerufen
für die Seiten zwei, drei und vier.
Bei der Implementierung von transformPage()
Anschließend können Sie benutzerdefinierte Folienanimationen erstellen, indem Sie festlegen, welche Seiten basierend auf dem
Position der Seite auf dem Bildschirm. Sie wird mit dem Parameter position
ermittelt.
der Methode transformPage()
.
Der Parameter position
gibt an, wo sich eine bestimmte Seite relativ zur Bildschirmmitte befindet.
Es handelt sich um eine dynamische Eigenschaft, die sich ändert, wenn der Nutzer durch die Seiten scrollt. Wenn eine Seite den Bildschirm ausfüllt, hat der Positionswert 0
.
Wird eine Seite direkt rechts auf dem Bildschirm gezeichnet, lautet der Positionswert 1
. Wenn der Nutzer zwischen den Seiten 1 und 2 scrollt, hat Seite 1 die Position -0,5 und Seite 2 eine Position von 0,5. Je nach Position der Seiten auf dem Bildschirm können Sie benutzerdefinierte Folienanimationen erstellen, indem Sie Seiteneigenschaften mit Methoden wie setAlpha()
, setTranslationX()
oder
setScaleY()
Wenn Sie eine PageTransformer
-Implementierung haben,
setPageTransformer()
anrufen mit
um Ihre benutzerdefinierten Animationen anzuwenden. Wenn Sie zum Beispiel eine
PageTransformer
benannt
ZoomOutPageTransformer
, Sie können Ihre benutzerdefinierten Animationen einrichten
wie hier:
Kotlin
val mPager: ViewPager = findViewById(R.id.pager) ... mPager.setPageTransformer(true, ZoomOutPageTransformer())
Java
ViewPager mPager = (ViewPager) findViewById(R.id.pager); ... mPager.setPageTransformer(true, new ZoomOutPageTransformer());
Weitere Informationen finden Sie unter Herauszoomen-Seitentransformator und Tiefenseiten-Transformer.
finden Sie Beispiele und Videos zu einer PageTransformer
.
Seitentransformator zum Herauszoomen
Dieser Seitentransformator verkleinert und verblasst Seiten, wenn zwischen benachbarten Seiten. Je näher eine Seite in die Mitte kommt, desto größer wird die und wird eingeblendet.
Kotlin
private const val MIN_SCALE = 0.85f private const val MIN_ALPHA = 0.5f class ZoomOutPageTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) { view.apply { val pageWidth = width val pageHeight = height when { position < -1 -> { // [-Infinity,-1) // This page is way off-screen to the left. alpha = 0f } position <= 1 -> { // [-1,1] // Modify the default slide transition to shrink the page as well val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)) val vertMargin = pageHeight * (1 - scaleFactor) / 2 val horzMargin = pageWidth * (1 - scaleFactor) / 2 translationX = if (position < 0) { horzMargin - vertMargin / 2 } else { horzMargin + vertMargin / 2 } // Scale the page down (between MIN_SCALE and 1) scaleX = scaleFactor scaleY = scaleFactor // Fade the page relative to its size. alpha = (MIN_ALPHA + (((scaleFactor - MIN_SCALE) / (1 - MIN_SCALE)) * (1 - MIN_ALPHA))) } else -> { // (1,+Infinity] // This page is way off-screen to the right. alpha = 0f } } } } }
Java
public class ZoomOutPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.85f; private static final float MIN_ALPHA = 0.5f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); int pageHeight = view.getHeight(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0f); } else if (position <= 1) { // [-1,1] // Modify the default slide transition to shrink the page as well float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); float vertMargin = pageHeight * (1 - scaleFactor) / 2; float horzMargin = pageWidth * (1 - scaleFactor) / 2; if (position < 0) { view.setTranslationX(horzMargin - vertMargin / 2); } else { view.setTranslationX(-horzMargin + vertMargin / 2); } // Scale the page down (between MIN_SCALE and 1) view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); // Fade the page relative to its size. view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0f); } } }
Tiefenseiten-Transformator
Dieser Page Transformer verwendet die Standardfolienanimation für Gleitseiten nach links zeigen und eine „Tiefe“ zum Verschieben von Seiten genau. Diese Tiefenanimation blendet die Seite aus und skaliert sie linear herunter.
Während der Tiefenanimation ist die Standardanimation (eine Bildschirmfolie) weiterhin findet, also müssen Sie der Bildschirmfolie eine negative X-Verschiebung hinzufügen. Beispiel:
Kotlin
view.translationX = -1 * view.width * position
Java
view.setTranslationX(-1 * view.getWidth() * position);
Das folgende Beispiel zeigt, wie Sie der standardmäßigen Bildschirmfolienanimation entgegenwirken können in einem funktionierenden Page Transformer verwenden:
Kotlin
private const val MIN_SCALE = 0.75f class DepthPageTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) { view.apply { val pageWidth = width when { position < -1 -> { // [-Infinity,-1) // This page is way off-screen to the left. alpha = 0f } position <= 0 -> { // [-1,0] // Use the default slide transition when moving to the left page alpha = 1f translationX = 0f scaleX = 1f scaleY = 1f } position <= 1 -> { // (0,1] // Fade the page out. alpha = 1 - position // Counteract the default slide transition translationX = pageWidth * -position // Scale the page down (between MIN_SCALE and 1) val scaleFactor = (MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position))) scaleX = scaleFactor scaleY = scaleFactor } else -> { // (1,+Infinity] // This page is way off-screen to the right. alpha = 0f } } } } }
Java
public class DepthPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.75f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0f); } else if (position <= 0) { // [-1,0] // Use the default slide transition when moving to the left page view.setAlpha(1f); view.setTranslationX(0f); view.setScaleX(1f); view.setScaleY(1f); } else if (position <= 1) { // (0,1] // Fade the page out. view.setAlpha(1 - position); // Counteract the default slide transition view.setTranslationX(pageWidth * -position); // Scale the page down (between MIN_SCALE and 1) float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0f); } } }