2

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();
        }
    }
}
4

1 に答える 1