Glide是 Google推荐的图片加载库,它可以支持来自url,Android资源,文件,Uri中的图片加载,同时还支持gif图片的加载,以及各种图片显示前的bitmap处理(例如:圆角图片,圆形图片,高斯模糊,旋转,灰度等等),缓存处理,请求优先级处理,动画处理,缩略图处理,图片大小自定义等等.可谓是非常的强大.
1.添加Glide库
需要在build.gradle中加入依赖,目前最新的版本是3.7.0,Glide库地址
<code class="language-gradle hljs bash has-numbering"> compile <span class="hljs-string">'com.github.bumptech.glide:glide:3.7.0'</span></code><ul style="" class="pre-numbering"><li>1</li></ul>
2.加载网络图片
<code class="language-java hljs has-numbering"><span class="hljs-javadoc">/**
* Created by mChenys on 2016/6/6.
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
String url = <span class="hljs-string">"http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png"</span>;
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(url).
asBitmap(). <span class="hljs-comment">//强制处理为bitmap</span>
into(targetView);<span class="hljs-comment">//显示到目标View中</span>
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>
3.加载资源图片
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
<span class="hljs-keyword">int</span> resourceId = R.drawable.test;
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(resourceId).
asBitmap().
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>
4.加载本地文件图片
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
File file = <span class="hljs-keyword">new</span> File(Environment.getExternalStorageDirectory(), <span class="hljs-string">"test.jpg"</span>);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(file).
asBitmap().
into(targetView);
}
}
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>
5.从Uri中加载
<code class="language-java hljs has-numbering"><span class="hljs-javadoc">/**
* Created by mChenys on 2016/6/6.
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Uri uri = Uri.parse(<span class="hljs-string">"android.resource://"</span> + <span class="hljs-keyword">this</span>.getPackageName() + <span class="hljs-string">"/"</span> + R.drawable.test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(uri).
asBitmap().
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>
6.加载gif图片
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.smail).
asGif().<span class="hljs-comment">//注意:这里显示的指明了要加载的是gif图片,当然即使不指明,glide也会自己判断.</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>
效果图:
7.设置默认图片和加载失败时显示的图片
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
asBitmap().
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>
8.淡入显示效果
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
crossFade().<span class="hljs-comment">//淡入显示,注意:如果设置了这个,则必须要去掉asBitmap</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>
另外,crossFade还可以接收一个参数来设置淡入显示效果的持续时间,crossFade(int duration);
如果你想直接显示图片,而不是淡入显示图片,则可以通过dontAnimate()方法设置.
9.调整图片像素大小
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
crossFade(<span class="hljs-number">1000</span>).<span class="hljs-comment">//淡入显示的时间,注意:如果设置了这个,则必须要去掉asBitmap</span>
override(<span class="hljs-number">80</span>,<span class="hljs-number">80</span>).<span class="hljs-comment">//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>
10.设置CenterCrop,FitCenter
CenterCrop,FitCenter都是对目标图片进行裁剪,了解过ImageView的ScaleType属性就知道,这2种裁剪方式在ImageView上也是有的,分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
crossFade(<span class="hljs-number">1000</span>).<span class="hljs-comment">//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap</span>
override(<span class="hljs-number">80</span>,<span class="hljs-number">80</span>).<span class="hljs-comment">//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高</span>
centerCrop().<span class="hljs-comment">//中心裁剪,缩放填充至整个ImageView</span>
into(targetView);
}
}
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>
11.缓存策略设置
内存缓存设置,通过skipMemoryCache(boolean)来设置是否需要缓存到内存,默认是会缓存到内存的.
<code class="language-java hljs has-numbering"><span class="hljs-javadoc">/**
* Created by mChenys on 2016/6/6.
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
crossFade(<span class="hljs-number">1000</span>).<span class="hljs-comment">//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap</span>
override(<span class="hljs-number">80</span>,<span class="hljs-number">80</span>).<span class="hljs-comment">//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高</span>
centerCrop().<span class="hljs-comment">//中心裁剪,缩放填充至整个ImageView</span>
skipMemoryCache(<span class="hljs-keyword">true</span>).<span class="hljs-comment">//跳过内存缓存</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul>
磁盘缓存,磁盘缓存通过diskCacheStrategy(DiskCacheStrategy)来设置,DiskCacheStrategy一共有4种模式:
- DiskCacheStrategy.NONE:什么都不缓存
- DiskCacheStrategy.SOURCE:仅缓存原图(全分辨率的图片)
- DiskCacheStrategy.RESULT:仅缓存最终的图片,即修改了尺寸或者转换后的图片
- DiskCacheStrategy.ALL:缓存所有版本的图片,默认模式
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
crossFade(<span class="hljs-number">1000</span>).<span class="hljs-comment">//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap</span>
override(<span class="hljs-number">80</span>, <span class="hljs-number">80</span>).<span class="hljs-comment">//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高</span>
centerCrop().<span class="hljs-comment">//中心裁剪,缩放填充至整个ImageView</span>
skipMemoryCache(<span class="hljs-keyword">true</span>).<span class="hljs-comment">//跳过内存缓存</span>
diskCacheStrategy(DiskCacheStrategy.RESULT).<span class="hljs-comment">//保存最终图片</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul>
12.缓存设置
在GlideModule 中,我们可以设置磁盘缓存的位置,磁盘缓存的大小和内存缓存的大小,同时还可以设置图片的显示质量.
要是用GlideModule ,需要创建它的实现类,然后在manifests中申明实现类的全类路径:
<code class="language-xml hljs has-numbering"> <span class="hljs-tag"><<span class="hljs-title">meta-data
</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule"</span>
<span class="hljs-attribute">android:value</span>=<span class="hljs-value">"GlideModule"</span> /></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
GlideModule 的实现类,需要实现applyOptions方法:
<code class="language-java hljs has-numbering"><span class="hljs-javadoc">/**
* 所以你知道要创建一个额外的类去定制 Glide。
* 下一步是要全局的去声明这个类,让 Glide 知道它应该在哪里被加载和使用。
* Glide 会扫描 AndroidManifest.xml 为 Glide module 的 meta 声明。
* 因此,你必须在 AndroidManifest.xml 的 <application> 标签内去声明这个SimpleGlideModule。
* Created by mChenys on 2016/6/10.
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SimpleGlideModule</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">GlideModule</span> {</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> DiskCache cache;
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">applyOptions</span>(Context context, GlideBuilder builder) {
<span class="hljs-comment">// 在 Android 中有两个主要的方法对图片进行解码:ARGB8888 和 RGB565。前者为每个像素使用了 4 个字节,</span>
<span class="hljs-comment">// 后者仅为每个像素使用了 2 个字节。ARGB8888 的优势是图像质量更高以及能存储一个 alpha 通道。</span>
<span class="hljs-comment">// Picasso 使用 ARGB8888,Glide 默认使用低质量的 RGB565。</span>
<span class="hljs-comment">// 对于 Glide 使用者来说:你使用 Glide module 方法去改变解码规则。</span>
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
<span class="hljs-comment">//设置缓存目录</span>
File cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);
cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);<span class="hljs-comment">// 250 MB </span>
builder.setDiskCache(<span class="hljs-keyword">new</span> DiskCache.Factory() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> DiskCache <span class="hljs-title">build</span>() {
<span class="hljs-keyword">return</span> cache;
}
});
<span class="hljs-comment">//设置memory和Bitmap池的大小</span>
MemorySizeCalculator calculator = <span class="hljs-keyword">new</span> MemorySizeCalculator(context);
<span class="hljs-keyword">int</span> defaultMemoryCacheSize = calculator.getMemoryCacheSize();
<span class="hljs-keyword">int</span> defaultBitmapPoolSize = calculator.getBitmapPoolSize();
<span class="hljs-keyword">int</span> customMemoryCacheSize = (<span class="hljs-keyword">int</span>) (<span class="hljs-number">1.2</span> * defaultMemoryCacheSize);
<span class="hljs-keyword">int</span> customBitmapPoolSize = (<span class="hljs-keyword">int</span>) (<span class="hljs-number">1.2</span> * defaultBitmapPoolSize);
builder.setMemoryCache(<span class="hljs-keyword">new</span> LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(<span class="hljs-keyword">new</span> LruBitmapPool(customBitmapPoolSize));
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">registerComponents</span>(Context context, Glide glide) {
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li></ul>
13.设置图片请求的优先级
Glide 可以用 Priority 枚举来设置图片的加载优先级,这样我们就可以针对那些需要显示的图片设置高的优先级了.
Priority 有4种级别:
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE
例如:
<code class="language-java hljs has-numbering"> <span class="hljs-javadoc">/**
* 高优先级加载
*<span class="hljs-javadoctag"> @param</span> url
*<span class="hljs-javadoctag"> @param</span> imageView
*<span class="hljs-javadoctag"> @param</span> listener
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">loadImageWithHighPriority</span>(Object url,ImageView imageView, <span class="hljs-keyword">final</span> LoaderListener listener) {
<span class="hljs-keyword">if</span> (url == <span class="hljs-keyword">null</span>) {
<span class="hljs-keyword">if</span> (listener != <span class="hljs-keyword">null</span>) {
listener.onError();
}
} <span class="hljs-keyword">else</span> {
Glide.with(imageView.getContext()).
load(url).
asBitmap().
priority(Priority.HIGH).<span class="hljs-comment">//高优先级</span>
dontAnimate().
listener(<span class="hljs-keyword">new</span> RequestListener<Object, Bitmap>() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onException</span>(Exception e, Object model, Target<Bitmap> target, <span class="hljs-keyword">boolean</span> isFirstResource) {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> != listener) {
listener.onError();
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onResourceReady</span>(Bitmap resource, Object model, Target<Bitmap> target, <span class="hljs-keyword">boolean</span> isFromMemoryCache, <span class="hljs-keyword">boolean</span> isFirstResource) {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> != listener) {
listener.onSuccess();
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}
}).into(imageView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li></ul>
14.设置加载缩略图
通过设置缩略图,我们可以在显示目标图片之前先展示一个第分辨率或者其他图片,当全分辨率的目标图片在后台加载完成后,
Glide会自动切换显示全像素的目标图片.
设置缩略图有2种方式:
通过thumbnail(float)指定0.0f~1.0f的原始图像大小,例如全像素的大小是500*500,如果设置为thumbnail为0.1f,即目标图片的10%,显示的缩略图大小就是50*50;
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).<span class="hljs-comment">//加载中显示的图片</span>
error(R.drawable.bg_error).<span class="hljs-comment">//加载失败时显示的图片</span>
crossFade(<span class="hljs-number">1000</span>).<span class="hljs-comment">//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap</span>
override(<span class="hljs-number">80</span>, <span class="hljs-number">80</span>).<span class="hljs-comment">//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高</span>
centerCrop().<span class="hljs-comment">//中心裁剪,缩放填充至整个ImageView</span>
skipMemoryCache(<span class="hljs-keyword">true</span>).<span class="hljs-comment">//跳过内存缓存</span>
diskCacheStrategy(DiskCacheStrategy.RESULT).<span class="hljs-comment">//保存最终图片</span>
thumbnail(<span class="hljs-number">0.1</span>f).<span class="hljs-comment">//10%的原图大小</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul>
通过thumbnail(DrawableRequestBuilder)方式来指定缩略图,该缩略图可以使用load的所有方式(网络,文件,uri,资源)加载.
<code class="language-java hljs has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
<span class="hljs-comment">//缩略图请求</span>
DrawableRequestBuilder<String> thumbnailRequest = Glide
.with(<span class="hljs-keyword">this</span>)
.load(<span class="hljs-string">"http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png"</span>);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
<span class="hljs-comment">// placeholder(R.drawable.bg_loading).//加载中显示的图片</span>
<span class="hljs-comment">// error(R.drawable.bg_error).//加载失败时显示的图片</span>
<span class="hljs-comment">// crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap</span>
override(<span class="hljs-number">80</span>, <span class="hljs-number">80</span>).<span class="hljs-comment">//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高</span>
centerCrop().<span class="hljs-comment">//中心裁剪,缩放填充至整个ImageView</span>
skipMemoryCache(<span class="hljs-keyword">true</span>).<span class="hljs-comment">//跳过内存缓存</span>
diskCacheStrategy(DiskCacheStrategy.RESULT).<span class="hljs-comment">//保存最终图片</span>
thumbnail(thumbnailRequest).<span class="hljs-comment">//设置缩略图</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul>
15.Transformations Bitmap
在显示目标图片之前,我们可以对目标图片的Bitmap进行相应的处理,例如::圆角图片,圆形图片,高斯模糊,旋转,灰度等等.
只需要实现Transformation接口即可,该接口的transform方法会返回显示图片前的Bitmap对象,在该方法中对
Bitmap的任何处理,都会影响到最终的显示结果.
当然,如果你只是想要对图片做常规的 bitmap 转换,你可以继承抽象类BitmapTransformation,它简化了Transformation接口的实现,这应该能覆盖大部分的应用场景了。
使用的时候,通过transform(Transformation… transformations)来设置.例如:
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
asBitmap().
transform(<span class="hljs-keyword">new</span> BlurTransformation(<span class="hljs-keyword">this</span>)).<span class="hljs-comment">//高斯模糊处理</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>
下面贴出常用的几个Bitmap的转换处理的代码,在github上也有glide-transformations-master库.
圆图处理
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CropCircleTransformation</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Transformation</span><<span class="hljs-title">Bitmap</span>> {</span>
<span class="hljs-keyword">private</span> BitmapPool mBitmapPool;
<span class="hljs-keyword">public</span> <span class="hljs-title">CropCircleTransformation</span>(Context context) {
<span class="hljs-keyword">this</span>(Glide.get(context).getBitmapPool());
}
<span class="hljs-keyword">public</span> <span class="hljs-title">CropCircleTransformation</span>(BitmapPool pool) {
<span class="hljs-keyword">this</span>.mBitmapPool = pool;
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> Resource<Bitmap> <span class="hljs-title">transform</span>(Resource<Bitmap> resource, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
Bitmap source = resource.get();
<span class="hljs-keyword">int</span> size = Math.min(source.getWidth(), source.getHeight());
<span class="hljs-keyword">int</span> width = (source.getWidth() - size) / <span class="hljs-number">2</span>;
<span class="hljs-keyword">int</span> height = (source.getHeight() - size) / <span class="hljs-number">2</span>;
Bitmap bitmap = mBitmapPool.get(size, size, Bitmap.Config.ARGB_8888);
<span class="hljs-keyword">if</span> (bitmap == <span class="hljs-keyword">null</span>) {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(bitmap);
Paint paint = <span class="hljs-keyword">new</span> Paint();
BitmapShader shader =
<span class="hljs-keyword">new</span> BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
<span class="hljs-keyword">if</span> (width != <span class="hljs-number">0</span> || height != <span class="hljs-number">0</span>) {
<span class="hljs-comment">// source isn't square, move viewport to center</span>
Matrix matrix = <span class="hljs-keyword">new</span> Matrix();
matrix.setTranslate(-width, -height);
shader.setLocalMatrix(matrix);
}
paint.setShader(shader);
paint.setAntiAlias(<span class="hljs-keyword">true</span>);
<span class="hljs-keyword">float</span> r = size / <span class="hljs-number">2</span>f;
canvas.drawCircle(r, r, r, paint);
<span class="hljs-keyword">return</span> BitmapResource.obtain(bitmap, mBitmapPool);
}
<span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
<span class="hljs-keyword">return</span> <span class="hljs-string">"CropCircleTransformation()"</span>;
}
}
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li></ul>
圆角处理
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RoundedCornersTransformation</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Transformation</span><<span class="hljs-title">Bitmap</span>> {</span>
<span class="hljs-keyword">private</span> BitmapPool mBitmapPool;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> radius;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> margin;
<span class="hljs-keyword">public</span> <span class="hljs-title">RoundedCornersTransformation</span>(Context context, <span class="hljs-keyword">int</span> radius, <span class="hljs-keyword">int</span> margin) {
<span class="hljs-keyword">this</span>(Glide.get(context).getBitmapPool(), radius, margin);
}
<span class="hljs-keyword">public</span> <span class="hljs-title">RoundedCornersTransformation</span>(BitmapPool pool, <span class="hljs-keyword">int</span> radius, <span class="hljs-keyword">int</span> margin) {
mBitmapPool = pool;
<span class="hljs-keyword">this</span>.radius = radius;
<span class="hljs-keyword">this</span>.margin = margin;
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> Resource<Bitmap> <span class="hljs-title">transform</span>(Resource<Bitmap> resource, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
Bitmap source = resource.get();
<span class="hljs-keyword">int</span> width = source.getWidth();
<span class="hljs-keyword">int</span> height = source.getHeight();
Bitmap bitmap = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
<span class="hljs-keyword">if</span> (bitmap == <span class="hljs-keyword">null</span>) {
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
}
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(bitmap);
Paint paint = <span class="hljs-keyword">new</span> Paint();
paint.setAntiAlias(<span class="hljs-keyword">true</span>);
paint.setShader(<span class="hljs-keyword">new</span> BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
canvas.drawRoundRect(<span class="hljs-keyword">new</span> RectF(margin, margin, width - margin, height - margin), radius, radius,
paint);
<span class="hljs-keyword">return</span> BitmapResource.obtain(bitmap, mBitmapPool);
}
<span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
<span class="hljs-keyword">return</span> <span class="hljs-string">"RoundedTransformation(radius="</span> + radius + <span class="hljs-string">", margin="</span> + margin + <span class="hljs-string">")"</span>;
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li></ul>
灰度处理
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GrayscaleTransformation</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Transformation</span><<span class="hljs-title">Bitmap</span>> {</span>
<span class="hljs-keyword">private</span> BitmapPool mBitmapPool;
<span class="hljs-keyword">public</span> <span class="hljs-title">GrayscaleTransformation</span>(Context context) {
<span class="hljs-keyword">this</span>(Glide.get(context).getBitmapPool());
}
<span class="hljs-keyword">public</span> <span class="hljs-title">GrayscaleTransformation</span>(BitmapPool pool) {
mBitmapPool = pool;
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> Resource<Bitmap> <span class="hljs-title">transform</span>(Resource<Bitmap> resource, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
Bitmap source = resource.get();
<span class="hljs-keyword">int</span> width = source.getWidth();
<span class="hljs-keyword">int</span> height = source.getHeight();
Bitmap.Config config =
source.getConfig() != <span class="hljs-keyword">null</span> ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(width, height, config);
<span class="hljs-keyword">if</span> (bitmap == <span class="hljs-keyword">null</span>) {
bitmap = Bitmap.createBitmap(width, height, config);
}
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(bitmap);
ColorMatrix saturation = <span class="hljs-keyword">new</span> ColorMatrix();
saturation.setSaturation(<span class="hljs-number">0</span>f);
Paint paint = <span class="hljs-keyword">new</span> Paint();
paint.setColorFilter(<span class="hljs-keyword">new</span> ColorMatrixColorFilter(saturation));
canvas.drawBitmap(source, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, paint);
<span class="hljs-keyword">return</span> BitmapResource.obtain(bitmap, mBitmapPool);
}
<span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
<span class="hljs-keyword">return</span> <span class="hljs-string">"GrayscaleTransformation()"</span>;
}
}
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li></ul>
旋转处理
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RotateTransformation</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">BitmapTransformation</span> {</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">float</span> rotateRotationAngle = <span class="hljs-number">0</span>f;
<span class="hljs-keyword">public</span> <span class="hljs-title">RotateTransformation</span>(Context context, <span class="hljs-keyword">float</span> rotateRotationAngle) {
<span class="hljs-keyword">super</span>(context);
<span class="hljs-keyword">this</span>.rotateRotationAngle = rotateRotationAngle;
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> Bitmap <span class="hljs-title">transform</span>(BitmapPool pool, Bitmap toTransform, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
Matrix matrix = <span class="hljs-keyword">new</span> Matrix();
matrix.postRotate(rotateRotationAngle);
<span class="hljs-keyword">return</span> Bitmap.createBitmap(toTransform, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, toTransform.getWidth(), toTransform.getHeight(), matrix, <span class="hljs-keyword">true</span>);
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
<span class="hljs-keyword">return</span> <span class="hljs-string">"rotate"</span> + rotateRotationAngle;
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul>
高斯模糊处理
<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> BlurTransformation implements Transformation<Bitmap> {
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> MAX_RADIUS = <span class="hljs-number">25</span>;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> DEFAULT_DOWN_SAMPLING = <span class="hljs-number">1</span>;
<span class="hljs-keyword">private</span> Context mContext;
<span class="hljs-keyword">private</span> BitmapPool mBitmapPool;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> mRadius;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> mSampling;
<span class="hljs-keyword">public</span> <span class="hljs-title">BlurTransformation</span>(Context context) {
<span class="hljs-keyword">this</span>(context, Glide.<span class="hljs-keyword">get</span>(context).getBitmapPool(), MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
}
<span class="hljs-keyword">public</span> <span class="hljs-title">BlurTransformation</span>(Context context, BitmapPool pool) {
<span class="hljs-keyword">this</span>(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
}
<span class="hljs-keyword">public</span> <span class="hljs-title">BlurTransformation</span>(Context context, BitmapPool pool, <span class="hljs-keyword">int</span> radius) {
<span class="hljs-keyword">this</span>(context, pool, radius, DEFAULT_DOWN_SAMPLING);
}
<span class="hljs-keyword">public</span> <span class="hljs-title">BlurTransformation</span>(Context context, <span class="hljs-keyword">int</span> radius) {
<span class="hljs-keyword">this</span>(context, Glide.<span class="hljs-keyword">get</span>(context).getBitmapPool(), radius, DEFAULT_DOWN_SAMPLING);
}
<span class="hljs-keyword">public</span> <span class="hljs-title">BlurTransformation</span>(Context context, BitmapPool pool, <span class="hljs-keyword">int</span> radius, <span class="hljs-keyword">int</span> sampling) {
mContext = context;
mBitmapPool = pool;
mRadius = radius;
mSampling = sampling;
}
<span class="hljs-keyword">public</span> <span class="hljs-title">BlurTransformation</span>(Context context, <span class="hljs-keyword">int</span> radius, <span class="hljs-keyword">int</span> sampling) {
mContext = context;
mBitmapPool = Glide.<span class="hljs-keyword">get</span>(context).getBitmapPool();
mRadius = radius;
mSampling = sampling;
}
@Override
<span class="hljs-keyword">public</span> Resource<Bitmap> <span class="hljs-title">transform</span>(Resource<Bitmap> resource, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
Bitmap source = resource.<span class="hljs-keyword">get</span>();
<span class="hljs-keyword">int</span> width = source.getWidth();
<span class="hljs-keyword">int</span> height = source.getHeight();
<span class="hljs-keyword">int</span> scaledWidth = width / mSampling;
<span class="hljs-keyword">int</span> scaledHeight = height / mSampling;
Bitmap bitmap = mBitmapPool.<span class="hljs-keyword">get</span>(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
<span class="hljs-keyword">if</span> (bitmap == <span class="hljs-keyword">null</span>) {
bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
}
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(bitmap);
canvas.scale(<span class="hljs-number">1</span> / (<span class="hljs-keyword">float</span>) mSampling, <span class="hljs-number">1</span> / (<span class="hljs-keyword">float</span>) mSampling);
Paint paint = <span class="hljs-keyword">new</span> Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(source, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, paint);
<span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
<span class="hljs-keyword">try</span> {
bitmap = RSBlur.blur(mContext, bitmap, mRadius);
} <span class="hljs-keyword">catch</span> (RSRuntimeException e) {
bitmap = FastBlur.blur(bitmap, mRadius, <span class="hljs-keyword">true</span>);
}
} <span class="hljs-keyword">else</span> {
bitmap = FastBlur.blur(bitmap, mRadius, <span class="hljs-keyword">true</span>);
}
<span class="hljs-keyword">return</span> BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override <span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
<span class="hljs-keyword">return</span> <span class="hljs-string">"BlurTransformation(radius="</span> + mRadius + <span class="hljs-string">", sampling="</span> + mSampling + <span class="hljs-string">")"</span>;
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li></ul>
网上提供的FastBlur,可兼容低版本的高斯模糊处理
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FastBlur</span> {</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Bitmap <span class="hljs-title">blur</span>(Bitmap sentBitmap, <span class="hljs-keyword">int</span> radius, <span class="hljs-keyword">boolean</span> canReuseInBitmap) {
Bitmap bitmap;
<span class="hljs-keyword">if</span> (canReuseInBitmap) {
bitmap = sentBitmap;
} <span class="hljs-keyword">else</span> {
bitmap = sentBitmap.copy(sentBitmap.getConfig(), <span class="hljs-keyword">true</span>);
}
<span class="hljs-keyword">if</span> (radius < <span class="hljs-number">1</span>) {
<span class="hljs-keyword">return</span> (<span class="hljs-keyword">null</span>);
}
<span class="hljs-keyword">int</span> w = bitmap.getWidth();
<span class="hljs-keyword">int</span> h = bitmap.getHeight();
<span class="hljs-keyword">int</span>[] pix = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[w * h];
bitmap.getPixels(pix, <span class="hljs-number">0</span>, w, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, w, h);
<span class="hljs-keyword">int</span> wm = w - <span class="hljs-number">1</span>;
<span class="hljs-keyword">int</span> hm = h - <span class="hljs-number">1</span>;
<span class="hljs-keyword">int</span> wh = w * h;
<span class="hljs-keyword">int</span> div = radius + radius + <span class="hljs-number">1</span>;
<span class="hljs-keyword">int</span> r[] = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[wh];
<span class="hljs-keyword">int</span> g[] = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[wh];
<span class="hljs-keyword">int</span> b[] = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[wh];
<span class="hljs-keyword">int</span> rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
<span class="hljs-keyword">int</span> vmin[] = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[Math.max(w, h)];
<span class="hljs-keyword">int</span> divsum = (div + <span class="hljs-number">1</span>) >> <span class="hljs-number">1</span>;
divsum *= divsum;
<span class="hljs-keyword">int</span> dv[] = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[<span class="hljs-number">256</span> * divsum];
<span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < <span class="hljs-number">256</span> * divsum; i++) {
dv[i] = (i / divsum);
}
yw = yi = <span class="hljs-number">0</span>;
<span class="hljs-keyword">int</span>[][] stack = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[div][<span class="hljs-number">3</span>];
<span class="hljs-keyword">int</span> stackpointer;
<span class="hljs-keyword">int</span> stackstart;
<span class="hljs-keyword">int</span>[] sir;
<span class="hljs-keyword">int</span> rbs;
<span class="hljs-keyword">int</span> r1 = radius + <span class="hljs-number">1</span>;
<span class="hljs-keyword">int</span> routsum, goutsum, boutsum;
<span class="hljs-keyword">int</span> rinsum, ginsum, binsum;
<span class="hljs-keyword">for</span> (y = <span class="hljs-number">0</span>; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = <span class="hljs-number">0</span>;
<span class="hljs-keyword">for</span> (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, <span class="hljs-number">0</span>))];
sir = stack[i + radius];
sir[<span class="hljs-number">0</span>] = (p & <span class="hljs-number">0xff0000</span>) >> <span class="hljs-number">16</span>;
sir[<span class="hljs-number">1</span>] = (p & <span class="hljs-number">0x00ff00</span>) >> <span class="hljs-number">8</span>;
sir[<span class="hljs-number">2</span>] = (p & <span class="hljs-number">0x0000ff</span>);
rbs = r1 - Math.abs(i);
rsum += sir[<span class="hljs-number">0</span>] * rbs;
gsum += sir[<span class="hljs-number">1</span>] * rbs;
bsum += sir[<span class="hljs-number">2</span>] * rbs;
<span class="hljs-keyword">if</span> (i > <span class="hljs-number">0</span>) {
rinsum += sir[<span class="hljs-number">0</span>];
ginsum += sir[<span class="hljs-number">1</span>];
binsum += sir[<span class="hljs-number">2</span>];
} <span class="hljs-keyword">else</span> {
routsum += sir[<span class="hljs-number">0</span>];
goutsum += sir[<span class="hljs-number">1</span>];
boutsum += sir[<span class="hljs-number">2</span>];
}
}
stackpointer = radius;
<span class="hljs-keyword">for</span> (x = <span class="hljs-number">0</span>; x < w; x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[<span class="hljs-number">0</span>];
goutsum -= sir[<span class="hljs-number">1</span>];
boutsum -= sir[<span class="hljs-number">2</span>];
<span class="hljs-keyword">if</span> (y == <span class="hljs-number">0</span>) {
vmin[x] = Math.min(x + radius + <span class="hljs-number">1</span>, wm);
}
p = pix[yw + vmin[x]];
sir[<span class="hljs-number">0</span>] = (p & <span class="hljs-number">0xff0000</span>) >> <span class="hljs-number">16</span>;
sir[<span class="hljs-number">1</span>] = (p & <span class="hljs-number">0x00ff00</span>) >> <span class="hljs-number">8</span>;
sir[<span class="hljs-number">2</span>] = (p & <span class="hljs-number">0x0000ff</span>);
rinsum += sir[<span class="hljs-number">0</span>];
ginsum += sir[<span class="hljs-number">1</span>];
binsum += sir[<span class="hljs-number">2</span>];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + <span class="hljs-number">1</span>) % div;
sir = stack[(stackpointer) % div];
routsum += sir[<span class="hljs-number">0</span>];
goutsum += sir[<span class="hljs-number">1</span>];
boutsum += sir[<span class="hljs-number">2</span>];
rinsum -= sir[<span class="hljs-number">0</span>];
ginsum -= sir[<span class="hljs-number">1</span>];
binsum -= sir[<span class="hljs-number">2</span>];
yi++;
}
yw += w;
}
<span class="hljs-keyword">for</span> (x = <span class="hljs-number">0</span>; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = <span class="hljs-number">0</span>;
yp = -radius * w;
<span class="hljs-keyword">for</span> (i = -radius; i <= radius; i++) {
yi = Math.max(<span class="hljs-number">0</span>, yp) + x;
sir = stack[i + radius];
sir[<span class="hljs-number">0</span>] = r[yi];
sir[<span class="hljs-number">1</span>] = g[yi];
sir[<span class="hljs-number">2</span>] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;
<span class="hljs-keyword">if</span> (i > <span class="hljs-number">0</span>) {
rinsum += sir[<span class="hljs-number">0</span>];
ginsum += sir[<span class="hljs-number">1</span>];
binsum += sir[<span class="hljs-number">2</span>];
} <span class="hljs-keyword">else</span> {
routsum += sir[<span class="hljs-number">0</span>];
goutsum += sir[<span class="hljs-number">1</span>];
boutsum += sir[<span class="hljs-number">2</span>];
}
<span class="hljs-keyword">if</span> (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
<span class="hljs-keyword">for</span> (y = <span class="hljs-number">0</span>; y < h; y++) {
<span class="hljs-comment">// Preserve alpha channel: ( 0xff000000 & pix[yi] )</span>
pix[yi] = (<span class="hljs-number">0xff000000</span> & pix[yi]) | (dv[rsum] << <span class="hljs-number">16</span>) | (dv[gsum] << <span class="hljs-number">8</span>) | dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[<span class="hljs-number">0</span>];
goutsum -= sir[<span class="hljs-number">1</span>];
boutsum -= sir[<span class="hljs-number">2</span>];
<span class="hljs-keyword">if</span> (x == <span class="hljs-number">0</span>) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];
sir[<span class="hljs-number">0</span>] = r[p];
sir[<span class="hljs-number">1</span>] = g[p];
sir[<span class="hljs-number">2</span>] = b[p];
rinsum += sir[<span class="hljs-number">0</span>];
ginsum += sir[<span class="hljs-number">1</span>];
binsum += sir[<span class="hljs-number">2</span>];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + <span class="hljs-number">1</span>) % div;
sir = stack[stackpointer];
routsum += sir[<span class="hljs-number">0</span>];
goutsum += sir[<span class="hljs-number">1</span>];
boutsum += sir[<span class="hljs-number">2</span>];
rinsum -= sir[<span class="hljs-number">0</span>];
ginsum -= sir[<span class="hljs-number">1</span>];
binsum -= sir[<span class="hljs-number">2</span>];
yi += w;
}
}
bitmap.setPixels(pix, <span class="hljs-number">0</span>, w, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, w, h);
<span class="hljs-keyword">return</span> (bitmap);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li></ul>
RenderScript处理高斯模糊
android4.3之后可使用,需要在build.gradle中配置:
<code class="language-gradle hljs cs has-numbering">defaultConfig {
<span class="hljs-comment">//BlurTransformation</span>
renderscriptTargetApi <span class="hljs-number">23</span>
renderscriptSupportModeEnabled <span class="hljs-keyword">true</span>
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RSBlur</span> {</span>
<span class="hljs-annotation">@TargetApi</span>(Build.VERSION_CODES.JELLY_BEAN_MR2)
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Bitmap <span class="hljs-title">blur</span>(Context context, Bitmap blurredBitmap, <span class="hljs-keyword">int</span> radius) <span class="hljs-keyword">throws</span> RSRuntimeException {
<span class="hljs-keyword">try</span> {
RenderScript rs = RenderScript.create(context);
Allocation input = Allocation.createFromBitmap(rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
Allocation output = Allocation.createTyped(rs, input.getType());
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blur.setInput(input);
blur.setRadius(radius);
blur.forEach(output);
output.copyTo(blurredBitmap);
rs.destroy();
} <span class="hljs-keyword">catch</span> (RSRuntimeException e) {
blurredBitmap = FastBlur.blur(blurredBitmap, radius, <span class="hljs-keyword">true</span>);
}
<span class="hljs-keyword">return</span> blurredBitmap;
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul>
16.动画处理
通过animate()方法可以设置xml文件定义的4种补间动画(alpha、scale、translate、rotate)
例如:
res\anim\left_in.xml
<code class="language-xml hljs has-numbering">
<span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag"><<span class="hljs-title">set</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>></span>
<span class="hljs-tag"><<span class="hljs-title">translate
</span> <span class="hljs-attribute">android:duration</span>=<span class="hljs-value">"@android:integer/config_mediumAnimTime"</span>
<span class="hljs-attribute">android:fromXDelta</span>=<span class="hljs-value">"-50%p"</span>
<span class="hljs-attribute">android:toXDelta</span>=<span class="hljs-value">"0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-title">alpha
</span> <span class="hljs-attribute">android:duration</span>=<span class="hljs-value">"@android:integer/config_mediumAnimTime"</span>
<span class="hljs-attribute">android:fromAlpha</span>=<span class="hljs-value">"0.0"</span>
<span class="hljs-attribute">android:toAlpha</span>=<span class="hljs-value">"1.0"</span>/></span>
<span class="hljs-tag"></<span class="hljs-title">set</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>
使用方式:
<code class="language-java hljs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestGlideActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(<span class="hljs-keyword">this</span>).
load(R.drawable.test).
asBitmap().
animate(R.anim.left_in).<span class="hljs-comment">//加载xml文件定义的动画</span>
into(targetView);
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>
处理此外,还可以通过animate指定属性动画:
<code class="language-xml hljs has-numbering">public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) {
//设置属性动画
ObjectAnimator moveIn = ObjectAnimator.ofFloat(view, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);
ObjectAnimator moveTop = ObjectAnimator.ofFloat(view, "translationY", 0f, -2000, 0f);
AnimatorSet animSet = new AnimatorSet();
//先左进,然后旋转伴随淡入效果,最后移动向上
animSet.play(rotate).with(fadeInOut).after(moveIn).before(moveTop);
animSet.setDuration(5000);
animSet.start();
}
};
Glide.with(this).
load(R.drawable.test).
asBitmap().
animate(animationObject).//加载属性动画
into(targetView);
}
}
转自:http://blog.youkuaiyun.com/mchenys/article/details/51599039
</code>
Glide图片加载库详解
本文详细介绍Glide图片加载库的功能特性,包括网络图片加载、缓存处理、高斯模糊等高级功能实现,并提供定制Glide模块的方法及示例代码。
4639

被折叠的 条评论
为什么被折叠?



