【问题标题】:How to write a dynamic Slideshow in Android如何在 Android 中编写动态幻灯片
【发布时间】:2014-09-29 08:30:59
【问题描述】:

我尝试使用 ViewFlipper 编写动态幻灯片,但我不能同时将所有位图 (ImageViews) 放入 ViewFlipper,因为这会导致 OutOfMemoryException。

目前我有这个代码,它只显示最后一张图片,然后仅此而已。

mViewFlipper.setAutoStart(true);
mViewFlipper.setFlipInterval(3000);
mViewFlipper.startFlipping();
setPictures(im);
mViewFlipper.stopFlipping();



    private void setPictures(IMI im) {
            Bitmap bmp = setView(im);
            setFlipperImage(bmp);
            bmp = null;

            mViewFlipper.setInAnimation(null);
            mViewFlipper.setOutAnimation(null);

            while (mViewFlipper.getChildCount() > 1) {
                mViewFlipper.removeViewAt(0);
            }

        }

private void setFlipperImage(Bitmap bm) {
        ImageView image = new ImageView(getApplicationContext());
        image.setImageBitmap(bm);
        mViewFlipper.addView(image);
    }

    private Bitmap setView(IMI im) {
        Bitmap bmp = null;
        try {
            bmp = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse("file://" + im.getUri()));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return bmp;

    }

提前感谢您的帮助。

【问题讨论】:

    标签: android slideshow viewflipper


    【解决方案1】:

    不要在此用例中使用 ViewFlipper(出于您给出的确切原因)。将ViewPager 与 FragmentPagerAdapter 结合使用,其中每个 Fragment 显示一个图像。这种方式只有最大。一次加载 3 个位图。

    【讨论】:

    • 是的,ViewPager 确实会更好。并查看 ViewPager.PageTransformer 以获得“幻灯片”之间的漂亮动画。
    • 谢谢,它在 ViewPager 上运行良好,还有一个动画。但是 PageTransformer 是如何工作的呢?
    • @hassler23 这里有一个很好的例子:developer.android.com/training/animation/screen-slide.html
    【解决方案2】:

    试试这个

    SlideViewPager.java

    public class SlideViewPager extends Activity {
    ViewPager pager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpagerlayout);
        pager=(ViewPager) findViewById(R.id.view_pager);
        MyAdapter adapter=new MyAdapter(this);
        pager.setAdapter(adapter);
    }   
    private boolean pagerMoved = false;
    private static final long ANIM_VIEWPAGER_DELAY = 3000;
    
    private Handler h = new Handler();
        private Runnable animateViewPager = new Runnable() {
            @Override
            public void run() {
    
                if (!pagerMoved) {
    
                    if(pager.getCurrentItem()==pager.getChildCount()){
                        pager.setCurrentItem(0,true);
                    }else {
                        pager.setCurrentItem(pager.getCurrentItem()+1, true);
                    }
    
                    h.postDelayed(animateViewPager, ANIM_VIEWPAGER_DELAY);                  
                }               
            }
        };
    
    @Override
    public void onPause() {
        super.onPause();
        if (h != null) {
            h.removeCallbacks(animateViewPager);
        }
    }
    
    @Override
    public void onResume() {
        super.onResume();
        h.postDelayed(animateViewPager, ANIM_VIEWPAGER_DELAY);
    }
    }   
    class MyAdapter extends PagerAdapter{
        Context mContext;
        public TnCAdapter(Context context){
            mContext=context;
        }
        @Override
        public int getCount() {
            return noOfSlides;
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==((View)object);
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // TODO Auto-generated method stub
            LayoutInflater inflater=(LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
            View rootview=inflater.inflate(R.layout.viewpager_view, container,false);
    
            ImageView iv=(ImageView) rootview.findViewById(R.id.imageView1);
            //Here set your image for every slide           
            switch (position) {
            case 0:
                iv.setBackgroundResource(R.drawable.scr0);
                break;
            case 1:
                iv.setBackgroundResource(R.drawable.scr1);
                break;
            case 2:
                iv.setBackgroundResource(R.drawable.scr2);
                break;
    
            }
    
            ((ViewPager)container).addView(rootview,0);
    
            return rootview;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // TODO Auto-generated method stub
            ((ViewPager)container).removeView((View) object);
    
        }
    }   
    }    
    

    viewpagerlayout.xml

    <?xml version="1.0" encoding="utf-8"?>    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_above="@+id/btn_tnc"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/indicator"
        android:layout_marginTop="5dp"
        android:isScrollContainer="true" >
    </android.support.v4.view.ViewPager>
    

    viewpager_view.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"   
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:background="@drawable/ic_launcher" />
    </LinearLayout>    
    

    尝试在 MyAdapter 类的instantiateItem 中设置您的位图图像。

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2018-01-12
      • 2015-04-21
      • 1970-01-01
      相关资源
      最近更新 更多