项目见GitLab:https://github.com/chwnFlyPig/DWCorePhoto_Android.git

实现效果见:1. https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/master/SingleShow.gif

2.https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/master/GridShow.gif

项目优点:minSdkVersion 11

核心代码:

1. 在View的OnClick回调方法中,通过方法getGlobalVisibleRect可以获取共享视图ImageView1的坐标和尺寸:

        public void onClick(View v) {            Rect rect = new Rect();            v.getGlobalVisibleRect(rect);}

2.在图片展示的Activity2里有两套布局,布局1:过渡布局,通常是一个单独的ImageView2,起始位置是ImageView1的坐标,终点坐标是展示页面的指定位置(一般是屏幕正中间)。主要使用位移动画;布局2:Activity2中稳定状态的布局,当共享视图达到终点后,隐藏掉过渡布局,展示出稳定状态的布局,如ViewPaper。

3.过渡布局中的位移动画,是通过开源项目nineoldandroids来实现的;

4.稳定状态里ImageView一般都可以支持缩放,是通过开源项目chrisbanes.photoview来实现的;与photoview相匹配,viewPager需要使用HackyViewPager,对Touch事件进行截获处理,否则缩放图片的过程中会出现崩溃:

java.lang.IllegalArgumentException pointerIndex out of range pointerIndex=-1 pointerCount=1

5.在展示图片时,ImageLoader与photoview搭配非常简单;但如果项目中使用的是Fresco,则需要通过ImagePipeLine将图片加载进来,然后将回调中的Bitmap复制一份后再给PhotoView。主要代码如下:

                FrescoImageLoader.getInstance().loadImage(ViewSinglePhotoActivity.this, picUrl, resizeOptions, new                        BaseBitmapDataSubscriber() {                            @Override                            protected void onNewResultImpl(Bitmap bitmap) {                                ViewSinglePhotoActivity.this.runOnUiThread(new Runnable() {                                    @Override                                    public void run() {                                        loadPb.setVisibility(View.GONE);                                    }                                });                                if (bitmap != null && photoView != null) {                                    final Bitmap arg2 = Bitmap.createBitmap(bitmap);                                    ImageCache.getInstance().put(picUrl, arg2);                                    ViewSinglePhotoActivity.this.runOnUiThread(new Runnable() {                                        @Override                                        public void run() {                                            photoView.setImageBitmap(arg2);                                        }                                    });                                }                            }                            @Override                            protected void onFailureImpl(DataSource> dataSource) {                                ViewSinglePhotoActivity.this.runOnUiThread(new Runnable() {                                    @Override                                    public void run() {                                        loadPb.setVisibility(View.GONE);                                        photoView.setImageResource(R.drawable.default_pic);                                    }                                });                            }                        });

其中方法loadImage的实现如下:

    public void loadImage(Context context, String picUrl, ResizeOptions resizeOptions, BaseBitmapDataSubscriber bitmapDataSubscriber) {        if (StringUtil.isEmpty(picUrl)) {            return;        }        Uri uri = Uri.parse(picUrl);        ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(uri)                .setLocalThumbnailPreviewsEnabled(true)                .setAutoRotateEnabled(true)                .setResizeOptions(resizeOptions)                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)                .setProgressiveRenderingEnabled(false)                .build();        ImagePipeline imagePipeline = Fresco.getImagePipeline();        DataSource>                dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);        dataSource.subscribe(bitmapDataSubscriber, CallerThreadExecutor.getInstance());    }
其中的单例ImageCache,核心成员是LruCache cache。

更多相关文章

  1. android调用外部导航(百度,高德)
  2. 自定义 listivew (android)
  3. android 加载布局xml文件时报空指针
  4. RecyclerView的使用详解
  5. phonegap 在win7中的安装步骤
  6. android默认允许usb调试和usb权限
  7. android ConstraintLayout百分比适配
  8. Android(安卓)使用JAVA代码控制UI界面
  9. Android(安卓)工程目录简单结构

随机推荐

  1. Android LiveCD VirtualBox
  2. Android中自定义TextView的形状--圆形-椭
  3. Android移动操作系统源代码
  4. 【Android】通过软引用实现图片缓存,防止
  5. Android 神兵利器Dagger2使用详解(三)MVP架
  6. android中shape
  7. Android RadioGroup和RadioButton使用
  8. 【Android Training视频系列】第4讲Build
  9. Android所有系统资源图标android.R.drawa
  10. Intent实现Android间的页面跳转