Fare giostra con ViewFlipper o ViewPager
-
28-10-2019 - |
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
:
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?
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:
Utilizzare una soluzione di visualizzazione dell'elenco orizzontale (Esempio qui)
Assicurarsi che ogni elemento prenda circa 1/3 della larghezza dello schermo. Forse un po 'di più.
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" .
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.