swipe intro page mit lags

  • Antworten:9
AndroidEntwickler
  • Forum-Beiträge: 58

13.05.2016, 10:22:52 via Website

hallo alle zusammen,

ich habe ein Intro mit 3 Seiten.
habe diese mit folgenden Tutorial realisiert:
https://thepseudocoder.wordpress.com/2011/10/05/android-page-swiping-using-viewpager/

Das funktioniert auch ganz gut, ABER: Meine Seiten haben alle jeweils ein Bild und Text.
wenn ich zwischen den Seiten hin und her wische, wirkt die Animation sehr abgehakt.
wenn ich die Bilder entferne und nur den Text anzeigen lassen, ist die animation 1A.

jemand ne Idee?

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

13.05.2016, 10:57:54 via Website

Wie lädst Du die Bilder in die Views? Zufällig auf dem UI-Thread?

Ansonsten denke mal darüber nach das asynchron mit Picasso zu machen.
Eine der coolsten Libraries, die ich kenne. Es einzubauen ist ein Einzeiler und das Laden von Bildern ist komplett geschenkt.

Andere Option ist die Einstellung offscreenPageLimit zu erhöhen, so dass auch die nicht sichtbaren Screens schon vorgerendert werden.

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

13.05.2016, 11:06:20 via Website

da ich mich aktuell an android noch am ran tasten bin, versuche es mir bitte so einfach wie möglich zu erklären :)
habe im Endeffekt für jede Seite eine eigene Xml wo text und bild fix gesetzt wurden.

So in etwa sehen alle Seiten aus (Beispiele IntroPage1.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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:id="@+id/Page1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start"
    android:background="@drawable/background">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:id="@+id/AppName"
        android:textColor="#FFFFFF"
        android:textIsSelectable="false"
        android:textSize="20sp"
        android:textStyle="bold"
        android:gravity="center"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="25dp" />


    <ImageView
        android:id="@+id/imageView3"
        android:layout_gravity="center"
        android:background="@drawable/launchscreen"
        android:layout_width="183dp"
        android:layout_height="281dp"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

Intro.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@drawable/background"
    tools:context=".IntroClass">


   <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>

Intro.class

public class Intro extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.intro);


        final ViewPager viewPager = (ViewPager) findViewById(R.id.container);
        final IntroPageAdapter adapter = new IntroPageAdapter(getSupportFragmentManager(),3);
        viewPager.setAdapter(adapter);

    }



    // BACK FUNKTION DEAKTIVIEREN
    @Override
    public void onBackPressed() {}



}

IntroPageAdapter.class

public class IntroPageAdapter extends FragmentStatePagerAdapter {

    int mNumOfTabs;

    public IntroPageAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }







    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                IntroPage1 page1 = new IntroPage1();
                return page1;
            case 1:
                IntroPage2 page2 = new IntroPage2();
                return page2;
            case 2:
                IntroPage3 page3 = new IntroPage3();
                return page3;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }


}

— geändert am 13.05.2016, 11:06:46

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

13.05.2016, 15:41:06 via Website

habe das Limit Mal auf 10 gesetzt - selbes Resultat.

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

16.05.2016, 21:13:41 via Website

original-Größe: 640 x 987 px

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

20.05.2016, 11:46:12 via Website

niemand ne idee??

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.05.2016, 11:50:30 via App

Hallo AndroidEntwickler!

Bitte nicht pushen, gib doch der Community ein wenig Zeit!

Wenn sich jemand findet, der eine Antwort zu deiner Frage weiß, dann wird er/sie es bestimmt hier posten, also hab noch ein wenig Geduld... :?



Hast du mal Versucht die Bilder im XML weg zu lassen und diese Per Code reinzuladen?
Ist dann dann besser?
Zudem könntest du die Bilder mal kleiner machen und schauen obs besser wird.

Generell musst du schauen dass du die Fragments im Speicher hältst und nicht immer ein neues erstellst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
pepperonas
  • Forum-Beiträge: 434

01.06.2016, 17:21:56 via Website

Rafael K.

Der ViewPager hat eine Methode namens "setOffscreenPageLimit" ... setze den Wert doch mal auf genau die Anzahl der Seiten in deinem ViewPager, oder mehr. Sonst kann es sein, dass er bei jedem Swipe die Views neu aufbaut.

Der default-Wert ist auf 2 Seiten eingestellt, die gecached werden.
Bsp für 3 Seiten:
App-Start, es wird S1 angezeigt, also wird S2 mitgeladen. Auf S2 wechseln S1 bleibt im Cache und S3 wird dazu geladen. Auf S3 wechseln S1 verschwindet aus dem Cache, nur S2 und S3 bleiben.
Den Wert anzupassen macht eigentlich fast nie Sinn (außer man hat eine App, die viele Pages besitzt und der Nutzer diese ungewöhnlich schnell "durch-zappt").
Btw: gerendert werden die Bilder sowieso erst nach dem Wischen (in onDraw).. der Cache hat damit nichts zu tun - bezogen jetzt aufs Rendern...

Zurück zur Frage:
Pascal hat ja bereits gesagt, dass du die Größe der Bilder reduzieren sollst, das ist für die Performance immer sinnvoll, daher solltest du das nochmal probieren.

Eine andere Idee ist im Manifest den Eintrag useLargeHeap auf true zu setzen. Damit ermöglichst du (je nach Gerät) das Zwischenspeichern von größeren Datenmengen. Ob das Ganze sinnvoll ist, oder einfach nur ein Mittel um schlechten Code gangbar zu bekommen, kommt auf deine App bzw. deinen Code an (es ist also nicht immer nötig bzw. zielführend).

Aus den off. Docs:

Whether your application's processes should be created with a large
Dalvik heap. This applies to all processes created for the
application. It only applies to the first application loaded into a
process; if you're using a shared user ID to allow multiple
applications to use a process, they all must use this option
consistently or they will have unpredictable results. Most apps should
not need this and should instead focus on reducing their overall
memory usage for improved performance. Enabling this also does not
guarantee a fixed increase in available memory, because some devices
are constrained by their total available memory.

To query the available memory size at runtime, use the methods
getMemoryClass() or getLargeMemoryClass().

— geändert am 01.06.2016, 17:25:17

Open Source

Antworten