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.csdn.net/mchenys/article/details/51599039 </code>