我们想将我们之前的项目,使用Kotlin重构,那么,在原来项目,会有一些第三方库(或者自己封装的自定义控件),我们总不能将人家的库也给重新用Kotlin重写吧。由于Kotlin支持Java代码,所以,主要思路是,使用Anko将我们要用到的库扩展,然后,需要用到的库中的方法属性,根据库文档进行适当的Kotlin调用。我将使用Fresco的SimpleDraweeView这个控件进行简单的举例。
关于Fresco,可以参考最新的文档进行相应的配置。首先配置app/build.gradle:
compile 'com.facebook.fresco:fresco:0.8.1+'
然后在AndroidMainfest中配置网络权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="top.xiexiaodong.hellokotlin">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这样我们就可以使用SimpleDraweeView控件了。
这里我们添加到MainActivity.kt中:
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.ViewManager
import com.facebook.drawee.view.SimpleDraweeView
import org.jetbrains.anko.*
import org.jetbrains.anko.custom.ankoView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MainActivityUi().setContentView(this)
}
}
class MainActivityUi : AnkoComponent<MainActivity> {
override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {
verticalLayout {
textView("Hello Kotlin!")
button("Click me") {
onClick {
toast("Oh, You clicked me!")
}
}
}
}
}
public inline fun ViewManager.simpleDraweeView(theme: Int = 0) = simpleDraweeView(theme) {}
public inline fun ViewManager.simpleDraweeView(theme: Int = 0, init: SimpleDraweeView.() -> Unit) = ankoView({ SimpleDraweeView(it) }, init)
我们在View中使用SimpleDraweeView,则使用内置函数ViewManager.新控件名称添加扩展,相应的,我们可以将Activity和Context都添加上去,代码如下:
public inline fun Activity.simpleDraweeView(theme: Int = 0) = simpleDraweeView(theme) {}
public inline fun Activity.simpleDraweeView(theme: Int = 0, init: SimpleDraweeView.() -> Unit) = ankoView({ SimpleDraweeView(it) }, init)
public inline fun Context.simpleDraweeView(theme: Int = 0) = simpleDraweeView(theme) {}
public inline fun Context.simpleDraweeView(theme: Int = 0, init: SimpleDraweeView.() -> Unit) = ankoView({ SimpleDraweeView(it) }, init)
这样,我们就可以在布局中使用SimpleDraweeView了:
class MainActivityUi : AnkoComponent<MainActivity> {
override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {
verticalLayout {
textView("Hello Kotlin!")
button("Click me") {
onClick {
toast("Oh, You clicked me!")
}
}
simpleDraweeView().lparams(width = matchParent, height = matchParent) {
}.apply {
setImageURI(Uri.parse("http://avatar.csdn.net/7/2/A/3_a191030148.jpg"), null)
hierarchy.setFadeDuration(300)
hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.FIT_XY)
}
}
}
}
最后,我们还要在使用SimpleDraweeView之前,初始化Fresco,这里放在了MainActivity onCreate()方法中了:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Fresco.initialize(this)
MainActivityUi().setContentView(this)
}
}
其中,hierarchy.setFadeDuration()诸如此类的第三方库才会提供的属性设置,我是通过Fresco官方文档,参考Java代码来调用的,使用方法和Java差不多,在这里提供一下参考。我们运行一下程序看看效果:
有淡入效果,可以修改为3000,效果更明显。