質問

以来 GalleryView 私の場合、私たちはいくつかの代替ウィジェットに移住する必要があります ViewFlipper 最高ですが、次のスクリーンショットでわかるように、私はいくつかの問題に直面しています私はカルーセルを設計しました ImageGalleryGalleryView:

enter image description here

ViewFlipper 予想通りにすべてが機能しますが、2つのことを実装することはできません。

1- ViewFlipper 常に1つのアイテムが表示されます。ただし、3つのアイテム(またはそれ以上)を一度に表示する必要があります。

2- ViewFlipper タッチ可能なウィジェットであり、それは私が望むものではありません!


Fláviofariaが述べたように ViewPager 次の投稿では、それも素晴らしいケースですが、スケールアップアニメーションを渡すことはできません!

私はすべてをやった ViewPager, 、今ではうまく機能していますが、私は1つの機能を逃しました、そしてそれは無限のスクロールです!

私を追加しました 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;
    }
}

これらの2つのことを達成する方法について何か考えはありますか?

役に立ちましたか?

解決

コードを通過した後、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を使用し、ViewPagerはビュー階層からアイドルページを破壊します。したがって、メモリ要件(画像の数と平均画像サイズ)に従って、最適化された値を渡す必要があります。

他のヒント

複数のページを持つViewPagerの使用を検討してください。

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

わかりました、これができることの1つです:

  1. 水平リストビューソリューションを使用します(ここで例)

  2. 各アイテムが画面の幅の約1/3を取ることを確認してください。多分もう少し。

  3. センターアイテムの粘着性については、タッチイベントを処理して、サムスンのサンプルに示されているように、中央のアイテムへのスクロールを滑らかにするようにします。サークルランチャー" .

  4. より派手な効果については、#3で書いたサンプルと同様に、ビューのサイズ/ロケーションプロパティを変更します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top