Вопрос

С GalleryView Увержен мы должны иммигрировать в некоторые альтернативные виджеты, в моем случае ViewFlipper лучший, но я столкнулся с несколькими проблемами, как вы можете видеть на следующем скриншоте, я разработал карусель ImageGallery с GalleryView:

enter image description here

С ViewFlipper Все работает, как я ожидал, но я не могу реализовать две вещи:

1- ViewFlipper Всегда показывает один пункт; Однако мне нужно отобразить три элемента (или даже больше) одновременно.

2- ViewFlipper Это не связанный виджет, и это не то, что я хочу!


Как упоминалась Флавиофария ViewPager В следующем посте это тоже отличный случай, но я не могу передать свою масштабную анимацию!

Я все сделал с ViewPager, Теперь он отлично работает, но я пропустил одну функциональность, и это прокрутка бесконечности!

Добавил мой 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;
    }
}

Есть идеи о том, как достичь этих двух вещей?

Это было полезно?

Решение

После прохождения вашего кода я обнаружил, что Carouseladapter ведет себя круговым образом (бесконечная прокрутка) часть кода- это то, что это приводит к тому, что это:-

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

а также

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

В instantiateItem, поэтому для каждой страницы в вашей ViewPager вы выделяете память для ImageView, а ViewPager выходит из памяти из -за этого. ViewPager имеет метод public void setOffscreenPageLimit (int limit) что ограничит память, выделяемую путем уничтожения холостого хода, с учетом иерархии ..См. Ниже из документации Android

Установите количество страниц, которые должны быть сохранены в любой стороне текущей страницы в иерархии просмотра в состоянии холостого хода. Страницы за пределами этого предела будут воссозданы из адаптера, когда это необходимо.

Это предлагается как оптимизация. Если вы заранее знаете количество страниц, которые вам понадобятся, чтобы поддержать или иметь на своих страницах механизмы ленивого загрузки, настраивание этой настройки может иметь преимущества в воспринимаемой плавности анимации и взаимодействия. Если у вас есть небольшое количество страниц (3-4), которые вы можете сохранить активность одновременно, в макете будет потрачено меньше времени для вновь созданных подтережей представления, поскольку пользователь странит туда-сюда.

Вы должны сохранить этот предел низким, особенно если ваши страницы имеют сложные макеты. Эта настройка по умолчанию 1.

Как упомянуто выше, если не указать никакого значения для него, он будет использовать значение 1 по умолчанию, а ViewPager уничтожит страницы простаивания из иерархии просмотра. Таким образом, вам необходимо передавать оптимизированное значение, в соответствии с требованиями к памяти (количество изображений и средний размер изображения), что решит вашу проблему вне памяти.

Другие советы

Подумайте об использовании ViewPager с несколькими страницами:

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

Хорошо, вот одна вещь, которую вы можете сделать:

  1. Используйте решение просмотра горизонтального списка (Пример здесь)

  2. Убедитесь, что каждый элемент берет около 1/3 ширины экрана. Может быть, немного больше.

  3. Для липкости центрального элемента обрабатывайте сенсорные события, чтобы он сглаживал прокрутку до среднего элемента, например, как показано на образце Samsung »Кружная пусковая установка" .

  4. Для более причудливых эффектов, сделайте свойства размера/местоположения представлений, изменяющихся аналогично образу, о которой я написал на № 3.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top