20、长图的加载显示

[size=medium] 有时候图片很长,预览只是其一部分,有个类似按钮点击之后加载全图并显示,类似于GIF的加载显示。

ListAdapter中:[/size]

else if("lmg".equals(data.type)){
Drawable drawable=lmgload.loadImage(viewparent,tagpre,data.dataurl,null);
if(drawable!=null){
LayoutParams lp=holder.rl_data.getLayoutParams();
lp.height=itemwidth*drawable.getMinimumHeight()/drawable.getMinimumWidth();
holder.rl_data.setLayoutParams(lp);
if(holder.tv_lmgctrl!=null){
holder.tv_lmgctrl. setVisibility(View.GONE);
holder.rl_data. removeView(holder.tv_lmgctrl);
}
holder.rl_data.setBackground(drawable);
holder.rl_data.setVisibility(View.VISIBLE);
}
else{
LayoutParams lp=holder.rl_data.getLayoutParams();
lp.height=itemwidth*data.height/data.width;
holder.rl_data.setLayoutParams(lp);

holder.rl_data.setTag(tagpre);
Drawable pre=imgload.loadImage(viewparent,tagpre,data.preurl,ilcallback);
holder.rl_data.setBackground(pre);

if(holder.tv_lmgctrl!=null){
holder.rl_data.removeView(holder.tv_lmgctrl);
}

RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
holder.tv_lmgctrl=new TextView(activity);
holder.tv_lmgctrl.setText("点击查看全图");
holder.tv_lmgctrl.setGravity(Gravity.CENTER_HORIZONTAL);
holder.tv_lmgctrl.setTextColor(activity.getResources().getColor(R.color.white_dark));
holder.tv_lmgctrl.setTextSize(TypedValue.COMPLEX_UNIT_PX,activity.getResources().getDimension(R.dimen.text_level1));
holder.tv_lmgctrl.setBackgroundResource(R.color.black_normal_88);
int padding=(int)activity.getResources().getDimension(R.dimen.padding_n);
holder.tv_lmgctrl.setPadding(padding,padding,padding,padding);
lp1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
holder.tv_lmgctrl.setLayoutParams(lp1);
holder.tv_lmgctrl.setTag(tagctrllmg);

holder.rl_data.addView(holder.tv_lmgctrl);

OnClickListener listener=new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
v.setOnClickListener(null);
((TextView)v.findViewWithTag(tagctrllmg)).setText("全图加载中...");
lmgload.loadImage(viewparent,tagpre,data.dataurl,llcallback);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
holder.pb_load=new ProgressBar(activity,null,android.R.attr.progressBarStyleSmall);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
holder.pb_load.setLayoutParams(lp);
holder.pb_load.setTag(tagloadlmg);
holder.rl_data.addView(holder.pb_load);
}
};

holder.rl_data.setOnClickListener(listener);
holder.rl_data.setVisibility(View.VISIBLE);
}
}

[size=medium] 图片加载完成的回掉函数:[/size]

private LmageLoadCallback llcallback=new LmageLoadCallback() {
@SuppressLint("NewApi")
@Override
public void onSuccess(Drawable drawable, int tag, View viewParent) {
// TODO Auto-generated method stub
if(drawable!=null){
RelativeLayout rl_data=(RelativeLayout)(viewParent.findViewWithTag(tag));
if(rl_data!=null){
LayoutParams lp=rl_data.getLayoutParams();
lp.height=itemwidth*drawable.getMinimumHeight()/drawable.getMinimumWidth();
rl_data.setLayoutParams(lp);
rl_data.setBackground(drawable);
rl_data.findViewWithTag(tag+1).setVisibility(View.GONE);
rl_data.findViewWithTag(tag-1).setVisibility(View.GONE);
}
}
}
};

[size=medium] 长图加载的类与图片加载的类相同:[/size]
public class LmageLoad {

private Context context;

private Map<String, Drawable> imageMap;
private ThreadPoolExecutor executor = null;
BlockingQueue<Runnable> queue =null;

private String path=Environment.getExternalStorageDirectory()+"/Dp Notes/Cache/LonImage";
private int threadMaxNum=Runtime.getRuntime().availableProcessors()>1?Runtime.getRuntime().availableProcessors():2;
private int cacheMaxNum=1;


@SuppressLint("NewApi")
public LmageLoad(Context context){
this.context=context;

imageMap=new LinkedHashMap<String, Drawable>();
queue =new ArrayBlockingQueue<Runnable>(this.threadMaxNum);
executor=new ThreadPoolExecutor(this.threadMaxNum,this.threadMaxNum,1,TimeUnit.MINUTES,queue,new ThreadPoolExecutor.CallerRunsPolicy());

// File dir=new File(this.path);
// if(!dir.exists()){
// dir.mkdirs();
// }
}

public void setcacheMaxNum(int maxNum){
this.cacheMaxNum=maxNum;
}

public Drawable loadImage(final View viewParent,final int viewTag,final String imageUrl,final LmageLoadCallback callback){

if (imageMap.containsKey(imageUrl)) {
Drawable drawable=imageMap.get(imageUrl);

return drawable;
}
if(callback==null){
return null;
}
// int index=imageUrl.lastIndexOf("/");
// index=index>=0?index:0;
// String filename=imageUrl.substring(index);
// final String filepath=path+filename+".0";
//
// final File mf=new File(filepath);
// if(mf.exists()){
// Bitmap bitmap=BitmapFactory.decodeFile(filepath);
// BitmapDrawable draw=new BitmapDrawable(context.getResources(),bitmap);
// if(draw!=null){
// imageMap.put(imageUrl,draw);
// chackMapSize();
// return draw;
// }
// }
imageMap.put(imageUrl,null);

final Handler handler = new Handler() {

@SuppressLint("HandlerLeak")
public void handleMessage(Message message) {
if(callback!=null){
if(message.what==1){
callback.onSuccess((Drawable) message.obj,viewTag,viewParent);
}
}
}
};

executor.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
URL url = null;
InputStream inputStream = null;
try {
url = new URL(imageUrl);
inputStream = url.openStream();
Drawable drawable = Drawable.createFromStream(inputStream, "src");

Message message;
message=handler.obtainMessage(1,drawable);
handler.sendMessage(message);

if(drawable!=null){
imageMap.put(imageUrl,drawable);
}
else{
imageMap.remove(imageUrl);
}
chackMapSize();

// if(drawable!=errorDrawable){
// try {
// if(!mf.exists()){
// try {
// mf.createNewFile();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// FileOutputStream fout=new FileOutputStream(mf);
// Bitmap bitmap=((BitmapDrawable)drawable).getBitmap();
// bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null)
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});

return null;
}

private void chackMapSize(){

if(imageMap.size()>cacheMaxNum){
for(Entry<String, Drawable> m:imageMap.entrySet()){
imageMap.remove(m.getKey());
break;
}
}

}

public interface LmageLoadCallback {
public void onSuccess(Drawable drawable,int tag,View viewParent);
}

}

[size=medium] 容易理解,运行:[/size]
[img]http://dl2.iteye.com/upload/attachment/0125/3716/c02b0d71-838c-3b94-a040-ae94f32d0072.gif[/img]
[color=gray][size=medium]注:这是一个.gif动图,ctrl点击图片查看[/size][/color]
[size=medium]
当GIF图片滑动出屏幕时,暂停,需要之前的QRecyclerListener了:[/size]

public ListAdapter(Activity activity,QListView listview){

…
listview.setQRecyclerListener(rclistener);
}

private QRecyclerListener rclistener=new QRecyclerListener() {

@Override
public void onMovedToScrapHeap(View view) {
// TODO Auto-generated method stub
Holder holder=(Holder)view.getTag();
if(holder!=null&&holder.rl_data!=null){
if(holder.tv_lmgctrl!=null){
holder.rl_data.removeView(holder.tv_lmgctrl);
holder.tv_lmgctrl=null;
}
if(holder.giv_data!=null){
holder.rl_data.removeView(holder.giv_data);
holder.giv_data=null;
}
if(holder.tv_gifctrl!=null){
holder.rl_data.removeView(holder.tv_gifctrl);
holder.tv_gifctrl=null;
}
if(holder.pb_load!=null){
holder.rl_data.removeView(holder.pb_load);
holder.pb_load=null;
}
}
}
};

[size=medium] 在Item滑出屏幕的监听器中,将动态添加的GifImageView、按钮、进度条移除就可以了。[/size]

[align=right][size=medium]路在脚下——2017/06/10[/size][/align]
ArcGIS API For Javascript之地图基本加载与显示,地图切换、缩放、定位、比例尺、鹰眼图、坐标显示、查询搜索功能实现 ArcGIS API For Javascript之地图加载与显示 阅读详情

相关推荐

OpenLayers入门,OpenLayers如何监听加载事件和加载完成事件来实现加载瓦片时显示动图转圈加载进度条(loading spinner),加载完成后隐藏

本章使用OpenLayers的加载事件和加载完成事件来简单实现转圈动图,加载进度条来显示OpenLayers瓦片的加载情况。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 1641

flutter 查看长图大图,可以滚动查看长图

【代码】flutter 查看长图大图,可以滚动查看长图。

m0_62359005的博客 533

Flutter中网络图片加载和缓存的实现

主要介绍了Flutter中网络图片加载和缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

flutter学习之图片显示

flutter图片资源可以放在项目中的任意文件夹下面,之后需要再pubspec.yaml文件夹中add这个图片的目录 框框中图片a在项目根目录的assets文件夹下 该文件夹下创建之文件夹n.0x表示图片的倍率   显示一张本地图片 class MyApp extends StatelessWidget { @override Widget build(BuildConte...

owenli2015的博客 5196

flutter 截长图 并且保存到手机相册(目前只有android )

flutter 截长图

从零开始:用ADS仿真设计一个2.4GHz Wi-Fi低噪声放大器(含完整电路图)

本文提供了一份详细的ADS软件仿真指南,手把手教你从零开始设计一个2.4GHz Wi-Fi低噪声放大器。内容涵盖核心指标理解、晶体管选型与建模、匹配网络设计、偏置电路集成,并通过S参数仿真、噪声优化及线性度验证等步骤,最终呈现完整的优化电路图,助力射频初学者掌握LNA设计全流程。

weixin_29197835的博客 807

flutter photo_view预览长图时的显示问题

需求:点开图片详情时直接显示大图,并自动定位到长图顶部。 解决方法: 1、photo_view: ^0.9.2 2、 PhotoViewGallery.builder( scrollPhysics: const BouncingScrollPhysics(), builder: (BuildContext context, int index) { return PhotoViewGalleryPageOptions.customChild( child: Contai

qq_28030029的博客 2381

MIL-STD-1553B协议解析与工程实践指南

MIL-STD-1553B作为军用航空电子系统的核心通信协议,采用命令/响应式串行总线架构,通过双冗余设计实现高可靠性数据传输。该协议定义了三类终端设备(总线控制器、远程终端、总线监视器)和六种标准消息格式,典型应用包括飞行控制系统、导航设备等关键航电组件的实时数据交互。深入解析模式代码机制和状态字位域定义,其中传输向量字(10000)和同步命令(00001)等关键指令在分布式系统时间对齐、故障诊断等场景发挥重要作用。工程实践中需特别注意78Ω终端阻抗匹配、4-12μs响应时间窗口等硬性指标,结合变压器耦合

weixin_33431149的博客 436

flutter展示图片

一:相关配置 ,如上图所示,在根目录同级的地方,添加相关文档夹,然后在pubspec.yaml 这个文件写如下内容 assets: - images/show.jpg - images/2.0x/show.jpg - images/3.0x/show.jpg 该内容用来配置本地的图片的路径 二:代码 1,正常展示图片 // ignore: file_names //展示正常的图片 import 'dart:ui'; import 'package:...

qq_34790227的博客 4115

fastadmin云快充充电桩系统部署文档uniapp

多商户 嘎嘎快充V1.0部署文档 一、服务器环境: 服务器配置4核心8GB内存5M带宽以上配置 VX next1402 只支持linux环境 nginx1.22 php7.2 开启redis、fileinfo扩展,关闭禁用workerman gatewayworkerman需要的函数,如pcntl相关的函数 mysql5.7 supervisor redis 注意: 1.站点必须配置https、websocket配置wss 2.注意开放直连服务端口:2024,并添加到安全组 二、必

itholiday2014的博客 1632

MIPI DSI2接口开发避坑指南:以RK3576的GM8775C桥接芯片调试为例

本文以RK3576平台搭配GM8775C桥接芯片为例,深入剖析MIPI DSI2接口开发中的常见问题与解决方案。文章详细解读了从U-Boot阶段到内核DRM驱动架构的完整显示通路构建,重点分享了电源时序管理、寄存器配置与硬件协同调试等实战经验,为嵌入式显示系统开发者提供了一套系统化的避坑指南和调试方**。

weixin_29290379的博客 329

android 加载大长图,android加载长图片的方法

1.很多应用都有加载一张长图片,用户可以上下拉动图片。自己没有好的想法,那只好百度咯。结果都说用webview来实现,好吧那就只好先试一下了。2.自己写了简单的html,然后webview加载。图片可以成功显示,但是因为图片太大了,webview需要左右上下拉动才能看到完整的图。好吧,html应该也可以适配手机的宽度吧。奈何不会html啊,那只好再求助度娘了。找到一个css文件,可以用来做html...

weixin_30320587的博客 680

ESP32S3开发实战:从Vscode+IDF环境配置到OpenOCD单步调试全流程

本文详细介绍了ESP32S3开发环境的完整搭建流程,重点讲解如何在Vscode中配置ESP-IDF开发框架,并利用OpenOCD工具实现硬件单步调试。内容涵盖从环境准备、工程创建、代码烧录到高级调试技巧的全方位实战指南,旨在帮助开发者快速掌握ESP32S3的高效开发与调试方法。

weixin_29168813的博客 211

android 显示微博长图,Android加载长图,仿微博长图滚动查看

package org.wandcf_ces.fairproject.widgets;import android.annotation.TargetApi;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Colo...

weixin_30258621的博客 509

QuickFix Java 讲解(一)概述、下载方法,和协议内容

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收法平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 1. 什么是FIX,QuickFix,Quick Java? 1.1. 什么是FIX 官网以及其他翻译自官网的帖子都太官方了,这里我们设想一个情景: 你是一个交易员,现在客户打电话来让你下个单买点股票。你啪啪啪的在你的机器上熟练地输入了下单指令。系统显示:成...

4574

DDS协议--[第一章][概述]

Data Distribute Service,数据分发服务:数据分发服务(DDS™)是一个由对象管理组(OMG)发布的以数据为中心的中间件协议和API标准。DDS集成系统中的各个组件,提供低延迟数据连接、高可靠性以及高可扩展体系结构,以适应商业级物联网(IoT)应用程序的需求。

qq_41816308的博客 1153

终极指南:如何使用Glide实现Android长图加载的内存与性能平衡

Glide是一款专注于流畅滚动的Android图片加载和缓存库,能够有效解决OOM(内存溢出)问题,实现长图加载时的内存与性能平衡。本文将为你介绍Glide在长图加载方面的核心功能和实战技巧,帮助你轻松应对Android应用中的图片加载挑战。 ## 为什么选择Glide处理长图加载? 在Android开发中,长图加载常常面临内存溢出和性能下降的问题。Glide作为一款优秀的图片加载库,通过以下

gitblog_00888的博客 459

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

csv 20位数据 如何打开可以预览完整数字_Excel中输入长数字并完整显示,及公式返回的结果显示为长数字...

Excel允许最多显示11位数字。如果输入的数字超过11位,则自动用科学记数法表示。如果输入的数字超过15位,则从第16位开始的所有数字都将转换为0,并且无法恢复。那么如何在Excel中输入长数字呢?Excel支持在一个单元格中输入多个文本。您可以通过将长数字显示为文本来输入长数字。除了输入长数字(大数字),有时公式还返回长数字。一个超过15位的长数字怎么能完全显示出来?在这种情况下,需要使用函数...

weixin_39775029的博客 3160

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android加载长图宽度自适应,Android仿微博加载长图滚动查看效果

本文实例为大家分享了Android加载长图片的具体代码,供大家参考,具体内容如下解决步骤1.将图片缩放到与控件等宽2.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置的是1.5倍),认定为长图,可滑动查看图片|-如果高度小于控件高度的1.5倍,以控件高度为基准,重新缩放图片package org.wandcf_ces.fairproject.widgets;import android.a...

weixin_30976429的博客 420

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android加载长图片的方法

1.很多应用都有加载一张长图片,用户可以上下拉动图片。 自己没有好的想法,那只好百度咯。结果都说用webview来实现,好吧那就只好先试一下了。 2.自己写了简单的html,然后webview加载。图片可以成功显示,但是因为图片太大了,webview需要左右上下拉动才能看到完整的图。 好吧,html应该也可以适配手机的宽度吧。奈何不会html啊,那只好再求助度娘了。找到一个css文件,可以用

u012157513的专栏 768

Echarts饼图显示数值和百分比

Echarts 饼图显示名称,数值和百分比 核心: series : [ {   name:'',   type : 'pie',   radius : '65%',   center : [ '50%', '50%' ],   //重点   label : {     normal : {       formatter: '{b}:{c}: ({d}%)',       textStyle ...

yayayu_的博客 5万+

Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(5)

遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。2、现在分别使用缩略图内存缓存和正图内存缓存,感觉应该可以合并,只使用一套内存缓存。

Zhang Phil 1412

长图的展开与收起(Android)

前言: 在app的文章中,经常会夹杂着一些特别长的长图。在阅读的时候需要滑动很久才能看图片下方的文字,因此对于长图只展示图片上面一部分,并且可以展开这个功能是很重要的。 效果: 基本思路: 利用scaleType的matrix属性以及直接改变图片的高度来实现图片的收起与展开。 过程: 开始尝试: scaleType属性介绍: center:保持原图的大小,显示在ImageV...

weixin_30251587的博客 370

Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(4)

遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。2、现在分别使用缩略图内存缓存和正图内存缓存,感觉应该可以合并,只使用一套内存缓存。

Zhang Phil 1170
上一篇: 18、ListView显示图片
下一篇: 19、GIF动图显示
zdphpn
博客等级 码龄15年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值