jeasonlzy / ninegridview Goto Github PK
View Code? Open in Web Editor NEW类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设置图片,对外提供接口回调,使用接口加载图片,支持任意的图片加载框架,如 Glide,ImageLoader,Fresco,xUtils3,Picasso 等,支持点击图片全屏预览大图。
类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设置图片,对外提供接口回调,使用接口加载图片,支持任意的图片加载框架,如 Glide,ImageLoader,Fresco,xUtils3,Picasso 等,支持点击图片全屏预览大图。
小米三星没有问题,手里有台华为麦芒点击图片的时候大概走到动画1/3的部分就不走了。停在那里图片区域也可以进行触摸拉伸,但是只能维持在3/1的固定位置。透明度只有0.5
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.zht/com.lzy.ninegrid.preview.ImagePreviewActivity}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class
Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class
如果引用NineGridView方式
采用LayoutInflater.from(mContext).inflate
在
protected void onImageItemClick(Context context, NineGridView nineGridView, int index, List imageInfo) {}
context 是 Application,
导致 Intent intent = new Intent(context, ImagePreviewActivity.class);
要添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);才能跳转,
((Activity) context).overridePendingTransition(0, 0);强制转换保错;
解决方法:
LayoutInflater.from(mContext).inflate传入的Context 必须是Activity;
请问没有Demo或者解释呢?
类似于微博长图那种,预览模糊
options.placeholder(R.mipmap.icon_placeholder)
.error(R.mipmap.icon_error)
.diskCacheStrategy(DiskCacheStrategy.ALL)
//.skipMemoryCache(true)
.fallback(R.mipmap.icon_placeholder);
GlideApp.with(context)
.load(url)
.apply(options)
.into(imageView);
如果设置了skipMemoryCache(true)的话,图片一直加载不出来
app:ngv_mode="grid"
4张图不能填充满屏幕
如何选择开源授权协议可以看看这里:帮助你选择一个合适的开源共享协议 http://choosealicense.online
华为 安卓7.0 选择图片的时候 最大化崩溃
博主你好,现在我的项目中用到了你写的控件,嵌套在XRecyclerview中的item中,当我正常的从上往下翻阅的时候,ninegridview没有问题,但是如果这个时候从下往上翻阅的时候这时候会出现部分item的ninegridview无法加载出图片,再次从顶部往下滑动的时候又正常了。请问这是不是和viewholder的缓存有关系。
在手机设置里的开发者选项中关闭三个动画效果中的最后一个(即Animator Duration Scale),然后发现点击查看大图就打不开了(确切说是因为没有动画过渡效果导致大图没有展示出来),如果设为0.5x的特效就只能卡在一半,只有设为1.x才能完全打开大图,这个问题我发现微信就不会,不知道是怎么实现的,难道微信用的不是系统的动画?
换了Glide、Picasso都这样。
第一次进入没有图片,退出再进才会显示。这是什么问题啊
不能自己设置图片区域大小的吗
在使用步骤最下面的代码中:
ArrayList<ImageInfo> imageInfo = new ArrayList<>(); List<EvaluationPic> imageDetails = item.getAttachments(); if (imageDetails != null) { for (EvaluationPic imageDetail : imageDetails) { ImageInfo info = new ImageInfo(); info.setThumbnailUrl(imageDetail.smallImageUrl); info.setBigImageUrl(imageDetail.imageUrl); imageInfo.add(info); } } holder.nineGrid.setAdapter(new ClickNineGridViewAdapter(context, imageInfo));
这一句:holder.nineGrid.setAdapter(new ClickNineGridViewAdapter(context, imageInfo))
估计很多新手直接就在getView中这么写了(我就是),这将导致多次new,造成内存占用巨多,最终OOM。。。所以提醒一下各位,把adapter抽取出来,用的时候只需要setImageInfoList(list)即可。
RT ,adapter.notifyDataSetChanged();
/** 计算图片的宽高 */
private void computeImageWidthAndHeight(ImageView imageView) {
// 获取真实大小
Drawable _drawable_ = imageView.getDrawable();
int intrinsicHeight = drawable.getIntrinsicHeight();
int intrinsicWidth = drawable.getIntrinsicWidth();
// 计算出与屏幕的比例,用于比较以宽的比例为准还是高的比例为准,因为很多时候不是高度没充满,就是宽度没充满
float h = screenHeight * 1.0f / intrinsicHeight;
float w = screenWidth * 1.0f / intrinsicWidth;
if (h > w) h = w;
else w = h;
// 得出当宽高至少有一个充满的时候图片对应的宽高
imageHeight = (int) (intrinsicHeight * h);
imageWidth = (int) (intrinsicWidth * w);
}
drawable 会空指针, 我目前加了判断 if( null != drawable)
9张图,一直循环闪现,log显示一直在请求图片地址,换成小图后正常,是不是图片太大的缘故 @jeasonlzy
目前 自己调用 ImagePreviewActivity 打开图片浏览 会出现 imageview空指针,这也算很常用的功能,再单独写个这个 项目耦合就高了,
准备个问题就是在listview这种滑动的控件上运行的话,当手指在图片上滑动的时候会闪mask,建议不要写在onTouch'事件上 。这样体验很不好,。
点击图片第一张总是透明的,滑动才会显示出来。而且查看大图消失没有动画。
adapter没有作刷新功能啊
adapter.notifyDataSetChanged();
谢谢
希望图片预览可以添加缩放功能
requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{f07e97d V.ED..C.. ......ID 0,255-242,497} during layout: running second layout pass
当使用glide作为图片加载的时候:log不停的打印,(demo和把ninegridview作为moudle的时候不断复现),当采用gradle依赖的形式又正常了。
06-30 06:24:50.330 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{cfac5f2 VFED..C.. ........ 0,16-273,289} during second layout pass: posting in next frame
06-30 06:24:50.330 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{43a3b3 VFED..C.. ........ 280,16-553,289} during second layout pass: posting in next frame
06-30 06:24:50.334 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{cfac5f2 VFED..C.. ......ID 0,16-273,289} during layout: running second layout pass
06-30 06:24:50.334 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{43a3b3 VFED..C.. ......ID 280,16-553,289} during layout: running second layout pass
06-30 06:24:50.360 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{833b6cb VFED..C.. ........ 280,16-553,289} during second layout pass: posting in next frame
06-30 06:24:50.369 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{833b6cb VFED..C.. ......ID 280,16-553,289} during layout: running second layout pass
06-30 06:24:50.379 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{cfac5f2 VFED..C.. ........ 0,16-273,289} during second layout pass: posting in next frame
06-30 06:24:50.379 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{43a3b3 VFED..C.. ........ 280,16-553,289} during second layout pass: posting in next frame
06-30 06:24:50.380 2167-2167/com.lzy.ninegridview W/View: requestLayout() improperly called by com.lzy.ninegrid.NineGridViewWrapper{cfac5f2 VFED..C.. ......ID 0,16-273,289} during layout: running second layout pass
能不能在图片右上角有删除的功能?
多张图片显示 可以设置图片的宽高比吗,设置成矩形显示
目前遇到的需求是8张图片,每行4张
java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
因该是使用了不适当的 Context
项目需要单个图片长按的事件,很头疼
异常情况:设置ngv_maxSize = 3 时,列表中一个item有3张图片,下面的item有9张,或8张图片时,只有3张图片的这个item也会显示+6或+5这个蒙图,估计是item复用时出了问题
在item里面 图片数量是9张 但是NineGridView使用显示的时候会在 第九张图上来 显示+28张 但是数量我打断点查看了的只有9张图
FATAL EXCEPTION: main
Process: com.example.lrj.chunzhen, PID: 2595
java.lang.NoClassDefFoundError: com.lzy.ninegrid.preview.ImagePreviewAdapter
at com.lzy.ninegrid.preview.ImagePreviewActivity.onCreate(ImagePreviewActivity.java:57)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
at cn.jiguang.a.a.d.a.a.d.callActivityOnCreate(Unknown Source)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2243)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
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)
你好,在NineGridView中的onLayout方法会无限掉用。
我将NineGridView作为RecyclerView的Item,然后显示3张图片的时候,在第一次加载的时候可能没问题,但是从屏幕外滑进来后就会不停加载图片,最后跟踪定位到onLayout方法,会无限调用。现在你的源码如下:
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (mImageInfo == null) return; int childrenCount = mImageInfo.size(); for (int i = 0; i < childrenCount; i++) { ImageView childrenView = (ImageView) getChildAt(i); if (mImageLoader != null) { mImageLoader.onDisplayImage(getContext(), childrenView, mImageInfo.get(i).thumbnailUrl); } int rowNum = i / columnCount; int columnNum = i % columnCount; int left = (gridWidth + gridSpacing) * columnNum + getPaddingLeft(); int top = (gridHeight + gridSpacing) * rowNum + getPaddingTop(); int right = left + gridWidth; int bottom = top + gridHeight; childrenView.layout(left, top, right, bottom); } }
我看到你没有判断是否位置发生改变就开始布局。
现在我的解决方案是写一个类,继承NineGridView,在onLayout方法里做一个判断,代码如下:
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { ALog.e("1111111111" + changed); if (changed) { super.onLayout(changed, l, t, r, b); } }
最后解决问题了,log也不会无限打印了。
您看具体原因是出现在哪儿?
2张图不能整行充满显示
我看 laobie/NineGridImageView 在1.0.1解决了这个问题。
不知道你是根据哪个版本修改的啊。。?
图片预览能不能加个长按保存图片到本地
ninegridview载recyclerview里无法多次使用,单次的话是正常的,要是多次就会报java.lang.IllegalArgumentException: You must pass in a non null View,错误。用的是glide
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.