2017年1月16日 星期一

Android Glide 用法



Glide.with(context)
        .load(picUrl)
        .placeholder(default_pic)
        .skipMemoryCache(skipMemory)
        .diskCacheStrategy(diskCacheStrategy)
        .crossFade(animation, duration)
        .into(ivShowPic);

使用crossFade()

無論你是在加載圖片之前是否顯示一個佔位符,改變ImageView的圖片在你的UI中有非常顯著的變化。一個簡單的選項是讓它改變是更加平滑和養眼的,就是使用一個淡入淡出動畫。Glide使用標準的淡入淡出動畫,這是(對於當前版本3.6.1)默認激活的。如果你想要如強制Glide顯示一個淡入淡出動畫,你必須調用另外一個建造者:
Glide
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.ic_launcher) // can also be a drawable
    .error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
    .crossFade()
    .into(imageViewFade);
crossFade()方法還有另外重載方法.crossFade(int duration)如果你想要去減慢(或加快)動畫,隨時可以傳一個毫秒的時間給這個方法。動畫默認的持續時間是300毫秒。

这也容易知道 Glide 将会默认将所有的图片资源放到内存缓存中去。因为,指明调用 .skipMemoryCache(false) 是没有必要的。
提示:注意一个事实,对于相同的 URL ,如果你的初始请求没调用 .skipMemoryCache(true) 方法,你后来又调用了 .skipMemoryCache(true) 这个方法,这个资源将会在内存中获取缓存。当你想要去调整缓存行为时,确保对同一个资源调用的一致性。

跳过磁盘缓存

正如你上面这部分所了解到的,即使你关闭内存缓存,请求图片将会仍然被存储在设备的磁盘缓存中。如果你有一张图片具有相同的 URL,但是变化很快,你可能想要连磁盘缓存也一起禁用。
你可以用 .diskCacheStrategy() 方法为 Glide 改变磁盘缓存的行为。不同的于 .skipMemoryCache() 方法,它需要一个枚举而不是一个简答的布尔值。如果你想要为一个请求禁用磁盘缓存。使用枚举 DiskCacheStrategy.NONE 作为参数。
Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .into( imageViewInternet );
图片在这段代码片段中将不会被保存在磁盘缓存中。然而,默认的它将仍然使用内存缓存!为了把这里两者都禁用掉,两个方法一起调用:
Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .skipMemoryCache( true )
    .into( imageViewInternet );

自定义磁盘缓存行为

正如我们之前提到的,Glide 有多个选项去配置磁盘缓存行为。在我们向你展示这些选项之前,你必须了解到 Glide 的磁盘缓存是相当复杂的。比如,Picasso 仅仅缓存了全尺寸的图像。然而 Glide 缓存了原始图像,全分辨率图像和另外小版本的图像。比如,如果你请求的一个图像是 1000x1000 像素的,但你的 ImageView 是 500x500 像素的,Glide 将会把这两个尺寸都进行缓存。
现在你将会理解对于 .diskCacheStrategy() 方法来说不同的枚举参数的意义:
  • DiskCacheStrategy.NONE 什么都不缓存,就像刚讨论的那样
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。在我们上面的例子中,将会只有一个 1000x1000 像素的图片
  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)
  • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为
作为最后一个例子,如果你有一张图片,你知道你将会经常操作处理,并做了一堆不同的版本,对其有意义的仅仅是缓存原始分辨率图片。因此,我们用 DiskCacheStrategy.SOURCE 去告诉 Glide 仅仅保存原始图片:
Glide  
    .with( context )
    .load( eatFoodyImages[2] )
    .diskCacheStrategy( DiskCacheStrategy.SOURCE )
    .into( imageViewFile );

2017年1月6日 星期五

Android Kikat下由圖片Uri獲取Path的解决方案




起因:Kikat下獲取圖片Uri後得到的地址格式为content://com.android.providers.media.documents/document/image:25145 而非Kika
起因:Kikat下獲取圖片Uri後得到的地址格式为content://com.android.providers.media.documents/document/image:25145
而非Kikat之前版本獲取到的真實文件路徑如/storage/sdcard0/DCIM/Camera/IMG_20140708_084250.jpg
因此需要一些特別的轉換來將Uri裏的image編號變成我們需要的文件路徑
轉載網络搜到的解决方案如下:

當然,還得在AndroidManifest.xml中添加如下權限:
 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />