ViewFlipperまたはViewPagerでCarouselを作ります
-
28-10-2019 - |
質問
以来 GalleryView
私の場合、私たちはいくつかの代替ウィジェットに移住する必要があります ViewFlipper
最高ですが、次のスクリーンショットでわかるように、私はいくつかの問題に直面しています私はカルーセルを設計しました ImageGallery
と GalleryView
:
と 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