Question

Depuis GalleryView dépréciée nous devrions immigrer à certains widgets alternatifs, Dans mon cas ViewFlipper est le meilleur mais je l'ai fait face à plusieurs problèmes, comme vous pouvez le voir dans la capture d'écran ci-dessous, j'ai conçu un ImageGallery carrousel avec GalleryView:

entrer image description ici

Avec ViewFlipper tout fonctionne comme je m'y attendais, mais je ne suis pas en mesure de mettre en œuvre deux choses:

1- ViewFlipper toujours montre un élément; mais je dois montrer trois éléments (ou encore plus) à la fois.

2 ViewFlipper est un widget non touchable et ce n'est pas ce que je veux!


Comme FlávioFaria mentionné au sujet ViewPager dans le poste suivant, il est un grand cas aussi, mais je ne peux pas passer mon échelle en animation pour elle!

J'ai tout fait avec ViewPager, maintenant il fonctionne très bien, mais je l'ai manqué une fonctionnalité et le défilement infini!

Ajouté ma classe PagerAdapter

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

Toute idée sur la façon d'accomplir ces deux choses?

Était-ce utile?

La solution

après avoir traversé votre code je trouve que CarouselAdapter se comporte de manière circulaire (scrolling infini) une partie de code est ce qui provoque c'est: -

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

et

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

Cependant, vous faites

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

instantiateItem, donc pour chaque page dans votre ViewPager, vous allouez mémoire pour ImageView et ViewPager est de se manquer de mémoire à cause de cela. ViewPager a méthode public void setOffscreenPageLimit (int limit) qui limitera la mémoire allouée en détruisant les pages inactives en vue hiérarchique .. Voir ci-dessous à partir de la documentation Android

Définir le nombre de pages qui doivent être conservés de chaque côté de la page courante dans la hiérarchie de la vue dans un état de repos. Pages au-delà de cette limite sera recréée à partir de l'adaptateur en cas de besoin.

Ceci est offert une optimisation. Si vous connaissez à l'avance le nombre des pages que vous aurez besoin pour soutenir ou avoir des mécanismes de chargement paresseux placer sur vos pages, peaufinage ce paramètre peut avoir des avantages en la douceur perçue des animations de pagination et de l'interaction. Si tu as un petit nombre de pages (3-4) que vous pouvez garder tous les actifs en même temps, moins de temps sera consacré à la mise en page pour nouvelle vue comme sous-arbres les pages de l'utilisateur avant et en arrière.

Vous devez garder cette limite basse, surtout si vos pages ont complexe mises en page. Ce paramètre par défaut 1.

Comme mentionné ci-dessus, si vous ne spécifiez aucune valeur, il utilisera la valeur par défaut 1 et ViewPager détruira les pages inactives de la hiérarchie des vues. Donc, vous devez passer la valeur optimisée pour elle, en fonction de vos besoins en mémoire (nombre d'images et taille de l'image moyenne), qui permettra de résoudre votre problème Sur la mémoire ..

Autres conseils

Envisagez d'utiliser un ViewPager avec plusieurs pages:

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

Ok, voici une chose que vous pouvez faire:

  1. Utiliser une solution d'affichage de liste horizontale ( exemple )

  2. Assurez-vous que chaque élément prend environ 1/3 de la largeur de l'écran. Peut-être un peu plus.

  3. Pour l'adhésivité de l'élément central, les événements tactiles de la poignée de sorte qu'il atténuera défilement à l'élément du milieu, par exemple, comme indiqué sur l'échantillon de Samsung « cercle lanceur ".

  4. Pour plus d'effets de fantaisie, font les propriétés de taille / emplacement des points de vue changent similaire à l'exemple que j'ai écrit sur # 3.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top