Coder Social home page Coder Social logo

yangchaojiang / zoompreviewpicture- Goto Github PK

View Code? Open in Web Editor NEW
1.7K 22.0 220.0 73.09 MB

拓展性极高类似微信图片和视频浏览,常见应用场景如微信朋友圈照片九宫格和微信聊天图片图片,视频,gif预览

License: Apache License 2.0

Java 100.00%
android image video gif

zoompreviewpicture-'s Introduction

ZoomPreviewPicture

本项目受Google官方demo Zooming a View 启发,实现了点击小图放大至全屏预览,退出全屏恢复至原来位置这两个过程的动画过渡。 常见应用场景如微信朋友圈照片九宫格和微信聊天图片,视频,gif预览,某些手机系统相册等viewpager图片查看 缩放 拖拽下拉缩小退出(效果同微信图片浏览)

Download

特点

  • 1.支持自定义图片加载框架。
  • 2.支持重写activity,完成切换切换效果。
  • 3.图片查看 缩放 拖拽下拉缩小退出。
  • 4.支持自定义activity,Fragment。
  • 5.支持视频和自定义视频播放控件。
  • 6.支持类似微信朋友圈照片九宫格和微信聊天图片预览。
  • 7.指示器类型选择 圆点模式(贝塞尔圆点指示器)和数字模式。
  • 8.增加接口实体类。不在使用数据转化。
  • 8.支持GIF显示。 ####效果如下:

通过Gradle抓取:

  compile 'com.ycjiang:ImagePreview:2.3.7'

1.本项目类库依赖第三库,()

注意: 由于的photoview 1.3.1版本源代码修改采用依赖本地。重新 photoview版本库回退到1.3.1版本。

2.3.5 新增图片只有没有放大缩小,才能拖拽图片返回,(场景预览放大情况,容易点击误返回)实例代码:

 GPreviewBuilder.from((Activity) context)
                         .setData(list)
                         .setIsScale(true)
      compile 'com.android.support:support-fragment:26.1.0'
      compile 'com.android.support:support-core-utils:26.1.0'

2.示例代码

  • 注意:: 你实现自定义类,在你 app onCreate() 中

    @Override
      public void onCreate() {
          super.onCreate();
          ZoomMediaLoader.getInstance().init(new TestImageLoader());
      }

1.使用方式

     GPreviewBuilder.from(GridViewCustomActivity.this)//activity实例必须
                            .to(CustomActivity.class)//自定义Activity 使用默认的预览不需要
                            .setData(mThumbViewInfoList)//集合
                            .setUserFragment(UserFragment.class)//自定义Fragment 使用默认的预览不需要
                            .setCurrentIndex(position)
                            .setSingleFling(false)//是否在黑屏区域点击返回
                            .setDrag(false)//是否禁用图片拖拽返回  
                            .setType(GPreviewBuilder.IndicatorType.Dot)//指示器类型
                            .start();//启动            

2.列表控件item点击事件添加相应代码。 (RecyclerView为例,demo有(ListView和GridView和九宫格控件实例代码))

     mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
            @Override
            public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int position) {
              //在你点击时,调用computeBoundsBackward()方法
                computeBoundsBackward(mGridLayoutManager.findFirstVisibleItemPosition());
              GPreviewBuilder.from(RecycleViewActivity.this)
                                .setData(mThumbViewInfoList)
                                .setCurrentIndex(position)
                                .setType(GPreviewBuilder.IndicatorType.Number)
                                .start();
            }
        });
    /**
     ** 查找信息
     * 从第一个完整可见item逆序遍历,如果初始位置为0,则不执行方法内循环
     */
    private void computeBoundsBackward(int firstCompletelyVisiblePos) {
        for (int i = firstCompletelyVisiblePos;i < mThumbViewInfoList.size(); i++) {
            View itemView = mGridLayoutManager.findViewByPosition(i);
            Rect bounds = new Rect();
            if (itemView != null) {
                ImageView thumbView = (ImageView) itemView.findViewById(R.id.iv);
                thumbView.getGlobalVisibleRect(bounds);
            }
            mThumbViewInfoList.get(i).setBounds(bounds);
        }
    }

2.构造实体类: 你的实体类实现IThumbViewInfo接口

注意:IThumbViewInfo 实现 Parcelable 接口 注意序列化化

public class UserViewInfo implements IThumbViewInfo {
    private String url;  //图片地址
    private Rect mBounds; // 记录坐标
    private String user;//
     private String videoUrl;//视频链接 //不为空是视频
     
    public UserViewInfo(String url) {
        this.url = url;
    }

    @Override
    public String getUrl() {//将你的图片地址字段返回
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    @Override
    public Rect getBounds() {//将你的图片显示坐标字段返回
        return mBounds;
    }
    
    public void setBounds(Rect bounds) {
        mBounds = bounds;
    }
   } 

3.使用自定义图片加载配置 注意这个必须实现哦。不然加载

  • 1在你项目工程,创建一个类 实现接口IZoomMediaLoader接口 如下代码 demo 采用glide ,可以使用Picassor Imagloader 图片加载框架
public class TestImageLoader implements IZoomMediaLoader {
    @Override
    public void displayImage(Fragment context, String path,ImageView imageView, final MySimpleTarget<Bitmap> simpleTarget) {
            Glide.with(context).load(path)
                       .asBitmap()
                        .error(R.drawable.ic_default_image)
                        .listener(new RequestListener<String, Bitmap>() {
                            @Override
                            public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
                                simpleTarget.onLoadFailed(null);
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                simpleTarget.onResourceReady();
                                return false;
                            }
                        })
                        .into(imageView);
    }
        @Override
        public void displayGifImage(@NonNull Fragment context, @NonNull String path, ImageView imageView, @NonNull final MySimpleTarget simpleTarget) {
            Glide.with(context).load(path)
                   .asGif()
                    //可以解决gif比较几种时 ,加载过慢  //DiskCacheStrategy.NONE
                    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                    .error(R.drawable.ic_default_image)
                    .dontAnimate() //去掉显示动画
                    .listener(new RequestListener<String, GifDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GifDrawable> target, boolean isFirstResource) {
                            simpleTarget.onResourceReady();
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(GifDrawable resource, String model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            simpleTarget.onLoadFailed(null);
                            return false;
                        }
                    })
                    .into(imageView);
        }
     @Override
     public void onStop(@NonNull Fragment context) {
           Glide.with(context).onStop();
     }
     @Override
     public void clearMemory(@NonNull Context c) {
              Glide.get(c).clearMemory();
     }

4.视频的支持

1.自定义播放视频控制

   GPreviewBuilder.from(VideoViewActivity.this)
                       .setData(mThumbViewInfoList)
                       .setCurrentIndex(position)
                       .setSingleFling(true)
                      .setOnVideoPlayerListener(new VideoClickListener(){
                           @Override
                           public void onPlayerVideo(String url) {
                               Log.d("onPlayerVideo",url);
                               Intent intent=new Intent(VideoViewActivity.this,VideoPlayerDetailedActivity.class);
                               intent.putExtra("url",url);
                               startActivity(intent);
                           }
                       })
                       .setType(GPreviewBuilder.IndicatorType.Number)
                       .start();

5.自定义Activity,Fragment

1.实现自定义Activity,实现你业务操作例如加入标题栏,ViewPager切换动画等等 .image.png

在你的布局中,引用类库核心布局

2.实现自定义Fragment 实现自定义业务 例如 长按保存图片,编辑图片,对图片说明内容等等 图片缩放效果采用PhotoView image.png

需要布局自定义重写onCreateView()。引用你自定义布局中添加

3 使用细节注意:

1 Activity和Fragment可以单独使用,也可以组合一起使用

  1. 自定义使用布局时,不在子类使用setContentView()方法
  1. 你在Activity 重写 setContentLayout(),返回你的自定义布局
  1. 在你布局内容 使用include layout="@layout/activity_image_preview_photo" 预览布局添加你布局中
  1. GPreviewBuilder 调用 from()方法后,调用to();指向你.to(CustomActivity.class)自定义预览activity
  1. 别忘了在AndroidManifest activity 使用主题

示例:

升级日志

2.3.4

  • 1.修改加载中返回问题#158
  • 2.修改加载中返回问题#55

2.2.8

2.2.7

  • 1.修改bug#131

2.2.6

  • 1.photoview版本升级到2.3.0
  • 2.修复bug116和bug107

2.2.5

  • 1.修改问题#117同意动画时长。 * 2. compileSdkVersion 升级 28

2.2.3

  • 1.修改bug#99
  • 2.修改bug#97

2.2.2

  • 1.修改bug#81

2.2.1

  • 1修复回调处理增加view参数
  • 2.修改bug#81

升级日志

2.2.0

  • 1.关于视频监听的bugbug58

2.1.8

  • 1.增加Gif 显示支持
  • 2.其它优化。

2.1.7

  • 1.修改本地[photoview]包名路径

2.1.6

2.1.5

  • 1.拖动还原的过程中,双指放大会然后松手图片会卡在那里修复bug58

2.1.3

2.1.4

2.1.3

  • 1.修复8.0主题属性发音崩溃

2.1.2

  • 1.修复图片还原时触发长按事件

2.1.0

  • 1.设置动画时长类型

2.0.9

  • 1.增加增加设置动画时长

2.0.8

  • 1.增加一个图片是是否显示指示器
  • 2.优化图片改过大时出现白屏加载

2.0.5

  • 1.fragment 属性字段开放访问权限。
  • 2.修复原点指示器这设置选中不显示问题。

2.0.4

  • 1.增加ViewPager 示例demo
  • 2.由于的photoview有些事件冲突将1.3.1版本photoview代码修改依赖本地。
  • 3.修改bug#36

2.0.0

  • 1.类库引用名称”com.ycjiang:imgepreviewlibrary:xxx“改为“com.ycjiang:ImagePreview:xxx”
  • 2.ThumbViewInfo 父类 改为 IThumbViewInfo 接口实现。
  • 3.增加支持Fragment自定义.实现各种业务需求。
  • 4.增加图片拖拽禁用方法。#25

1.1.3

  • 1.fragment改用静态方法实例化。

1.1.2

  • 1.列表数据过长OOM问题问题#17
  • 2.sdk 23版本九宫格图片类型可能进入的动画效果#15

1.1.0

  • 1.bug修复21版本下奔溃问题#16

1.0.9

  • 1.bug修复返回销毁对null判断处理#14

1.0.8

  • 1.完善自定义预览实现步骤,让自定义更简洁

1.0.7

  • 1.修复双手缩放失效问题

1.0.6

1.0.4

  • 1.修复占位图错位问题
  • 2.支持色值和svg 等矢量图。
  • 3.优化bitmap使用

1.0.3

  • 1 移除Glide 类库依赖,使用自定义图片加载框架
  • 2 增加自定义配置接口,实现即可完成自定义加载框架
  • 3 修复占位图,因错误问题
  • 4 修改包名路径,分类

1.0.2

  • 1 增加自定义Activity实现实现getViewPager 切换动画

1.0.1

  • 发布第一版

zoompreviewpicture-'s People

Contributors

protectedman avatar yangchaojiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zoompreviewpicture-'s Issues

GPreviewActivity中fragment数量的问题

你好,我看到你在demo里用的图片是网络图片,关键是居然有600多个链接,直接把这么多连接传过去然后建了600多个fragment,这样不会有性能问题吗?(我应该没理解错吧,GPreviewActivity初始化的时候新建了几百个PhotoFragment)是不是应该考虑更安全更节省资源的方式呢?

缩略图和原图的处理

问一个需求方面的问题:列表页九宫格展示的thumbImage缩略图,而大图需要展示原图,然后把缩略图地址和原图地址都传过去了,怎样去像微信那样先展示列表页的缩略图缓存然后再圆滑的切换到高清原图呢。我以module方式导库,还是不知道怎样去处理好。

我给你的demo下下来报了三次数组越界

     java.lang.IndexOutOfBoundsException: Invalid index 57, size is 0
                                                                            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                                                                            at java.util.ArrayList.get(ArrayList.java:308)
                                                                            at com.previewlibrary.GPreviewActivity$2.onGlobalLayout(GPreviewActivity.java:165)

大神请教几个问题

1.图片放大模式下,图片viewpager滑到下一张,再返回上一张图片大小应该还原,仿微信

图片预览页返回空指针异常

测试手机

Nexus 5

系统版本

6.0.1

错误信息

Process: com.example.previewpicture, PID: 20678
java.lang.RuntimeException: Unable to destroy activity {com.example.previewpicture/com.previewlibrary.GPreviewActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3831)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849)
at android.app.ActivityThread.-wrap5(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at com.previewlibrary.GPreviewActivity$PhotoPagerAdapter.getCount(GPreviewActivity.java:208)
at android.support.v4.view.ViewPager$MyAccessibilityDelegate.canScroll(ViewPager.java:3103)
at android.support.v4.view.ViewPager$MyAccessibilityDelegate.onInitializeAccessibilityNodeInfo(ViewPager.java:3071)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.onInitializeAccessibilityNodeInfo(AccessibilityDelegateCompat.java:246)
at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.onInitializeAccessibilityNodeInfo(AccessibilityDelegateCompatJellyBean.java:66)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:6082)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:6043)
at android.view.View$AccessibilityDelegate.createAccessibilityNodeInfo(View.java:22287)
at android.view.View.createAccessibilityNodeInfo(View.java:6026)
at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:145)
at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119)
at android.view.View.onInitializeAccessibilityEventInternal(View.java:5980)
at android.view.View$AccessibilityDelegate.onInitializeAccessibilityEvent(View.java:22199)
at android.support.v4.view.AccessibilityDelegateCompatIcs.onInitializeAccessibilityEvent(AccessibilityDelegateCompatIcs.java:97)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateIcsImpl.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:192)
at android.support.v4.view.AccessibilityDelegateCompat.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:432)
at android.support.v4.view.ViewPager$MyAccessibilityDelegate.onInitializeAccessibilityEvent(ViewPager.java:3054)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:241)
at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.onInitializeAccessibilityEvent(AccessibilityDelegateCompatJellyBean.java:61)
at android.view.View.onInitializeAccessibilityEvent(View.java:5966)
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5833)
at android.view.View$AccessibilityDelegate.sendAccessibilityEventUnchecked(View.java:22138)
at android.support.v4.view.AccessibilityDelegateCompatIcs.sendAccessibilityEventUnchecked(AccessibilityDelegateCompatIcs.java:122)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateIcsImpl.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:223)
at android.support.v4.view.AccessibilityDelegateCompat.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:371)
at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:268)
at android.support.v4.view.AccessibilityDeleg

目前发现两种修改方法

1.在FragmentPagerAdapter中判断fragments是否为空

private class PhotoPagerAdapter extends FragmentPagerAdapter {

        PhotoPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }

        @Override
        public int getCount() {
            if (null == fragments) {
                return 0;
            }
            return fragments.size();
        }
    }

2.修改onDestory中释放资源顺序

    @Override
    protected void onDestroy() {
        ZoomMediaLoader.getInstance().getLoader().clearMemory(this);
        viewPager.setAdapter(null);
        viewPager.clearOnPageChangeListeners();
        viewPager.removeAllViews();
        fragments.clear();
        imgUrls.clear();
        fragments = null;
        imgUrls = null;
        super.onDestroy();
    }

关于Activity和Fragment扩展性问题

1、Fragment的loading样式怎么修改,感觉扩展性不强,为什么不直接设置protected,能够让自定义的Fragment获取到这个控件进行更改
2、我以自己写的九宫格图片展示,传currentPosition会有很多未知的问题,第一次进入时dot点的位置很乱,需要左右切换viewpager时才正常
这个图,Position = 4,但是刚进去的时候是这样展示的,开始滑动后就正常了
image

图片进入动画问题

image
这个部分把Activity实例传入
image
同时我在自己的Activity的基类进行重写动画
image
这样就会把进入动画覆盖
我的解决方案是
image
消除跳转动画
建议在
image
这行下面加入

图片点击崩溃

在“靠谱天天模拟器”上测试demo崩溃, API 19
请大佬看看

10-09 15:24:18.345 16995-16995/com.example.previewpicture E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.previewpicture, PID: 16995 android.view.InflateException: Binary XML file line #11: Error inflating class android.widget.ProgressBar at android.view.LayoutInflater.createView(LayoutInflater.java:620) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at com.previewlibrary.PhotoFragment.onCreateView(PhotoFragment.java:52) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984) at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16497) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) at android.view.View.measure(View.java:16497) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.ma

[改进建议]

  1. 能否增加一个预览删除回调?(我有时间可以写写玩玩~)
  2. 个人感觉构造那个UserThumb有点麻烦,一般图像链接都是一个String或者相册的Uri,能否改进?

java.lang.NullPointerException: loader no init

1,九宫格我用的是传递的是List <String>

  private List<ThumbViewInfo> computeBoundsBackward(List list) {
            List<ThumbViewInfo> thumbViewInfos = new ArrayList<>();
            for (int i = 0; i < activeNglIv.getChildCount(); i++) {
                View item = activeNglIv.getChildAt(i);
                Rect bounds = new Rect();
                if (item != null) {
                    ImageView thumbView = (ImageView) item;
                    thumbView.getGlobalVisibleRect(bounds);
                }
                ThumbViewInfo viewInfo = new ThumbViewInfo((String) list.get(i));
                viewInfo.setmBounds(bounds);
                thumbViewInfos.add(viewInfo);
            }
            return thumbViewInfos;
        }

然后我将返回的 thumbViewInfos 放进去,点击图片预览


                                                                                       java.lang.NullPointerException: loader no init
                                                                                           at com.previewlibrary.ZoomMediaLoader.getLoader(ZoomMediaLoader.java:34)
                                                                                           at com.previewlibrary.view.BasePhotoFragment.initDate(BasePhotoFragment.java:169)
                                                                                           at com.previewlibrary.view.BasePhotoFragment.onViewCreated(BasePhotoFragment.java:73)
                                                                                           at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)
                                                                                           at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
                                                                                           at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
                                                                                           at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
                                                                                           at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
                                                                                           at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
                                                                                           at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
                                                                                           at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2199)
                                                                                           at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:651)
                                                                                           at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145)
                                                                                           at android.support.v4.view.ViewPager.populate(ViewPager.java:1236)
                                                                                           at android.support.v4.view.ViewPager.populate(ViewPager.java:1084)
                                                                                           at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614)
                                                                                           at android.view.View.measure(View.java:16497)
                                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                                                                                           at android.view.View.measure(View.java:16497)
                                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                                                                                           at android.view.View.measure(View.java:16497)
                                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                                                                                           at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                                                                                           at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                                                                                           at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                                                                                           at android.view.View.measure(View.java:16497)
                                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                                                                                           at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
                                                                                           at android.view.View.measure(View.java:16497)
                                                                                           at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1940)
                                                                                           at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1137)
                                                                                           at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1319)
                                                                                           at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1024)
                                                                                           at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5694)
                                                                                           at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
                                                                                           at android.view.Choreographer.doCallbacks(Choreographer.java:574)
                                                                                           at android.view.Choreographer.doFrame(Choreographer.java:544)
                                                                                           at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
                                                                                           at android.os.Handler.handleCallback(Handler.java:733)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                           at android.os.Looper.loop(Looper.java:136)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:5019)
                                                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                           at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                                                           at dalvik.system.NativeStart.main(Native Method)


PhotoView包名重复

现在GitHub上的所有图片相关库都用到了photoview,为了避免冲突所有作者都把放到本地引用,但是你们好歹改一下包名啊。只要引用2个库,就会报包名重复的错误。既然都用到本地了为什么不改包名,还不如用gradle引用,好歹有个exclude可以用。你们本地包名类名重复 这就没辙了啊。只能代码下出来放我自己本地,绝望!!!!

请教一个动画时长问题?

TRANSFORM_DURATION = 300 ,修改这个参数,动画快慢没啥变化,甚至as.setDuration(TRANSFORM_DURATION); animator.setDuration(TRANSFORM_DURATION); 都注释掉,动画快慢还是没啥变化。我用了官方的Zoom Demo,改时长明显有快慢变化,请教一下您这个项目如何控制动画快慢?

OOM问题

  GPreviewBuilder.from((Activity) itemView.getContext())
                .setData(thumList)
                .setCurrentIndex(selectPosition)
                .setSingleFling(true)
                .setType(GPreviewBuilder.IndicatorType.Number)
                .start();

当 thumList 中有很多图片url时,左右切换查看图片,app占用内存持续增长不被释放,直到OOM

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.