Domanda

Dal GalleryView sconsigliata dovremmo emigrare alternative per i widget, Nel mio caso ViewFlipper è la migliore, ma ho affrontato diversi temi, come si può vedere nell'immagine seguente ho progettato una giostra ImageGallery con GalleryView:

enter image description here

Con ViewFlipper tutto funziona come mi aspettavo, Ma io non sono in grado di realizzare due cose:

1- ViewFlipper mostra sempre un elemento;però ho bisogno di visualizzazione di tre elementi (o anche di più) in una sola volta.

2- ViewFlipper non è tangibile, widget e non è ciò che voglio!


Come FlávioFaria di cui circa ViewPager nel seguente post, È un grande caso di troppo, ma non posso passare la mia scala di animazione!

Ho fatto di tutto con ViewPager, ora funziona alla grande, ma ho perso la funzionalità e che è infinito lo scorrimento!

Aggiunto il mio PagerAdapter classe

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;
    }
}

Qualche idea su come eseguire queste due cose?

È stato utile?

Soluzione

dopo aver attraversato il tuo codice ho trovato che CarouselAdapter si sta comportando in modo circolare(scrolling infinito) la parte di codice che causa questo è:-

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

e

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

Tuttavia si sta facendo

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

in instantiateItem, in modo che per ogni pagina ViewPager, si sono allocazione di memoria per la ImageView e ViewPager è sempre a corto di memoria a causa di questo.ViewPager ha metodo public void setOffscreenPageLimit (int limit) che limiteranno la memoria allocata dalla distruzione di inattività pagine nella gerarchia della vista..Vedere di seguito la documentazione di android

Impostare il numero di pagine che devono essere mantenuti da entrambi i lati del la pagina corrente nella gerarchia della vista in uno stato di inattività.Pagine di là di questo limite verrà ricreata l'adattatore quando necessario.

Questo è offerto come un programma di ottimizzazione.Se si conosce in anticipo il numero di pagine è necessario il supporto o lazy-loading meccanismi di posto sulle tue pagine, modificare questa impostazione può avere benefici in percepita la scorrevolezza di paging animazioni e interazione.Se si dispone di un piccolo numero di pagine (3-4) che è possibile tenere attivi tutti in una volta, meno tempo in layout per la visualizzazione appena creato sottostrutture come l'utente pagine avanti e indietro.

Si dovrebbe tenere questo limite basso, soprattutto se le tue pagine sono complesse layout.Questa impostazione di default è 1.

Come detto sopra, Se non si specifica alcun valore , verrà utilizzato il valore predefinito 1 e ViewPager distruggerà inattività pagine da visualizzare gerarchia.Quindi, è necessario passare ottimizzato valore, secondo i vostri requisiti di memoria(numero di immagini e media dimensione dell'immagine), che risolverà il tuo di problema di memoria..

Altri suggerimenti

Prendi in considerazione l'utilizzo di un mirino con più pagine:

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

Ok, ecco una cosa che puoi fare:

  1. Utilizzare una soluzione di visualizzazione dell'elenco orizzontale (Esempio qui)

  2. Assicurarsi che ogni elemento prenda circa 1/3 della larghezza dello schermo. Forse un po 'di più.

  3. Per la viscosità dell'oggetto centrale, gestire gli eventi touch in modo che levigerà lo scorrimento verso l'oggetto centrale, ad esempio, come mostrato nel campione di Samsung "Circle Launcher" .

  4. Per effetti più fantasiosi, fai le proprietà delle dimensioni/posizione delle viste cambiano in modo simile al campione di cui ho scritto sul n. 3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top