这几天一直在做批量水印功能,也就是点击水印添加到一张图片上,然后应用到所有图片。我刚开始立马想到用ViewPager和PagerAdapter来做,因为这个滑动冲突自身已经解决了,不需要我们再去伤脑筋,还挺好用,结果用的时候遇到了几个坑,但是幸好最后都解决了。
1.遇到翻页的时候,也就是还没完全翻到第二页,第二页显示的是第一页的内容,这样肯定用户体验不好。
解决方法:pageSelected重写方法中要预先加载第二页的内容,因为instantiateItem()方法只有你完全翻到第二页才会去加载第二页以及前一页和后一页的内容。
反正我是再添加imageview的时候对imageview赋值,再pageSelected重写方法的时候,有对所选择的图片赋值,解决了这个问题,看到这篇博客的朋友可以尝试一下。
2.viewPager动态加载,预加载的问题。
说明:viewpager未来减少内存,所以默认采用的是预加载的模式, 也就是你目前翻到第几页,她加载的就是当前页以及前后页,除非你翻完所有图片,这些图片才会加载到container中。但是我做的是批量水印,也就是用户看一张,所有的都必须加载出来,这样我才能保存所有图片,否则view为空。
解决方法:我上网搜了一圈没搜到,只能自己摸索viewpager的属性以及方法。终于找到了,只是一个方法设置问题:
mViewPager.setOffscreenPageLimit(mViews.size());
这个方法并不常用,估计很多人不知道。这个方法就是用来设置预加载的页面数量。完美解决问题。
3. 保存的时候重画整个view,由于水印是自定义view,所以重画时,也会调用自定义view的相应方法,比如layout()和draw().
说明:当然这个不是viewpager问题,属于canvas类相关的问题。由于重画的整个view去调用的layout()以及draw(),可能用的都是默认参数,无法用到我们之前计算好的数值,就会导致水印位置重新变为默认位置。
解决方法:不再调用layout()方法,这样就不会重置水印位置。
因为当时viewpager的坑没想到解决方法,于是我就想到了自定义scrolllayout去做。但是遇到了很多坑,有些到现在也没想明白。下面我来简单说一下。
1. Scrolllayout可以解决加载所有页面问题以及左右滑动问题,但是有个滑动冲突问题,也就是左右滑动与水印编辑冲突。这两个自定义View中都会重写OnTouchEvent()方法。虽然冲突,但是我想这我研究过事件分发机制,肯定没问题。
所以我在水印这个子View的OnTouchEvent方法中调用了 getParent().requestDisallowInterceptTouchEvent(true);也就是如果需要子View处理的话,就不传给父容器了。但是发现,第一张图OK了,第二张图,第三张图都不行,还是无法捕获事件。
然后我就调试了一下,发现,我点击水印的这个点击事件里传的参数失效了。什么意思???我明明传过来的为true,结果到了事件分发机制执行的时候,成了false。纳闷极了???????至今不知原因,希望哪个大牛经过,知道告诉我一下,谢谢。
2.ScrollLayout不如ViewPager的地方。我指的仅仅是我做的这个功能而言。有些时候ScrollLayout更合适,依情景而定
我做的功能有个点击小图片,显示大图片的功能,viewpager的setcurrentItem()这个方法就很好,没问题。但是如果是ScrollLayout就只能从现在这一页慢慢滑动到所选择的那一页,如果照片太多,用户体验就不是很好。