Kotlin编程中使用Glide v4 Generated API
前期准备:
在Gralde中引用Glide库:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
testCompile 'junit:junit:4.12'
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
//Glide v4
compile 'com.github.bumptech.glide:glide:4.0.0-RC0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'}混淆规则:
#Glide的混淆规则
-keep public class * implements com.bumptech.glide.module.GlideModule-keep public class * extends com.bumptech.glide.AppGlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES; public *;
}开始编写代码
开始用Kotlin编程编写,相关的Glide v4 Generated API配置。
自定义AppGlideModule:
@GlideModuleinternal class CustomAppGlideModule : AppGlideModule() { /**
* 设置内存缓存大小10M
*/
val cacheSize=10*1024*1024
override fun applyOptions(context: Context?, builder: GlideBuilder) {
builder.setMemoryCache(LruResourceCache(cacheSize))
} /**
* 注册一个String类型的BaseGlideUrlLoader
*/
override fun registerComponents(context: Context?, registry: Registry) {
registry.append(String::class.java,InputStream::class.java,
CustomBaseGlideUrlLoader.factory)
} /**
* 关闭解析AndroidManifest
*/
override fun isManifestParsingEnabled(): Boolean { return false
}
}为运用程序定义一个带有@GlideModule注解的AppGlideModule,运用程序会使用和AppGlideMoudle同一个包下的GlideApp类。通过GlideApp.with()方式使用Glide的Generated API。
自定义BaseGlideUrlLoader:
internal class CustomBaseGlideUrlLoader(concreteLoader: ModelLoader<GlideUrl, InputStream>, modelCache: ModelCache<String, GlideUrl>): BaseGlideUrlLoader<String>(concreteLoader,modelCache){ /**
* Url的匹配规则
*/
val patern= Pattern.compile("__w-((?:-?\\d+)+)__") /**
* 控制需要加载图片的尺寸大小
*/
override fun getUrl(model: String, width: Int, height: Int, options: Options?): String {
var m=patern.matcher(model)
var bestBucket=0
if (m.find()){
var found=m.group(1).split("-") for (item in found){
bestBucket=item.toInt() if (bestBucket>=width) break
}
} return model
}
override fun handles(model: String?)=true
companion object{
val urlCache= ModelCache<String, GlideUrl>(150) /**
* 默认是私有的,通过@JvmField注解暴露给Java调用
*/
@JvmField
val factory=object: ModelLoaderFactory<String, InputStream> {
override fun build(multiFactory: MultiModelLoaderFactory)
: ModelLoader<String, InputStream> {
return CustomBaseGlideUrlLoader(
multiFactory.build(GlideUrl::class.java, InputStream::class.java), urlCache)
}
override fun teardown() {
}
}
}
}根据带有图片尺寸的URl,来获取合适比例的图片资源。通过指定String类型的Model, BaseGliUrlLOader中getgetURL()来覆盖原本的带有http或者htpps的URL. 这里处理方式来源于,Google IO App
配置工作已经完成,开始愉快的使用GlideApp类来加载图片到ImageView上:
GlideApp.with(context).asBitmap() .load(url) .error(R.mipmap.ic_launcher) .placeholder(R.mipmap.ic_launcher) .into(CircularBitmapImageViewTarget(context,imageView));1234512345
正当愉快的编写完GlideApp类使用,你一运行项目,发现AndroidStudio给你一个报错:
Unresolved reference: GlideApp11
纳尼,用Java语言中使用Glide V4都好好的,咋到了Kotlin就不行呢?
注意点:目前,在Kotlin编程中无法使用GlideApp的引用。
这时候是感觉泪奔了,深深打击了自己幼小心灵。好在Kotlin还是很强大的,100%兼容Java。Kotlin写不了,就用Java呗.
曲线救国方式:Java语言编写自定义AppGlideModule:
@GlideModulepublic class CustomAppGlideModule extends AppGlideModule{
@Override
public void applyOptions(Context context, GlideBuilder builder) { //重新设置内存限制,这里10M
builder.setMemoryCache(new LruResourceCache(10*1024*1024));
} /**
* 为App注册一个自定义的String类型的BaseGlideUrlLoader
*
* @param context
* @param registry
*/
@Override
public void registerComponents(Context context, Registry registry) {
registry.append(String.class, InputStream.class, CustomBaseGlideUrlLoader.factory);
} /**
* 关闭扫描AndroidManifests.xml
* @return
*/
@Override
public boolean isManifestParsingEnabled() { return false;
}
}需注意点:由于自定义BaseGlideUrlLoader是用Kotlin语言写的,这里采用Java调用Kotlin编程中静态字段,使用@JvmField注解。
internal class CustomBaseGlideUrlLoader(concreteLoader: ModelLoader<GlideUrl, InputStream>, modelCache: ModelCache<String, GlideUrl>): BaseGlideUrlLoader<String>(concreteLoader,modelCache){
......
companion object{ /**
* 默认是私有的,通过@JvmField注解暴露给Java调用
*/
@JvmField
val factory=object: ModelLoaderFactory<String, InputStream> {
........
}
}
}顺利的在项目使用GlideApp类:
写完后,在AndroidStudio的Build–>Make Project–>将会出现在build/generated/source中,可以顺利使用GlideApp类。
使用GlideApp类在ImageView中:
圆角图片比较好看些,先来定义个一个CircularBitmapImageViewTarget来实现:
internal class CircularBitmapImageViewTarget(var context: Context, var imageView: ImageView): com.bumptech.glide.request.target.BitmapImageViewTarget(imageView){ /**
* 绘制圆角的Bitmap
*/
override fun setResource(bitmap: android.graphics.Bitmap?) { var bitmapDrawable= RoundedBitmapDrawableFactory.create(context.resources,bitmap)
bitmapDrawable.isCircular=true
imageView.setImageDrawable(bitmapDrawable)
}
}用Java语言编写GlideApp调用方法:
public class GlideUtils { public static void loadUrlImage(Context context, String url, ImageView imageView){
GlideApp.with(context).asBitmap()
.load(url).error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(new CircularBitmapImageViewTarget(context,imageView));
}
}最后在RecyclerView中的Adapter中使用:
internal class MovieListAdapter(var context: Context, var list: List<MovieList.Movie>) : RecyclerView.Adapter<MovieListAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
= ViewHolder(View.inflate(parent.context, R.layout.movielist_item, null))
override fun onBindViewHolder(holder: ViewHolder, position: Int) { //调用Java编写静态方法
GlideUtils.loadUrlImage(context,list[position].images.large,holder.imageView)
} override fun getItemCount() = list.size
.......
}本篇代码是来源于Kotlin语言编写的一个MVP案例,下面有链接。
效果图如下:
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
