2011-01-09 6 views
0

das ist meine erste Frage hier, obwohl ich dieses Forum für eine ganze Weile lese. Die meisten Antworten auf meine Zweifel sind von hier :)Während ich zwischen den Layouts scrollen kann, dauert es zu lange, bis ich zwischen den Bildern der Galerie blättern kann. Gibt es eine Möglichkeit, diese Zeit zu reduzieren?

Zurück zum Thema. Ich entwickle eine Android-Anwendung. Ich zeichne ein dynamisches Layout, das im Grunde Galleries ist, in einem LinearLayout, in einem ScrollView, in einem RelativeLayout. Die ScrollView ist ein Muss, da ich eine dynamische Anzahl von Galerien zeichne, die höchstwahrscheinlich nicht auf den Bildschirm passen.

Wenn ich innerhalb des Layouts scrolle, muss ich 3/4 Sekunden warten, bis die ScrollView "deaktiviert" wird, um in den Galerien zu scrollen. Ich möchte diese Zeit auf ein Minimum reduzieren. Am liebsten würde ich in der Lage sein, in den Galerien zu blättern, sobald ich meinen Finger vom Bildschirm hebe, obwohl auch alles, was weniger als 2 Sekunden ist, großartig wäre.

Ich habe nach einer Lösung gegoogelt, aber alles, was ich bisher finden konnte, waren Layout-Tutorials, die dieses spezielle Problem nicht angehen. Ich habe gehofft, dass jemand hier weiß, ob das möglich ist, und wenn ja, um mir ein paar Tipps zu geben, wie das geht.

Ich würde es vorziehen, meine eigene ScrollView nicht zu tun, um dies zu lösen. Aber wenn das der einzige Weg wäre, würde ich etwas Hilfe zu schätzen wissen, weil ich nicht wirklich sicher bin, wie ich dieses Problem dadurch lösen würde.

das ist mein Layout:

public class PicturesL extends Activity implements OnClickListener, 
    OnItemClickListener, OnItemLongClickListener { 


private ArrayList<ImageView> imageView = new ArrayList<ImageView>(); 

private StringBuilder PicsDate = new StringBuilder(); 

private CaWaApplication application; 
private long ListID; 

private ArrayList<Gallery> gallery = new ArrayList<Gallery>(); 
private ArrayList<Bitmap> Thumbails = new ArrayList<Bitmap>(); 
private String idioma; 

private ArrayList<Long> Days = new ArrayList<Long>(); 
private long oldDay; 
private long oldThumbsLoaded; 
private ArrayList<Long> ThumbailsDays = new ArrayList<Long>(); 
private ArrayList<ArrayList<Long>> IDs = new ArrayList<ArrayList<Long>>(); 

@Override 
public void onCreate(Bundle savedInstancedState) { 
    super.onCreate(savedInstancedState); 
    RelativeLayout layout = new RelativeLayout(this); 
    ScrollView scroll = new ScrollView(this); 
    LinearLayout realLayout = new LinearLayout(this); 
    ArrayList<TextView> texts = new ArrayList<TextView>(); 



    Button TakePic = new Button(this); 
    idioma = com.mateloft.cawa.prefs.getLang(this); 
    if (idioma.equals("en")) { 
     TakePic.setText("Take Picture"); 
    } else if (idioma.equals("es")) { 
     TakePic.setText("Sacar Foto"); 
    } 


    RelativeLayout.LayoutParams scrollLP = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, 
      RelativeLayout.LayoutParams.FILL_PARENT); 

    layout.addView(scroll, scrollLP); 

    realLayout.setOrientation(LinearLayout.VERTICAL); 
    realLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.FILL_PARENT)); 


    scroll.addView(realLayout); 



    TakePic.setId(67); 
    TakePic.setOnClickListener(this); 
    application = (CaWaApplication) getApplication(); 

    ListID = getIntent().getExtras().getLong("listid"); 
    getAllThumbailsOfID(); 


    LinearLayout.LayoutParams TakeLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
      LinearLayout.LayoutParams.WRAP_CONTENT); 



    realLayout.addView(TakePic); 
    oldThumbsLoaded = 0; 

    int galler = 100; 

    for (int z = 0; z < Days.size(); z++) { 


     ThumbailsManager croppedThumbs = new ThumbailsManager(Thumbails, 
       oldThumbsLoaded, 
       ThumbailsDays.get(z)); 
     oldThumbsLoaded = ThumbailsDays.get(z); 

     texts.add(new TextView(this)); 
     texts.get(z).setText("Day " + Days.get(z).toString()); 
     gallery.add(new Gallery(this)); 
     gallery.get(z).setAdapter(new ImageAdapter(this, croppedThumbs.getGallery(), 250, 175, true, 
       ListID)); 
     gallery.get(z).setOnItemClickListener(this); 
     gallery.get(z).setOnItemLongClickListener(this); 
     gallery.get(z).setId(galler); 
     galler++; 

     realLayout.addView(texts.get(z)); 
     realLayout.addView(gallery.get(z)); 
    } 


    Log.d("PicturesL", "ListID: " + ListID); 





    setContentView(layout); 
} 

private void getAllThumbailsOfID() { 

    ArrayList<ModelPics> Pictures = new ArrayList<ModelPics>(); 

    ArrayList<String> ThumbailsPath = new ArrayList<String>(); 

    Pictures = application.dataManager.selectAllPics(); 
    long thumbpathloaded = 0; 
    int currentID = 0; 
    for (int x = 0; x < Pictures.size(); x++) { 

     if (Pictures.get(x).walkname == ListID) { 

      if (Days.size() == 0) { Days.add(Pictures.get(x).day); oldDay = Pictures.get(x).day; 
      IDs.add(new ArrayList<Long>()); currentID = 0; } 

      if (oldDay != Pictures.get(x).day) { 
       oldDay = Pictures.get(x).day; 
       ThumbailsDays.add(thumbpathloaded); 
       Days.add(Pictures.get(x).day); 
       IDs.add(new ArrayList<Long>()); 
       currentID++; 




      } 


      StringBuilder tpath = new StringBuilder(); 
      tpath.append(Pictures.get(x).path.substring(0, 
        Pictures.get(x).path.length() - 4)); 
      tpath.append("-t.jpg"); 
      IDs.get(currentID).add(Pictures.get(x).id); 
      ThumbailsPath.add(tpath.toString()); 

      thumbpathloaded++; 

      if (x == Pictures.size() - 1) { 
       Log.d("PicturesL", "El ultimo de los arrays, tamaño: " + Days.size()); 
       ThumbailsDays.add(thumbpathloaded); 


      } 
     } 

    } 

    for (int y = 0; y < ThumbailsPath.size(); y++) { 
     Thumbails.add(BitmapFactory.decodeFile(ThumbailsPath.get(y))); 

    } 

} 

ich auf eine andere Aktivität ein Speicherleck hatte, als Orientierung Bildschirm verändert, dass es machte langsamer, jetzt funktioniert es besser. Der Scroller sperrt nicht. Aber manchmal, wenn es aufhört zu scrollen, dauert es ein paar Sekunden (2/3), um sich selbst zu deaktivieren. Ich möchte nur, dass es ein wenig dynamischer ist, gibt es irgendeine Möglichkeit, den Listener außer Kraft zu setzen und dafür zu sorgen, dass er nicht mehr ON_ACTION_UP oder so etwas scrollt?

Ich möchte nicht die Listview verwenden, weil ich jede Galerie durch andere Ansichten getrennt haben möchte, jetzt habe ich nur Text, aber ich werde sie wahrscheinlich mit Bildern mit einer anderen Größe als die Galerien trennen.

Ich bin nicht wirklich sicher, wenn das mit einem Listadapter und einer Listview möglich ist, nahm ich an, dass eine Ansicht nur nur einen Objekttyp verarbeiten kann, also verwende ich einen Scrollview eines Layouts, wenn ich bin falsch bitte korrigieren Sie mich :)

Auch diese Aktivität funktioniert als Vorschau oder Auswahl der Bilder, die Sie in voller Größe anzeigen und verwalten ihre Werte. Es funktioniert also nur mit Thumbnails. Jeder wiegt 40 kb. Das Raten ist sehr unwahrscheinlich, dass ein Benutzer mehr als 1000 ~ 1500 Bilder in dieser Ansicht bekommt, ich dachte, dass die Aktivität nicht mehr als 40 ~ 50 MB RAM in diesem Fall verwenden würde, 10 weitere hinzufügend, wenn ich die volle Ansicht öffne. Ich vermutete also, dass die meisten Geräte diese Ansicht in voller Größe anzeigen können. Wenn es auf Low-End-Geräten nicht funktioniert, wollte ich eine Option in den App-Einstellungen hinzufügen, damit der Benutzer diese Ansicht anhand einiger Datenbankwerte zerlegen kann. Ein letzter Grund ist, dass während der meisten dieser Aktivität "Lebenszyklus" (die App hat Bilder, die für die Ansicht relevant sind, wenn es den Wert beendet, der wählt, welche Bilder angezeigt werden, muss sich ändern und keine Bilder mehr werden innerhalb dieser Instanz dieser Aktivität hinzugefügt); die Ansicht wird unbestückt sein, so dass die meiste Zeit, die alles zeigt, nicht viel kostet, nur am Ende seines Zyklus

Das war mehr oder weniger, was ich zu der Zeit dachte, als ich dieses Layout erstellte. Ich bin offen für jede Art von Vorschlag oder Meinung, ich habe dieses Layout vor ein paar Tagen erstellt und ich versuche zu sehen, ob es richtig funktioniert, weil es meinen App-Bedürfnissen entspricht.Aber wenn es einen besseren Weg gibt, würde ich es gerne hören.

PD: Ich habe gespielt, um zu sehen, wie viel es tatsächlich zeichnen kann. Ich habe es geschafft, 530 Galerien mit 600 Thumbnails auf dem gleichen Layout zu zeichnen, die App verwendet 42 mb, und ich habe keinen Zugriff auf mehr Speicher, um meine volle Größe danach zu starten :(. Ich habe versucht, das gleiche mit 1000 aber Es gibt einen OutOfMemory-Fehler, die Bitmap-Größe überschreitet das vm-Budget. Gibt es eine Möglichkeit, mehr Speicher auf High-End-Geräten verfügbar zu machen? Oder sollte ich versuchen, einen Weg zu finden, nicht alles auf einmal zu zeichnen? Objekttyp?

Dank

Mateo

Antwort

0

Warum nicht Ihre Galerien Elemente einer Listenansicht machen? auf diese Weise werden Sie sie alle sofort nicht aufblasen müssen und kann die Vorteile der Listenansicht mir recyling chanism. Ein Teil der Langsamkeit, die Sie sehen, könnte durch sehr hohen Speicherverbrauch entstehen. Galerien sind nicht gerade leichte Widgets, sodass Sie nach dem Stoppen des Scrollens möglicherweise Pausen durch starke GC-Aktivitäten feststellen. ListView mit einem Adapter würde es Ihnen auch ermöglichen, die Galerien lazyly an die Liste zu binden, so dass Sie während eines Spiels nicht die teure Bindung der Galerien machen.

+0

Ich dachte darüber nach. Aber dieser Weg sieht wirklich gut aus. Im Moment erstelle ich Thumbnails von jedem Bild und lade alle in diesen Galerien alle auf demselben Layout. Jedes Thumbnail wiegt etwa 40 kb; Ich könnte ein bisschen ihre Qualität reduzieren, um die Leistung zu verbessern, denke ich. Meine Schätzung ist, dass der Endbenutzer 300-1500 Thumbnails erhalten wird, die in maximal 240 Galerien geteilt sind. Die andere Option, über die ich nachdachte, war, eine feste Anzahl von Galerien (20-30) zu laden und die nächsten neu zu laden, wenn der Benutzer den unteren Rand der Ansicht erreichte. Aber ich hoffe, einen Weg zu finden, alles zu zeigen – Mateo

+0

hmm ... können Sie Ihren Code teilen? Ich zweifle immer noch daran, dass das, was Sie sehen, wirklich der Scroller ist, der sich schließt. Auch bei speicherbeschränkten Geräten funktioniert das Laden aller Thumbnails nicht sehr gut. Warum musst du alles sofort zeigen? Mit einer Listenansicht werden Sie nur die Komponenten aufblasen und binden, die tatsächlich sichtbar oder teilweise sichtbar sind, der Rest ist nicht auf dem Bildschirm, so dass es wirklich nur eine Verschwendung von Ressourcen ist. – jfelectron

+0

Ich habe meine Ansicht so geändert, dass sie in eine Liste passt und meinen eigenen ListAdapter erstellt. Aber ich habe immer noch ein Problem. Es gibt einige Teile der Liste (den Anfang, die Mitte und das Ende), in denen eine andere Ansicht innerhalb der Listenelemente hinzugefügt werden muss. Das Problem ist, dass ich mit dieser Methode keine Ansichten dynamisch hinzufügen konnte. Ich konnte die Liste nur ausfüllen, indem ich auf Ansichten Bezug nahm, die bereits in XML-Dateien erstellt wurden. Gibt es eine Möglichkeit, Ansichten dynamisch zur Listenadapteransicht hinzuzufügen und aufzublähen? Ich habe bereits identifiziert, welche Ansichten die sind, die das brauchen, das einzige Problem, dem ich gegenüberstehe, besteht darin, diese Ansichten hinzuzufügen. – Mateo