如何在autoStart设置为true后ViewFlipper addView或removeView

时间:2015-09-17 05:02:49

标签: viewflipper

对于我的应用程序,我需要以幻灯片形式显示大量图像(来自网址而非手机内存)。我正在使用ViewFlipper。我从url获取此图像并将其添加到viewFlipper中。问题是,当我添加5-6个图像时,它工作正常但超过5-6时会出现OutOfMemory错误。

我认为,如果我们可以某种方式做这样的事情,就可以做到这一点。 1.将一些图像添加到ViewFlipper 2. startFlipping,显示图像/视图后删除视图, 3.添加更多图像。

不确定是否可以使用viewFlipper完成或有其他方法吗?

我的AutoSlideShow的示例代码:

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.ViewFlipper;

    public class AutoSlideShow extends Activity {

        ViewFlipper viewFlipper = null;
        Button pauseButton;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_auto_slide_show);

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

            Intent intent = getIntent();
            String[] allUrls = intent.getExtras().getStringArray("allImageUrls");

            viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);
            viewFlipper.setFlipInterval(2000);
            viewFlipper.setAutoStart(true);

            for (int i = 0; i < allUrls.length; i++) {
                setFlipperImage(allUrls[i]);
            }

            pauseButton = (Button) findViewById(R.id.pauseButton);
            pauseButton.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (pauseButton.getText().equals("Resume")) {
                        viewFlipper.startFlipping();
                        pauseButton.setText("Pause");
                    } else {
                        viewFlipper.stopFlipping();
                        pauseButton.setText("Resume");
                    }
                }
            });
        }

        private void setFlipperImage(String url) {
            ImageView image = new ImageView(getApplicationContext());
            Bitmap bitmap = null;

            try {

                InputStream content = (InputStream) new URL(url).getContent();
                bitmap = BitmapFactory.decodeStream(content);       

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } 

            image.setImageBitmap(bitmap);
            viewFlipper.addView(image);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.auto_slide_show, menu);
            return true;
        }

    }

1 个答案:

答案 0 :(得分:1)

私人ViewFlipper mViewFlipper;     私人GestureDetector mGestureDetector;

int i = 0;
int k = 0;
int l = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_auto_slide_show);
    mViewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);


     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        Intent intent = getIntent();
        String[] allUrls = intent.getExtras().getStringArray("allImageUrls");

    if (i == 0) {

        for (int i = 0; i < 2; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(allUrls[i]);
            mViewFlipper.addView(imageView);
            k++;
        }
        i = 1;
    }

    mViewFlipper.getDisplayedChild();
    // Add all the images to the ViewFlipper

    CustomGestureDetector customGestureDetector = new CustomGestureDetector();
    mGestureDetector = new GestureDetector(this, customGestureDetector);

    mViewFlipper.setInAnimation(this, android.R.anim.fade_in);
    mViewFlipper.setOutAnimation(this, android.R.anim.fade_out);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mGestureDetector.onTouchEvent(event);

    return super.onTouchEvent(event);
}

class CustomGestureDetector extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        // Swipe left (next)
        if (e1.getX() > e2.getX()) {
            mViewFlipper.setInAnimation(MainActivity.this, R.anim.left_in);
            mViewFlipper.setOutAnimation(MainActivity.this, R.anim.left_out);

            mViewFlipper.showNext();

            if (mViewFlipper.getDisplayedChild() > 1) {
                mViewFlipper.removeViewAt(l);
            }

            ImageView imageView = new ImageView(MainActivity.this);
            imageView.setImageResource(allUrls[k]);
            mViewFlipper.addView(imageView);
            k++;

            Log.d("Count", "" + mViewFlipper.getChildCount());
        }

        // Swipe right (previous)
        if (e1.getX() < e2.getX()) {
            mViewFlipper.setInAnimation(MainActivity.this, R.anim.right_in);
            mViewFlipper.setOutAnimation(MainActivity.this, R.anim.right_out);

            mViewFlipper.showPrevious();

             if (mViewFlipper.getDisplayedChild() > 1) {
                mViewFlipper.removeViewAt(l);
            }

            ImageView imageView = new ImageView(MainActivity.this);
            imageView.setImageResource(allUrls[k]);
            mViewFlipper.addView(imageView);
            k++;
        }

        return super.onFling(e1, e2, velocityX, velocityY);
    }
}