Pregunta

Ya que GalleryView Descargados, debemos emigrar a algunos widgets alternativos, en mi caso ViewFlipper es el mejor, pero me he enfrentado a varios problemas, como puede ver en la siguiente captura de pantalla, he diseñado un carrusel ImageGallery con GalleryView:

enter image description here

Con ViewFlipper Todo funciona como esperaba, pero no puedo implementar dos cosas:

1- ViewFlipper siempre muestra un elemento; Sin embargo, necesito mostrar tres elementos (o incluso más) a la vez.

2- ViewFlipper ¡Es un widget no touchable y no es lo que quiero!


Como Fláviofaria mencionó sobre ViewPager En la siguiente publicación, también es un gran caso, ¡pero no puedo transmitir mi animación a escala!

He hecho todo con ViewPager, ahora está funcionando muy bien, pero me he perdido una funcionalidad y eso es un desplazamiento de infinito.

Agregó mi PagerAdapter clase

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

¿Alguna idea sobre cómo lograr estas dos cosas?

¿Fue útil?

Solución

Después de pasar por su código, descubrí que el CarouselAdapter se está comportando de manera circular (desplazamiento infinito) La parte del código es lo que causa esto es:--

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

y

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

Sin embargo que estés haciendo

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

En InstantiateItem, por lo que para cada página de su ViewPager, está asignando memoria para ImageView y ViewPager se está quedando sin memoria debido a esto. ViewPager tiene método public void setOffscreenPageLimit (int limit) que limitará la memoria asignada destruyendo páginas inactivas en la jerarquía de vistas.Ver a continuación desde la documentación de Android

Establezca el número de páginas que deben retenirse a cada lado de la página actual en la jerarquía de vista en un estado inactivo. Las páginas más allá de este límite se recrearán del adaptador cuando sea necesario.

Esto se ofrece como una optimización. Si sabe de antemano el número de páginas que necesitará para soportar o tener mecanismos de carga perezosa en sus páginas, ajustar esta configuración puede tener beneficios en la suavidad percibida de las animaciones e interacción. Si tiene un pequeño número de páginas (3-4) que puede mantener activo a la vez, se dedicará a menos tiempo a diseñar para los subárboles de vista recién creada como páginas del usuario de un lado a otro.

Debe mantener este límite bajo, especialmente si sus páginas tienen diseños complejos. Esta configuración predeterminada es 1.

Como se mencionó anteriormente, si no especifica ningún valor, usará el valor predeterminado 1 y ViewPager destruirá páginas inactivas de la jerarquía de vista. Por lo tanto, debe pasarle un valor optimizado, de acuerdo con sus requisitos de memoria (número de imágenes y tamaño de imagen promedio), que resolverán su problema fuera de la memoria.

Otros consejos

Considere usar un ViewPager con varias páginas:

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

Ok, aquí hay una cosa que puedes hacer:

  1. Use una solución de vista de lista horizontal (ejemplo aquí)

  2. Asegúrese de que cada elemento tome aproximadamente 1/3 del ancho de la pantalla. Tal vez un poco más.

  3. Para la pegajosidad del elemento central, maneje los eventos táctiles para que se desplazará al elemento central, por ejemplo, como se muestra en la muestra de Samsung "lanzador de círculo" .

  4. Para obtener más efectos elegantes, haga que las propiedades de tamaño/ubicación de las vistas cambien de manera similar a la muestra que he escrito en el #3.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top