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案例,下面有链接。
效果图如下:
共同学习,写下你的评论
评论加载中...
作者其他优质文章