android图片
Luckie stone
Android应用开发。
展开
-
android View/Viewgroup截图
public static Bitmap loadBitmapFromViewBySystem(View v) { if (v == null) { return null; } v.setDrawingCacheEnabled(true); v.buildDrawingCache(); Bitmap bitmap = v.getDrawi...原创 2019-12-29 17:10:05 · 449 阅读 · 0 评论 -
MediaStore.Images.Media.insertImage保存图片
MediaStore.Images.Media.insertImage保存图片会生成了两张内容一样的图片,一张是以我们设置的命名方式命名的(具体步骤可以查看insertImage用法),另一张则是系统帮我们生成的根据当前时间命名的缩略图。生成的图片是jpg的。要保存png格式的图片可复制insertImage函数的源码,将MediaStore.Images.Media.MIME_TYPE, "i...原创 2019-12-29 16:58:33 · 4042 阅读 · 1 评论 -
android将控件的内容保存为Bitmap
public Bitmap createViewBitmap(View v) { Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); v.draw(canvas); ret...原创 2019-11-02 10:01:06 · 443 阅读 · 0 评论 -
Android本地绝对路径显示图片
使用Uri来完成ImageView.setImageUri(Uri.fromFile(new File("/sdcard/test.jpg")));原创 2019-10-30 06:49:57 · 3906 阅读 · 0 评论 -
为什么 Android 上 Canvas 画出的图形不够平滑?
通过 Google 搜索我们很快就能找到这个在 StackOverflow 中被问了很多次的问题,同时答案也经常是相同的:你需要给你的 Paint 对象设置 ANTI_ALIAS_FLAG 属性。但对于大多数人来说这并不能解决问题。下面我讲讲原因。在 Canvas 上绘制若你需要在 Canvas 上绘制,你有两种选择。直接在 Canvas 上绘制。 先在 Bitmap 上绘制再将 B...转载 2019-01-21 06:23:25 · 597 阅读 · 0 评论 -
Glide源码分析(一),基本加载代码流程
下面来看在Glide中最简单的图片加载代码 Glide.with(this) .load("https://p.upyun.com/docs/cloud/demo.jpg") .into(imageView);这应该是相对比较简单的加载图片的代码了,一步步来,看代码其实很讲究耐心,有时候会遇到很多层次的调用链,...转载 2019-06-12 06:30:36 · 227 阅读 · 0 评论 -
Glide源码分析(二),基本加载类图介绍
经过前文Glide源码分析(一),基本加载代码流程的分析之后,想必大家还是有点云里雾里,这里我画出了Glide基本加载流程中涉及到的类以及它们之间的关系,帮助大家更好的理解这个过程。Glide基本加载过程设计到的主类和关系图如下:1.GlideGlide这个类是使用图片加载库的入口类,诸如很多第三方Sdk,都用到了外观模式,通过设计一个顶层的接口,供用户使用,减少用户的学习成...转载 2019-06-12 06:30:42 · 208 阅读 · 0 评论 -
Glide源码分析(三),Engine加载资源过程
通过前面的分析,我们知道真正去加载数据是在SingleRequest#onSizeReady方法中被触发,这个里面是调用了Engine#load方法,看到这个方法,我们大致可以猜到此时便开始去真正加载数据了,从缓存中读取或者是从网络获取等等。在开始之前,我们先简单了解一下Engine类中涉及到的一些类。仍然以最简单的load方式为例子 Glide.with(this) ...转载 2019-06-12 06:30:49 · 372 阅读 · 0 评论 -
Glide源码分析(四),DecodeJob执行过程
开始本文之前,DecodeJob它实现了Runnable接口,敏感的朋友可能已经意识到,加载代码的入口就在这里,会在一个新的线程中去加载资源。DecodeJob这个类的代码非常多,主要有以下几个重要的点。 封装一些从上面传过来的参数信息,不知道是否还有印象,我们的glide大部分信息是通过前面RequestBuilder中得到的。这里,它内部构造了一个DecodeHelper类,封装了大部分...转载 2019-06-12 06:30:55 · 153 阅读 · 0 评论 -
数据加载DataFetcher与ModelLoader结构
UML如下:glide数据加载模块,基本结构如上图所示,DataFetcher定义了取数据的接口,具体的通过何种方式取数据,网络还是本地,均是由其子类实现,接下来我们介绍DataFetcher的几个子类。ModelLoader是一个工厂接口,用于将任意复杂的数据模型转换为具体数据类型,从而能够使用DataFetcher去获取由该模型表示的资源的数据,具体的ModelLoader实现类会根据...转载 2019-06-13 06:37:22 · 342 阅读 · 0 评论 -
DataFetcherGenerator结构
UML如下:DataFetcherGenerator 使用已注册的ModelLoaders{@link com.bumptech.glide.load.model.ModelLoader}和一个模型构造一系列的DataFetchers{@link com.bumptech.glide.load.data.DataFetcher}。 FetcherReadyCallback 当gene...转载 2019-06-13 06:37:32 · 175 阅读 · 0 评论 -
DecodeJob结构
DecodeHelper 将DecodeJob中的部分属性,交由DecodeHelper进行管理和操作,使代码更加清晰。关于详细,参考DecodeHelper类相关方法分析 DiskCacheProvider 内部返回了一个DiskCache的对象,具体的默认实现是DiskLruCacheWrapper。关于DiskCache详细结构,可以参考此文DiskCache结构。 Deferred...转载 2019-06-13 06:34:21 · 116 阅读 · 0 评论 -
DecodeHelper类相关方法分析
DecodeHelper类中,调用的方法,涉及到的东西比较多,最主要的是包括管理组件注册以扩展或替换Glide的默认加载,解码和编码逻辑的Registry类。在Glide类的构造方法中,如下: Glide( @NonNull Context context, @NonNull Engine engine, @NonNull MemoryCache memo...转载 2019-06-13 06:37:42 · 124 阅读 · 0 评论 -
Glide原理(三):图片解析处理、ImageView保证大小
Glide 怎么判断解析图片的Glide 怎么保证ImageView宽高?Glide 怎么判断图片旋转角度以上三个问题是我自己在做一个图片池遇到的问题,趁机好好学习GlideGlide解码的类在 Downsampler中,它的注释上写着:Downsamples, decodes, and rotates images according to their exif orient...转载 2019-06-16 07:48:01 · 1676 阅读 · 0 评论 -
Glide原理分析(二):Engine加载流程
上一篇文章《Glide原理解析(一):加载流程分析》主要大致地分析了Glide加载图片的整体流程,这一篇主要解决的上一篇遗留的一个问题:Glide Engine 如何加载图片,内部涉及到Glide的缓存模块上篇文章在SingleRequest中获取到了ViewTarget的宽高之后(假定是ImageView),onSizeReady()调用了engine的load()方法loadSt...转载 2019-06-16 07:47:54 · 519 阅读 · 0 评论 -
You must not call setTag() on a view Glide is targeting的解决方案
概述在使用Glide加载图片时,如果出现“You must not call setTag() on a view Glide is targeting”的错误,八成是在使用ListView的时候出现的。简单来说就是原本想简化布局文件的代码,但是很不幸,这样做却会造成错误。解决方案1如果出错了,你的item八成是这个样子:<?xml version="1.0" encoding=...转载 2019-04-13 10:30:29 · 835 阅读 · 0 评论 -
Glide类似You cannot start a load for a destroyed activity异常简单分析
最近在做项目时,使用Glide加载网络图片时,碰到了 You cannot start a load for a destroyed activity 这个异常;场景描述:点击进入一个Activity 当中请求网络 请求成功后 根据服务器返回的图片URL使用Glide来加载网络图片 ,当点击进入activity 加载网络过程中 退出activity 会报此错今天有时间就索性研究下这个问题,...转载 2019-05-11 18:00:11 · 2320 阅读 · 0 评论 -
Glide源码分析(一)——DiskLruCache磁盘缓存的实现
Glide磁盘的实现主要是通过DiskLruCache来实现的。DiskLruCache并非针对Glide编写的,而是一个通用的磁盘缓存实现,虽然并非Google官方的代码,但是已经在很多应用中得到了引入使用。journal日志DiskLruCache通过日志来辅助保证磁盘缓存的有效性。在应用程序运行阶段,可以通过内存数据来保证缓存的有效性,但是一旦应用程序退出或者被意外杀死,下次再启动的时...转载 2019-06-15 07:35:32 · 662 阅读 · 0 评论 -
Glide源码分析(二)——磁盘缓存实现
Glide中默认磁盘缓存实现的入口为DiskLruCacheFactory,DiskLruCacheFactory提供了几个接收不同参数的构造函数,以允许指定缓存文件的位置和磁盘缓存的大小。其中比较有意思的是,在构造函数中DiskLruCacheFactory并没有立即构建缓存的File,而是在build函数执行的时候才开始构建缓存File,这算是懒加载的一种吧,即在真正需要使用到缓存的时候才去申...转载 2019-06-15 07:35:40 · 306 阅读 · 0 评论 -
Glide源码分析(三)——图片缓存相关实现
LruBitmapPoolGlide实现bitmap缓存的实现类。其缓存功能实现的核心依赖于两个类:SizeConfigStrategy和AttributeStrategy,在API 19之前,使用AttributeStrategy,之后使用SizeConfigStrategy。两种strategy在缓存的功能实现上是一致的,SizeConfigStrategy只是在获取缓存的时候,不严格要求缓...转载 2019-06-15 07:35:47 · 269 阅读 · 0 评论 -
Glide源码分析(四)——Registry机制
Registry是Glide内部实现的模块挂接中心,它建立了功能需求和实现模块之间的映射关系,使这些模块能够根据需求进行灵活的挂载,模块和模块之间又相互独立互不影响,很好地实现了系统功能的解耦。在Registry内部,提供了对如下几种类型模块的挂载支持:/*** 数据加载模块*/private final ModelLoaderRegistry modelLoaderRegist...转载 2019-06-15 07:35:57 · 382 阅读 · 0 评论 -
Glide源码分析(五)——ModelLoader机制
ModelLoaderRegistryModelLoaderFactory和MultiModelLoaderFactoryModelLoaderFactory是一个工厂类接口,实现类使用它的接口来对外构建不同了类型的modelLoader,它的实现类一般是不同类型的ModelLoader的内部类,例如ByteArrayLoader内部就实现了两个ModelLoaderFactory,分别生成能...转载 2019-06-15 07:36:04 · 290 阅读 · 0 评论 -
Glide源码分析(六)——从DecodeJob相关实现看图片加载流程
DecodeJob是集数据加载、解析和回调通知于一体的包装内,它在内部根据配置的不同情况将相关的工作委托给不同的类来实现,是Glide内实现数据加载功能的中枢。首先来看其中会用到的几个比较重要的类。LocalPath和DecodePathDecodePath内部保存有两个主要的成员,一个是由ResourceDecoder组成的解码器集合,用来从指定的数据源中解码数据;另一个是Resource...转载 2019-06-15 07:36:11 · 449 阅读 · 0 评论 -
Glide原理解析(一):加载流程分析
Glide 使用很简单:Glide.with(Context).load(url).into(View)所以,分成三个流程进行分析:1. with // Glide.java public static RequestManager with(@NonNull Activity activity) { return getRetriever(activity).g...转载 2019-06-16 07:47:47 · 1059 阅读 · 0 评论 -
DiskCache结构
UML如下:DiskCache 定义了从磁盘缓存中写入和读取的接口。 DiskLruCache 基于文件系统的一个有限空间的缓存,每一个缓存项都有一个字符串的键和一个固定数量的值,每个键必须匹配正则表达式([a-z0-9_-]{1,120})。值可以是字节序列,随机流或者文件。内部也是基于LRU算法,底层由LinkedHashMap实现。 Factory DiskCache工厂接...转载 2019-06-13 06:33:37 · 994 阅读 · 0 评论 -
Key结构
UML如下: Key 唯一标识一些数据的接口。实现必须实现{Object#equals(Object}和{Object#hashCode()}。 通常希望实现将所有在{@link java.lang.Object#equals(Object)}}和{@link Object#hashCode()}}中使用的唯一标识信息添加到给定的{@link java.security.Message...转载 2019-06-13 06:33:49 · 278 阅读 · 0 评论 -
Glide源码分析(五),EngineJob与DecodeJob代码详细加载过程
在Glide源码分析(三),Engine加载资源过程文中,我们分析到Engine#load的最后一步,创建好了一对EngineJob和DecodeJob,随之调用EngineJob的start方法,启动加载任务。下面分析整个一个执行过程,文中相关情景下的方法特定调用的结果是还是基于一下这段code,虽然是由特殊入口,并不影响我们理解整个框架,反而是一个很好的突破口,理解代码的思想。示例代码如下:...转载 2019-06-12 06:31:02 · 284 阅读 · 0 评论 -
Android图片加载框架Picasso最全使用教程5
在之前的四篇博客中,我们学习了所有的关于Picasso的主要方法,我们也对这个Picasso有了一个很深的认识,下面就主要对Picasso自身进行分析,这样的话,会让我们更了解Picasso的核心方法;创建一个PicassoPicasso有一个直接的方法去创建一个它的实例,就是Picasso.Builder,这样可以创建属于我们自己的Picasso,而不是使用一个标准的Picasso;...转载 2019-07-18 06:50:18 · 121 阅读 · 0 评论 -
Android图片加载框架之Picasso
相信做Android开发的对Square公司一定不会陌生,大名鼎鼎的网络请求框架Retrofit就来源于它,今天学习的是该公司出品的图片加载框架Picasso。项目地址https://github.com/square/picasso使用说明http://square.github.io/picasso/Gradle:compile 'com.squareup.picas...转载 2019-07-18 06:52:40 · 156 阅读 · 0 评论 -
picasso使用方法与原理分析(一)
前言安卓开源的图片加载框架有很多。最初的imageloader(目前已经不再维护),目前的picasso, glide。picasso和glide在加载展示图片这个模块其实相似度蛮高,谷歌也在很多项目中使用了glide。但这并不是说glide就在任何项目都是最适合的,我们必须在理解每个框架的原理的基础上选择适合我们的框架。接下来的几篇文章会通过分析picasso与glide的使用方...转载 2019-07-18 07:05:10 · 702 阅读 · 0 评论 -
picasso使用详解与原理(二)
前言上一篇博客picasso使用详解(一)详细介绍了picasso的各种使用方法与他的一些特性,这次从源码的角度详细讲解他的流程和原理。它的整体流程可以分为2个部分,一个是设置加载条件,确定需要展示的图片的各种属性,第二是加载然后对图片进行实际的处理,然后显示到目标对象上。流程简介picasso加载图片的整体流程其实可以看成是事件分发的机制,首先通过设置url与其他属...转载 2019-07-18 07:13:30 · 290 阅读 · 0 评论 -
Picasso(2) - 自定义配置
Builder 建造者模式正常情况引入第三方框架, 直接使用的不多。很多时候要根据项目来对第三方框架做额外的配置 。Picasso 采用建造者模式进行额外的配置。Picasso 的 Builder :ContextPicasso 建造者模式必须指定 Context 。但是你还记得旧版本 Picasso 是怎么调用的吗 ? 旧版本的 Picasso 每次调用都需要指定 Con...转载 2019-07-27 10:00:42 · 396 阅读 · 0 评论 -
Picasso(3) - 图片加载流程
问题直接上代码,大家一定会看的一头雾水,那我们先来引入几个问题。我们使用图片框架的最终目的是什么?是为了获取 Bitmap 对象 。如何描述从不同位置加载图片 ? 例如从网络、磁盘、asset 、相册等。 如何描述图片的加载样式?(裁剪、居中、旋转等)因此需要构造一个请求对象 - Request 。图片加载完后,交给谁来显示 ?大多数情况下交给 ImageView , 但有的...转载 2019-07-27 10:12:26 · 413 阅读 · 0 评论 -
Picasso(4) -Dispatcher
什么是 DispatcherDispatcher 是 Picasso 用于分发事件 、线程切换的类。Dispatcher 分发的事件REQUEST_SUBMIT = 1; // 请求提交REQUEST_CANCEL = 2; // 请求取消REQUEST_GCED = 3; ...转载 2019-07-27 10:23:31 · 123 阅读 · 0 评论 -
Android图片加载神器之Fresco,基于各种使用场景的讲解
Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库。优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理和强大的功能,基本上能满足所有的日常使用场景。缺点:整体比较大,不过目前的版本已做了拆分,你只需要导入你使用到的功能相关的库。从代码层面来说侵入性太强,体现在要使用它需要用Fresco的组件Si...转载 2019-07-27 11:13:30 · 1118 阅读 · 0 评论 -
Android图片加载框架Picasso最全使用教程4
通过前几篇的学习,我们已经对Picasso的加载图片的用法有了很深的了解,接下来我们开始分析Picasso为我们提供的其他高级功能及内存分析,Let’sGo!Picasso进行图片的旋转(Rotation)简单的旋转,只需要增加一个角度即可,调用rotate(float degrees)当我们对一张图片需要进行简单的旋转处理时,只需要调用传入旋转的角度,大于0小于360即可,上代...转载 2019-07-18 06:49:17 · 171 阅读 · 0 评论 -
Android图片加载框架Picasso最全使用教程3
前面我们对Picasso的用法有了一定得了解,下面就分析一下一些特殊情况下,Picasso的用法.调用.noFade() Picasso的默认图片加载方式有一个淡入的效果,如果调用了noFade(),加载的图片将直接显示在ImageView上Picasso .with(context) .load(UsageExampleListViewAdapter.eatFoo...转载 2019-07-18 06:47:34 · 191 阅读 · 0 评论 -
Android图片加载框架Picasso最全使用教程2
前言 前面我们已经介绍了Picasso的基本用法及如何将一张图片加载到ImageView中,下面我们就利用Picasso在ListView中加载图片;Let’sGo!一个ListView的简单应用示例1: 首先,需要先准备好一些网络图片资源public static String[] imageUrls = { "http://i.imgur.com/...转载 2019-07-18 06:46:12 · 115 阅读 · 0 评论 -
Glide源码分析(六),缓存架构、存取命中分析
分析Glide缓存策略,我们还得从之前分析的Engine#load方法入手,这个方法中,展示了缓存读取的一些策略,我们继续贴上这块代码。Engine#loadpublic <R> LoadStatus load( GlideContext glideContext, Object model, Key signature, in...转载 2019-06-12 06:31:08 · 168 阅读 · 0 评论 -
Glide源码分析(八),Glide的自定义模块扩展与实践
Generated APIGlide v4使用注解处理器(Annotation Processor)来生成出一个API,在Application模块中可使用该流式API一次性调用到RequestBuilder,RequestOptions和集成库中所有的选项。GeneratedAPI模式的设计出于以下两个目的:集成库可以为Generated API扩展自定义选项。 在Applicat...转载 2019-06-12 06:31:24 · 703 阅读 · 0 评论