Androidで視差アニメーションを作ろうとしています。ヘルパー クラスを使用して、デコードされたビットマップ イメージとその他の情報を保持しています。視差は、ViewPager クラスとその onDraw メソッド内で発生しています。これは 1 つのデバイス (Galaxy S4) のみを対象としているため、画像は適切にスケーリングされています。問題は、戻るボタンを押して ViewPager に何度も戻ると、メモリ不足エラーが発生してクラッシュすることです。私が何を間違っているのかわからないので、誰かが私を正しい方向に向けてください。よろしくお願いします。
注: ビットマップに関連する効果的なコードのみを送信しました。クラス全体が長すぎます。
// This is the main ViewPager class, also does a bunch of other stuff
public class CustomViewPager extends ViewPager implements OnEditorActionListener, OnTouchListener {
private int pageOne = 0, pageTwo = 1, pageThree = 2, pageFour = 3;
private ViewPageScroller mScroller = null;
private Context context;
private int displayWidth = 0;
private int displayHeight = 0;
private int position = 0;
private int offsetPixels = 0;
private float offset;
private boolean scrollForward = true;
private int backEndXOffset = 0;
private ParallaxBitmap[] bitmap;
private boolean isPagingEnabled;
private Paint gettingStartedPaint, gettingStartedInfoMsgPaint;
private synchronized int getOffsetPixels() {
return offsetPixels;
}
private synchronized void setOffsetPixels(int offset) {
offsetPixels = offset;
}
private synchronized void setPosition(int pos) {
position = pos;
}
private synchronized int getPosition() {
return position;
}
public CustomViewPager(Context context) {
super(context);
this.context = context;
this.setEnabled(true);
postInitViewPager();
initDisplayInfo();
loadBitmaps();
initPaint();
initAnimations();
}
public void loadBitmaps() {
int[] parallaxDrawables = new int[] {
R.drawable.android_payhome,
R.drawable.arrow_curve_left,
R.drawable.pay_now,
R.drawable.machine,
R.drawable.android_phone_shadow,
R.drawable.android_phone_paynow,
R.drawable.sync,
R.drawable.interac_straighton,
R.drawable.android_passcode,
R.drawable.pay_with_passcode,
R.drawable.arrow_curve_right,
R.drawable.android_payhome_2
};
bitmap = new ParallaxBitmap[parallaxDrawables.length];
for(int i=0;i<parallaxDrawables.length;i++) {
bitmap[i] = new ParallaxBitmap(context, parallaxDrawables[i]);
}
}
}
// Helper class
public class ParallaxBitmap {
private Bitmap bitmap = null;
private int width = 0;
private int height = 0;
private int startX = 0;
private int startY = 0;
private int endX = 0;
private int endY = 0;
private int currentOffsetX = 0;
private int currentOffsetY = 0;
private int scrollingSpeed = 0;
private int currentScrollOffset = 0;
private int position = 0;
// Also contains a bunch of setter/getter methods for access.
public void decodeBitmapResource(int resourceID) {
InputStream is;
try {
is = context.getResources().openRawResource(resourceID);
BitmapFactory.Options options = new BitmapFactory.Options();
//options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream(is, null, options);
width = options.outWidth;
height = options.outHeight;
//options.inJustDecodeBounds = false;
is.reset();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}