Viewpager中嵌入自定义可缩放view遇到的问题

1、由于viewpager的每一页都加入一个fragment,对于浏览图片的功能,由于图片数量很大,所以不能使用fragmentpageadapter,否则容易造成内存不足,而是应该采用fragmentstatepageradapter,该pageradapter最多只保存三个fragment,(前后以及当前),使用后会自动销毁,所以占用内存不多,使用于多fragment情况使用,比如图片浏览。

2、由于viewpager自带缓存功能,可以通过setOffscreenPageLimit()来设置缓存的页数,但是最少也会缓存一个,即如果设置为0,效果同设置为1相同,此时如果要实现下面的功能,就比较费事:如果在当前页面对图片进行了缩放,然后移到下一个页面,然后再返回原页面,此时一般需要该页面的图片恢复初始尺寸,但是由于viewpager至少会缓存一个页面,所以前一个页面还在缓存中,因此不会重新生成fragment。因此无法使用onactivitycreated等生命周期函数,重新加载图片。

解决办法:使用pager.setOnPageChangeListener,在public void onPageSelected(final int arg0)中,对当前页面进行进一步操作:比如可以获取当前页面的fragment及其view:

Fragment f = (Fragment) mAdapter.instantiateItem(pager,
arg0);
TouchImageView tv = (TouchImageView) f.getView()
.findViewById(R.id.imageView);

3、一般情况下加载图片的layout会设置一个progressbar,一个imageview:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:background="@color/black_bg">


     <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" /> 




    <com.example.myusefuldemo.image.TouchImageView
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:contentDescription="@string/imageview_description" />        
这样在加载图片时,只显示progressbar,等图片下载完成后显示imageview。

这样就带了一个问题:如果网速较慢,会停留在progressbar较长时间,而此时我们在TouchImageView使用了getParent().requestDisallowInterceptTouchEvent( true);来防止父view获取touch事件,比如viewpager的滑动事件。由于imageview的bitmap尚未生成,所以无法再TouchImageview里调用getParent().requestDisallowInterceptTouchEvent( false );来恢复父view获取事件的功能,所以在progressbar界面,我们只能等待,而不能进行左右滑动。

解决办法:在加载图片前设置imageview的visibility为Gone,这样Imageview就不会获得Touch事件,从而不会调用getParent().requestDisallowInterceptTouchEvent( true);,所以viewpager的滑动效果可以使用。然后图片加载完毕后设置imageview为Visible,正常显示图片。





</FrameLayout>


你可能感兴趣的:(Viewpager中嵌入自定义可缩放view遇到的问题)