上个星期是个忙碌的一周,全周都在赶进度,多是过年过的太舒畅了吧。如今终于有空来坐下来,安安静静的思考下这忙碌后的收获。在此也回顾一下,作个分享!git
今天的内容是关于大图浏览的实现,可能各类实现方法都不少,但我这里要说的是基于Fresco
来实现。(其实主要是项目中用的就是Fresco
)github
可能还有人不了解Fresco
,这里我来简单的介绍一下。web
Fresco
是facebook
推出的开源项目,该项目主要用来解决Android
图片加载的,它是一个强大的图片加载组件,使用它以后,你不须要再去关心图片的加载和显示的繁杂事件。对于专一于图片App
强烈推荐使用它。缓存
下面是它的一些突出特性网络
Fresco
中的Image Pipeline
负责从网络、本地文件系统、本地资源加载图片,最大的节省空间与CPU
时间,同时含有3级缓存(2级内存,1级磁盘),支持缩略图与清晰度的转换等Fresco
的Drawees
,负责图片加载完成前的占位图与图片不可见时的释放,同时还支持圆形图片的实现Fresco
支持渐进式图片展现,Android
自己是不支持的。Fresco
完美支持Gif
与WebP
动图,轻松解决每一帧都是很大的Bitmap
烦恼。传送门: Frescoide
既然是基于Fresco
,在实现以前天然要导入Fresco
的相关依赖包。布局
compile 'com.facebook.fresco:fresco:1.0.0' compile 'com.facebook.fresco:animated-gif:1.0.0' compile 'com.facebook.fresco:animated-webp:1.0.0' compile 'com.facebook.fresco:webpsupport:1.0.0'
若是只要实现普通图片的加载,那么只要导入第一个就能够了。好了如今你就可牛逼哄哄的使用这么高大上的组件来加载图片,至于使用步骤,随便看下相关教程就能轻松搞定,例如前面所说的圆形图片。想当初我仍是苦逼是找相关的库来实现的...ui
上面只是针对于普通的图片展现,但不是今天的主题。下面是一段基本的使用代码this
private void displayImage(SimpleDraweeView draweeView, String url) { GenericDraweeHierarchy hierarchy = draweeView.getHierarchy(); //设置占位图 if (hierarchy == null) { hierarchy = GenericDraweeHierarchyBuilder.newInstance(getResources()) .setPlaceholderImage(getResources().getDrawable(R.mipmap.ic_launcher) , ScalingUtils.ScaleType.CENTER).build(); draweeView.setHierarchy(hierarchy); } else { hierarchy.setPlaceholderImage(getResources().getDrawable(R.mipmap.ic_launcher) , ScalingUtils.ScaleType.CENTER); } //构建ImageRequestBuilder,传入请求Uri ImageRequestBuilder requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)); //构建Controller DraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(draweeView.getController()) .setImageRequest(requestBuilder.build()) .build(); //设置图片,Fresco设置显示图片都是经过Controller来实现 draweeView.setController(controller); }
相信上面的注释已经很是明显了
咱们都知道如今只要是个App
且里面有图片的展现,那么基本上就有图片浏览这一个功能。对于大图浏览须要支持缩放、拖拽、双击放大。Fresco
原生的SimpleDraweeView
是不支持这些功能的,因此咱们这里要使用另一个控件ZoomableView
。固然它也是Fresco
官方提供的,咱们如今要作的就是接入到咱们的项目中。前面的传送门中能够找到ZoomableView
。但毕竟是Fresco
项目的集合体,本片文章的末尾我会提供我已经提取好的相关代码。url
咱们建立一个界面ZoomableActivity
,至于布局大图浏览天然少不了ViewPager
,这里就很少介绍ViewPager
了,直接上ZoomableActivity
代码
public class ZoomableActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { private static final String EXTRA_ZOOMABLE_PATHS = "extra_zoomable_paths"; private static final String EXTRA_ZOOMABLE_INDEX = "extra_zoomable_index"; private ViewPager mViewPager; private TextView mZoomableIndex; private ArrayList<String> mPaths; private int mIndex; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.zoommable_activity); getExtraData(); initView(); setupViewPager(); } private void getExtraData() { mPaths = getIntent().getStringArrayListExtra(EXTRA_ZOOMABLE_PATHS); mIndex = getIntent().getIntExtra(EXTRA_ZOOMABLE_INDEX, 0); } private void initView() { mViewPager = (ViewPager) findViewById(R.id.view_pager); mZoomableIndex = (TextView) findViewById(R.id.zoomable_index); } private void setupViewPager() { mViewPager.setAdapter(new ZoomableViewPagerAdapter(this, mPaths)); mViewPager.setCurrentItem(mIndex); mZoomableIndex.setText(mIndex + 1 + "/" + mPaths.size()); mViewPager.addOnPageChangeListener(this); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mZoomableIndex.setText(position + 1 + "/" + mPaths.size()); } @Override public void onPageScrollStateChanged(int state) { } public static void goToPage(Context context, ArrayList<String> paths, int index) { Intent intent = new Intent(context, ZoomableActivity.class); intent.putStringArrayListExtra(EXTRA_ZOOMABLE_PATHS, paths); intent.putExtra(EXTRA_ZOOMABLE_INDEX, index); context.startActivity(intent); } }
下面就是Adapter
了,主要就是图片的显示,由于我这里直接是ViewPager
因此使用PagerAdapter
,核心代码就是它的instantiateItem
方法。
@Override public Object instantiateItem(ViewGroup container, int position) { View view = LayoutInflater.from(mContext).inflate(R.layout.zoomable_view_pager_item, null); ZoomableDraweeView zoomableDraweeView = (ZoomableDraweeView) view.findViewById(R.id.zoomable_image); //容许缩放时切换 zoomableDraweeView.setAllowTouchInterceptionWhileZoomed(true); //长按 zoomableDraweeView.setIsLongpressEnabled(false); //双击击放大或缩小 zoomableDraweeView.setTapListener(new DoubleTapGestureListener(zoomableDraweeView)); DraweeController draweeController = Fresco.newDraweeControllerBuilder() .setUri(mPaths.get(position)) .build(); //加载图片 zoomableDraweeView.setController(draweeController); container.addView(view); view.requestLayout(); return view; }
这样就实现了大图浏览的效果,是否是很简单了,咱们借助ZoomableView
后,只要实现交互的展现逻辑就Ok了
项目传送门:https://github.com/idisfkj/Zo...
我的blog:https://idisfkj.github.io/arc...