Frage

Seit GalleryView Veraltet sollten wir in meinem Fall in einige alternative Widgets einwanderen ViewFlipper ist das Beste, aber ich habe mit mehreren Problemen konfrontiert, wie Sie im folgenden Screenshot sehen können, dass ich ein Karussell entworfen habe ImageGallery mit GalleryView:

enter image description here

Mit ViewFlipper Alles funktioniert wie ich erwartet hatte, aber ich kann nicht zwei Dinge implementieren:

1- ViewFlipper Zeigt immer einen Artikel an; Ich muss jedoch drei Elemente (oder noch mehr) gleichzeitig anzeigen.

2- ViewFlipper ist nicht toppeltes Widget und es ist nicht das, was ich will!


Wie Fláviofarie darüber erwähnte ViewPager Im folgenden Beitrag ist es auch ein großartiger Fall, aber ich kann meine Skala -Animation nicht an sie übergeben!

Ich habe alles getan mit ViewPager, Jetzt funktioniert es großartig, aber ich habe eine Funktionalität verpasst und das ist Infinity Scrolling!

Ich fügte meine hinzu PagerAdapter Klasse

public class CarouselAdapter extends PagerAdapter  
{  
    private Context mContext;
    private ImageLoader imageLoader;
    private String[] bannerUri;

    public CarouselAdapter (Context c, String[] bannerArray) 
    { 
        this.mContext = c; 
        this.bannerUri = bannerArray;
        // Setup image loader
        this.imageLoader = ImageLoader.getInstance();
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(c)
            .threadPoolSize(2) 
            .memoryCache(new WeakMemoryCache())
            .discCacheFileNameGenerator(new Md5FileNameGenerator())
            .build();
        this.imageLoader.init(config);
    } 

    @Override
    public Object instantiateItem(ViewGroup container, int position)
    {
        if (position >= bannerUri.length) 
            position %= bannerUri.length;

        ImageView i = new ImageView(mContext);
        displayImage(i, bannerUri[position]);
        i.setScaleType(ScaleType.FIT_XY); 
        container.addView(i);
        return i;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) 
    {
        container.removeView((View)object);
    }

    @Override
    public int getCount() 
    {
        return Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object)
    {
         return (view == object);
    }

    private void displayImage(final ImageView mImage, String ImageUri)
    {
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.border)
            .showImageForEmptyUri(R.drawable.border)
            .imageScaleType(ImageScaleType.EXACTLY)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .resetViewBeforeLoading()
            .cacheOnDisc() 
            .displayer(new FadeInBitmapDisplayer(740))
            .build();

        imageLoader.loadImage(ImageUri, defaultOptions, new SimpleImageLoadingListener() 
        {
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
            {
                mImage.setImageDrawable(new BitmapDrawable(mContext.getResources()
                        , getDesiredBitmap(loadedImage, 12)));
            }
        });
    }

    private Bitmap getDesiredBitmap(Bitmap originalImage, int roundValue)
    {
        // Create required bitmaps
        Bitmap shadowBitmap = BitmapFactory.decodeResource(mContext.getResources()
                , R.drawable.samsungapps_thumb_shadow);
        Bitmap outputBitmap = Bitmap.createBitmap(originalImage.getWidth()
                , originalImage.getHeight() + 80, Bitmap.Config.ARGB_8888);
        // Create canvas and pass bitmap to it 
        Canvas mCanvas = new Canvas(outputBitmap);
        // And finally draw the shaodw
        mCanvas.drawBitmap(Bitmap.createScaledBitmap(shadowBitmap, originalImage.getWidth()
                , (int)(shadowBitmap.getHeight() / 2.3), false), 0, originalImage.getHeight(), null);

        mCanvas.drawBitmap(originalImage, 0, 0, null);

        return outputBitmap;
    }
}

Irgendeine Idee, wie man diese beiden Dinge erledigt?

War es hilfreich?

Lösung

Nachdem ich Ihren Code durchlaufen habe, stellte ich fest, dass sich Carouseladapter in zirkulärer Weise (unendlich scrollen) ein Teil des Codes verhalten, was dazu führt, dass dies:-

@Override
    public int getCount() 
    {
        return Integer.MAX_VALUE;
    }

und

@Override
    public Object instantiateItem(ViewGroup container, int position)
    {
        if (position >= bannerUri.length) 
            position %= bannerUri.length;
       .
       . 
       .
    }

Wie auch immer Sie tun

        ImageView i = new ImageView(mContext);
        displayImage(i, bannerUri[position]);
        i.setScaleType(ScaleType.FIT_XY); 
        container.addView(i);
        return i;

In InstantiateItem werden für jede Seite in Ihrem ViewPager Speicher für ImageView und ViewPager aus diesem Grund aus dem Speicher ausgeführt. ViewPager hat Methode public void setOffscreenPageLimit (int limit) Dies begrenzt den Speicher, der durch die Zerstörung von Leerlaufseiten in Sichthierarchie zugewiesen wird.Siehe unten aus der Android -Dokumentation

Stellen Sie die Anzahl der Seiten fest, die in der Ansichtshierarchie in einem Leerlaufzustand auf beiden Seiten der aktuellen Seite erhalten bleiben sollten. Seiten, die über diese Grenze hinausgehen, werden bei Bedarf aus dem Adapter nachgebildet.

Dies wird als Optimierung angeboten. Wenn Sie im Voraus die Anzahl der Seiten kennen, die Sie benötigen, um auf Ihren Seiten mechanismen oder faulladende Mechanismen zu bieten, kann dies bei der wahrgenommenen Glätte von Paging-Animationen und -interaktion Vorteile haben. Wenn Sie eine kleine Anzahl von Seiten (3-4) haben, die Sie auf einmal aktiv halten können, wird weniger Zeit für neu erstellte Ansichts-Subträume als Benutzer Seiten im Layout aufgewendet.

Sie sollten diese Grenze niedrig halten, insbesondere wenn Ihre Seiten komplexe Layouts haben. Diese Einstellung ist standardmäßig 1.

Wie oben erwähnt, wird der Standardwert 1 verwendet, wenn Sie keinen Wert dafür angeben, und ViewPager zerstört Leerlaufseiten aus der Ansicht Hierarchie. Daher müssen Sie einen optimierten Wert an ihn übertragen, je nach Speicheranforderungen (Anzahl der Bilder und durchschnittliche Bildgröße), die Ihr Problem mit dem Speicher lösen.

Andere Tipps

Erwägen Sie, einen ViewPager mit mehreren Seiten zu verwenden:

http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html

OK, hier ist eine Sache, die Sie tun können:

  1. Verwenden Sie eine horizontale Listenansichtslösung (Beispiel hier)

  2. Stellen Sie sicher, dass jedes Element etwa 1/3 der Breite des Bildschirms dauert. Vielleicht ein bisschen mehr.

  3. Für die Klebrigkeit des Mittelpunkts handeln Sie Touch -Ereignisse so, dass es scrollen kann, zum Beispiel wie in Samsung's Probe gezeigt. "Kreiswerfer" .

  4. Für mehr ausgefallene Effekte ändern sich die Größe/Standorteigenschaften der Ansichten ähnlich wie die Stichprobe, über die ich auf #3 geschrieben habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top