-
2021-12-10 16:14:06
将图片完全路径加载到内存中,这个过程很快,完全不会卡顿。当需要使用图片时,再执行加载图片的方法,每次加载3-4张图(一块屏幕显示三四张图也差不多了吧),用户几乎完全不会有感觉。
上代码:
/// <summary> /// 统一异步载入 /// </summary> public async void UniteFSAsync() { dirInfo = new DirectoryInfo(Application.streamingAssetsPath + "/加载图片的路径"); FileInfo[] files; string[] ImgType = "*.jpg|*.png|*.bmp".Split('|'); Debug.Log(dirInfo); for (int j = 0; j < ImgType.Length; j++) { files = dirInfo.GetFiles(ImgType[j]); for (int i = 0; i < files.Length; i++) { GameObject tf = Instantiate(Resources.Load("预制体名字"), 父类Transform) as GameObject; 保存预制体的数组.Add(tf); Debug.log( files[i].FullName);//文件全名称 //await LoadByFSAsync(files[i].FullName, raw);//加载图片的方法 } } }
下面是加载图片的方法,可以调整为等比例显示。
/// <summary> /// 异步载入图片 /// </summary> /// <param name="path">路径</param> /// <param name="image">Image对象</param> /// <returns></returns> private async Task LoadByFSAsync(string path, RawImage image) { byte[] result; using (FileStream SourceStream = File.Open(path, FileMode.Open)) { result = new byte[SourceStream.Length]; await SourceStream.ReadAsync(result, 0, (int)SourceStream.Length); } Texture2D tx = new Texture2D(2, 1); tx.LoadImage(result); //等比例调整图片大小 //float widthRatio = tx.width / img_width; //float heightRatio = tx.height / img_height; //if (widthRatio / heightRatio > 1.1) //{ // image.GetComponent<RectTransform>().sizeDelta = new Vector2(tx.width / widthRatio, tx.height / widthRatio); //} //else //{ // image.GetComponent<RectTransform>().sizeDelta = new Vector2(tx.width / heightRatio, tx.height / heightRatio); //} image.texture = tx; }
再来一个是加载好的图片顺序不对,图片1后面是图片10,而不是2,解决方案就是弄个排序。
public class FileNameSort : IComparer { //调用DLL [System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string param1, string param2); //前后文件名进行比较。 public int Compare(object name1, object name2) { if (null == name1 && null == name2) { return 0; } if (null == name1) { return -1; } if (null == name2) { return 1; } return StrCmpLogicalW(name1.ToString(), name2.ToString()); } } //使用时 Array.Sort(文件名, new FileNameSort());
更多相关内容 -
使用Android Studio 练习RecyclerView 异步加载图片,解决图片乱序问题。
2015-09-15 17:12:43使用Android Studio 练习RecyclerView 异步加载图片,解决图片乱序问题。 -
Android App 启动时显示正在加载图片
2014-07-10 13:05:34Android App 启动时显示正在加载图片,如微信,人人,qq,天天动听等 -
android中ListView异步加载图片时的图片错位问题解决方案
2013-01-04 11:33:46android中ListView异步加载图片时的图片错位问题解决方案 -
android实现Glide加载图片(优化上下滑动图片重复加载问题) 简易新闻(八)
2019-08-10 20:15:54android实现Glide加载图片(优化上下滑动图片重复加载问题) 简易新闻(十)Android实现Glide加载图片 优化上下滑动图片重复加载问题 简易新闻 八
问题描述
在优化加载网络图片之前,我们先看一下之前加载图片会出现的一个问题(简易新闻加载新闻图片的第三方框架是:Universal Image Loader),这个是一个比较老的框架了,但是用处依然很大,那我要说的是什么问题呢,就是在加载完图片后,如果你上下滑动再回来看的时候,发现还是要重新加载图片(当然网速好的情况下是没什么毛病的),让我们看一下问题的gif来有一个更深刻的印象:
我们发现,刚开始加载的最前面的图片资源(如50000只小蜜蜂明明图片已经加载完了,但是当我们滑动到底部的时候,再回过头来发现要重新加载,这是一个很不友好的问题,所以我们就要优化了。前几周学习了Glide加载图片正好拿来优化加载网络图片的问题。)我们再来看一下使用Glide加载图片后的明显区别
优化的地方:
1:是加载过的图片不会二次加载了,上下滑动再回来不会在重新加载
2:加载图片的速度变快了,(而且点击其他分类的新闻,有的已经加载出来了(预加载))
优化过程
第一步,添加Glide的引用
修改build.gradle
添加引用(关于Glide的基础用法请看,Android使用Glide框架加载图片)implementation 'com.github.bumptech.glide:glide:4.2.0'
第二步,修改TabAdapter.java
package com.example.frametest.TabAdapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.example.frametest.R; import com.example.frametest.json.NewsBean; import com.example.frametest.tools.GlideUtil; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import java.util.List; public class MyTabAdapter extends BaseAdapter { private List<NewsBean.ResultBean.DataBean> list; private Context context; private int IMAGE_01 =0; private int IMAGE_02 = 1; private int IMAGE_03 = 2; public MyTabAdapter(Context context, List<NewsBean.ResultBean.DataBean> list){ this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return 3; } @Override public int getItemViewType(int position) { if (list.get(position).getThumbnail_pic_s() != null && list.get(position).getThumbnail_pic_s02() !=null && list.get(position).getThumbnail_pic_s03() !=null){ return IMAGE_03; }else if (list.get(position).getThumbnail_pic_s() !=null && list.get(position).getThumbnail_pic_s02() !=null){ return IMAGE_02; } return IMAGE_01; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (getItemViewType(position) == IMAGE_01){ Image01_ViewHolder holder; if (convertView == null){ convertView =View.inflate(context, R.layout.item_layout01,null); holder =new Image01_ViewHolder(); //查找控件 holder.author_name = (TextView) convertView.findViewById(R.id.author_name); holder.title = (TextView) convertView.findViewById(R.id.title); holder.image = (ImageView) convertView.findViewById(R.id.image); convertView.setTag(holder); }else { holder = (Image01_ViewHolder) convertView.getTag(); } //获取数据重新赋值 holder.title.setText(list.get(position).getTitle()); holder.author_name.setText(list.get(position).getAuthor_name()); //此处使用Glide加载图片,因为Glide加载图片的三步走即Glide.with().load().into(),因为 我使用的Glide的版本为4.X以上所有,加载方式稍稍不同,但原理一致 RequestOptions options = new RequestOptions() .placeholder(R.mipmap.ic_launcher) //这里我通过添加参数DiskCaheStrategy.RESPURCE来使其缓存我们定好的图片大小样式,而不是缓存原图片大小 .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .error(R.mipmap.ic_launcher); Glide.with(context).load(list.get(position).getThumbnail_pic_s()) .apply(options).into(holder.image); }else if (getItemViewType(position) == IMAGE_02){ Image02_ViewHolder holder; if (convertView == null){ convertView =View.inflate(context, R.layout.item_layout02,null); holder =new Image02_ViewHolder(); //查找控件 holder.image002 = (ImageView) convertView.findViewById(R.id.image002); holder.image001 = (ImageView) convertView.findViewById(R.id.image001); holder.title = (TextView) convertView.findViewById(R.id.title); convertView.setTag(holder); }else { holder = (Image02_ViewHolder) convertView.getTag(); } //获取数据重新赋值 holder.title.setText(list.get(position).getTitle()); RequestOptions options = new RequestOptions() .placeholder(R.mipmap.ic_launcher) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .error(R.mipmap.ic_launcher); Glide.with(context).load(list.get(position).getThumbnail_pic_s()) .apply(options).into(holder.image001); Glide.with(context).load(list.get(position).getThumbnail_pic_s02()) .apply(options).into(holder.image002); } else { Image03_ViewHolder holder; if (convertView == null){ convertView =View.inflate(context, R.layout.item_layout03,null); holder =new Image03_ViewHolder(); //查找控件 holder.image01 = (ImageView) convertView.findViewById(R.id.image01); holder.image02 = (ImageView) convertView.findViewById(R.id.image02); holder.image03 = (ImageView) convertView.findViewById(R.id.image03); holder.title = (TextView) convertView.findViewById(R.id.title); convertView.setTag(holder); }else { holder = (Image03_ViewHolder) convertView.getTag(); } //获取数据重新赋值 holder.title.setText(list.get(position).getTitle()); RequestOptions options = new RequestOptions() .placeholder(R.mipmap.ic_launcher) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .error(R.mipmap.ic_launcher); Glide.with(context).load(list.get(position).getThumbnail_pic_s()) .apply(options).into(holder.image01); Glide.with(context).load(list.get(position).getThumbnail_pic_s02()) .apply(options).into(holder.image02); Glide.with(context).load(list.get(position).getThumbnail_pic_s03()) .apply(options).into(holder.image03); } return convertView; } static class Image01_ViewHolder{ TextView title,author_name; ImageView image; } static class Image02_ViewHolder{ TextView title; ImageView image001,image002; } static class Image03_ViewHolder{ TextView title; ImageView image01,image02,image03; } }
到此,我们的目的就达到了,下篇我将会优化请求网络,以及一下其他的改动。
如果想看之前的内容,请看:简易新闻App
下一篇:Android使用MaterialDialog优化用户反馈简易新闻(九)
欢迎批评指正与讨论! -
RecyclerView异步加载图片
2019-05-30 23:02:47RecyclerView异步加载图片 如何在不使用第三方图片加载框架的基础上实现RecyclerView和ListView的中实现异步加载图片功能? 简单的方法是我们可以使用LruCache+AsyncTask结合的方式实现。大致思路是在...RecyclerView异步加载图片
如何在不使用第三方图片加载框架的基础上实现RecyclerView和ListView的中实现异步加载图片功能?
简单的方法是我们可以使用LruCache+AsyncTask结合的方式实现。大致思路是在onBindViewHolder()方法中根据key去内存缓存中对应的bitmap,如果找到了就直接显示,如果没有找到就开启一个异步任务去下载这个bitmap,下载完成后存进内存缓存中并执行相应的回调进行展示。1.首先是LruCache的工具类,我们可以这样写:
private static final class CacheHelper{ private static LruCache<String, Bitmap> sLruCache; static { sLruCache = new LruCache<String, Bitmap> ((int)Runtime.getRuntime ().maxMemory ()/4){ @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount (); } }; } }
2.然后是下载图片的异步任务,我们可以这样写:
private static final class ImageTask extends AsyncTask<String, Void, Bitmap> { private Listener mListener; ImageTask(Listener listener) { mListener = listener; } @Override protected Bitmap doInBackground(String... strings) { Bitmap bitmap = getBitmap (strings[0]); CacheHelper.sLruCache.put (strings[1], bitmap); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { mListener.onSuccess (bitmap); } public interface Listener{ void onSuccess(Bitmap bitmap); } private static Bitmap getBitmap(String url){ Bitmap bitmap = null; BufferedInputStream stream = null; URL url1 = null; try { url1 = new URL (url); URLConnection connection = url1.openConnection (); stream = new BufferedInputStream(connection.getInputStream ()); bitmap = BitmapFactory.decodeStream (stream); } catch (MalformedURLException e) { e.printStackTrace (); } catch (IOException e) { e.printStackTrace (); }finally { if (stream != null) { try { stream.close (); } catch (IOException e) { e.printStackTrace (); } } } return bitmap; } }
3.在onBindViewHolder()方法中,展示图片前从缓存中拿,如果没有的话就开启一个异步任务,并指定回调。
@Override public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) { Bitmap bitmap = CacheHelper.sLruCache.get ("ChatRecyclerAdapter" + i); if (bitmap == null) { new ImageTask (new ImageTask.Listener () { @Override public void onSuccess(Bitmap bitmap) { viewHolder.mHead.setImageBitmap (bitmap); } }).execute (chatBean.getImageUrl (), "ChatRecyclerAdapter" + i); }else { viewHolder.mHead.setImageBitmap (bitmap); } }
这样就可以在不依赖第三方框架的情况下实现RecyclerView和ListView的中图片的异步加载。
这里只是一个简单思路,具体使用时候需要考虑RecyclerView和ListView的细节问题。比如在条目不可见时异步任务加载完毕后就不需要在回调显示了,这个可以通过让异步任务持有一个当前RecyclerView或ListView的实例,在onBindViewHolder()方法中给ImageView设置tag,然后通过这个tag找到条目的ImageView,如果为空说明已经不再屏幕中,这样我们就不需要执行显示的回调了。 -
C语言——加载图片
2021-04-18 13:21:36首先创建一个项目,后将要加载的图片放在项目文件下,通过一下代码打开。 #include <graphics.h>//图形库 #include <conio.h>//_getch() int main() { initgraph(1000, 600);//初始化图片 IMAGE ...实现效果如图:
首先创建一个项目,后将要加载的图片放在项目文件下,通过一下代码打开。
#include <graphics.h>//图形库 #include <conio.h>//_getch() int main() { initgraph(1000, 600);//初始化图片 IMAGE picture; // 定义 IMAGE 对象 loadimage(&picture, "background.jpg",1000,600); // 读取图片到 img 对象中,后面数字为加载图片想要的尺寸 putimage(0, 0, &picture); // 在坐标 (0, 0) 位置显示 IMAGE 对象 _getch();//将端口停留在图片界面 closegraph(); return 0; }
-
整理图片延时加载技术,如何优雅的延时加载图片
2018-12-03 10:46:10整理图片延时加载技术,如何优雅的延时加载图片 #什么是延迟加载? 延迟加载是Web和应用程序开发中的一项技术,它们将页面上需要的但是暂时未使用的资源加载延迟到一定的时间点。延迟加载技术有助于提高性能,更好地... -
unity 安卓 www 加载图片
2021-12-16 17:52:02unity 安卓 www 加载图片 -
Android Picasso 无法加载图片
2022-04-20 16:53:221 可能是没有授予网络权限 在AndroidManifest.xml文件的里面加入 2 可以打开Picasso自带的log开关:...图片1")设置加载之前显示的图像 用Picasso.get().load("xxx").error("R.drawable.图片2")设置加载错误时显示的图像 -
关于html中img标签无法加载图片
2021-10-15 18:25:36标签显示图片,但是始终无法加载出图片,显示结果如下: <html><head></head><body> <img src='w3school.jpg' width='104' height='142'/> </body></html> 网上有些... -
浏览器无法加载图片问题解决办法(主要是csdn博客无法加载图片)
2020-11-01 14:15:52今天突然发现自己的csdn无法正常加载图片,但是这个图片是真实存在的(在朋友的电脑上就可以正常显示图片) 解决办法如下: 首先打开电脑控制面板,选择网络和共享中心,选择更改适配器设置 在你的网络上右键选中... -
Android开发之ListView异步加载图片
2015-10-27 22:29:24因为ListView这个控件实在是太常用,可以说基本上每一个项目开发都会用到它,今天这篇博客主要讲解,ListView异步加载图片的问题,相信通过本篇博客的学习你将有意想不到的收获。 如有谬误请批评指正,如有疑问请... -
Android使用okhttp加载图片
2019-02-12 21:09:35效果图如下: 前提:在添加了网络权限及导入了okhttp,okio两个jar包后开始操作,老规矩,在最后有源码。 1.定义一个handler为全局变量,并将其实例化。...3.回到第一步,将指令和消息放入,并加载图片。 ... -
github无法加载图片的解决办法
2020-02-18 22:39:07最近发现我的github上面项目README里面的图片全裂了,一直以为是github最近服务器不稳定。今天通过简单的查询,发现原来这个问题可以解决,但是不能永久有效,之后还会用到,因此记录在这里, 也分享给大家。 解决... -
RecyclerView 滑动时不加载图片,空闲时恢复图片加载
2019-03-14 10:09:19//恢复Glide加载图片 } } else { if ( getActivity ( ) != null ) { Glide . with ( getActivity ( ) ) . pauseRequests ( ) ; //禁止Glide加载图片 } } } } ) ; -
WebGL加载图片
2018-11-15 18:42:50WebGL目前已经被大多数浏览器所支持,但是不同浏览器对图片文件的加载都所以差异。加载文件分为使用web服务器端数据和本地数据两种方式,以下就此问题进行讨论。 关键字(key words) WebGL, Image, Texture, ... -
react-native 加载图片的几种方式
2019-08-07 16:16:20一、RN本地项目图片访问 1.1、通过source——require访问 <Image source={require(’./img/icon.png’)} style={styles.imageStyle}/> 1.1.1、 Image的缩放模式resizeMode cover: 保持图片宽高比缩放直到... -
vue中动态加载图片路径
2020-01-21 13:45:59在vue中加载图片路径跟我们不用框架引入路径是不同,在页面中使用的话,写的路径是可以生效的,但是我们想动态加载图片路径的话是不生效的。 这里有两种方法来解决: 方法一:(推荐) 1、页面上,绑定动态路径... -
使用Glide进行预加载图片
2019-08-27 20:33:311.Glide的预加载api是preload 具体用法为: Glide3 Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).preload(width, height) Glide4 Glide.with(context).load(url).apply(Req... -
python怎么加载图片-python怎么实现添加图片
2020-11-01 12:42:26python怎么实现添加图片,文件,图片,方法,资源,前缀python怎么实现添加图片易采站长站,站长之家为您整理了python怎么实现添加图片的相关内容。一、导入图片资源方法1:直接从源图片中导入(图片位于images文件夹内)... -
Python加载图片并显示
2020-06-15 15:04:19import numpy as np import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读取图片 lena = mpimg.imread('lena.png') # 读取和代码处于同一目录下的 lena.png # 此时... -
Android异步加载图片例子
2012-07-14 00:58:20这是一个Android异步图片加载的例子 -
Glide 无法加载图片,加载图片失效
2018-10-31 09:06:00昨天中午遇到一个很奇葩的bug,glide就是不加载图片,而且不显示占位图片和错误图片,各种调试后还是无果; 我先描述下无法加载图片的场景; 我们的IM聊天页面给我们抛出了一个Adapter的实现接口,实现这个接口后... -
QtableWidget的表格加载图片设置
2019-06-12 14:36:29我知道有两种方法,第一种是图标方法,第二种是lable加载图片 首先构造函数添加需要的参数 ui->tableWidget->setColumnCount(9); //设置列数 ui->tableWidget->horizontalHeader()->... -
RecycView条目布局异步加载图片时错位问题
2021-06-03 18:17:21错位原因: 加载图片时,每个子条目的position有重复的可能 比如每个条目下有10张图片(或者其他资源),那么子条目的position都是0-9; 此时滑动,ru'gu -
python怎么加载图片-python实现读取并显示图片的方法以及实例演示
2020-11-01 13:16:27python实现读取并显示图片python实现读取并显示图片的两种方法在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片。本人偏爱 matpoltlib,因为它的语法更像 matlab。一、matplotlib1. 显示... -
vue 远程加载图片,渲染后处理图片,并让图片自适应大小
2019-04-11 20:32:58首先需要远程加载图片 this.$http.post(tagDataMarketUrl.downloadDetail,datas).then( (response) =>{ //远程加载数据 this.data= response.data; //远程图片 this.img = this.data.img ... -
CachedNetworkImage 无法加载图片,加载图片出错
2019-09-05 19:20:39body: Center( child: CachedNetworkImage( imageUrl: ... ), ), 第一次写Flutter就遇到这么坑的问题,按照官方文档简单编写还是出错 加载图片失败了,看错误信息是无法调用函数,getXXXXX 网上... -
chrome浏览器加载图片失败问题
2020-09-28 15:52:14现象:项目上线后,加载图片是正常的。过了一段时间,部分用户反馈加载图片失败,部分用户加载图片正常。 分析:系统是https的,图片链接为http的。Chrome在80版本后(所以部分用户能看到,部分看不到,版本不同)...