java中的AnimatorListener
public void addListener(AnimatorListener listener){
if(mListner==null){
mListener=new ArrayListener<AnimatorListener>();
}
mListener.add(listener)
}
public static interface AnimatorListener{
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
kotlin中的AnimatorListener(扩展)
inline fun Animator.addListener(
crossinline onEnd:(animator: Animator)->Unit={},
crossinline onStart: (animator: Animator) -> Unit = {},
crossinline onCancel: (animator: Animator) -> Unit = {},
crossinline onRepeat: (animator: Animator) -> Unit = {}
):Animator.AnimatorListener{
val listener=object:Animator.AnimatorLisener{
override fun onAnimationRepeat(animator: Animator) = onRepeat(animator)
override fun onAnimationEnd(animator: Animator) = onEnd(animator)
override fun onAnimationCancel(animator: Animator) = onCancel(animator)
override fun onAnimationStart(animator: Animator) = onStart(animator)
}
addListener(listener) //调用系统的addListener
return listener
}
kotlin 添加内联函数
方法被调用,压栈出栈耗费资源,所以有了inline关键字,
在编译期间,定义为inline关键字的方法,会被视为调用者的内容方法体,不会有压栈,出栈操作,进而减少资源消耗。
inline
定义内联函数的关键字
noinline
定义为inline的函数体内,它的参数也是函数,再调用非inline函数,传入它的(函数)参数时,是不允许被使用,如果需要使用,需要在形参上添加noinline关键字。注:{除了函数参数以外的是可以被访问}
例子
fun converRep(conver: (String) -> Unit) {}
inline fun meetInline(s: String, noinline conver: (String) -> Unit) {
converRep(conver)
}
crossinline
crossinline的作用是内联函数中被标记为crossinline的lambda表达式不允许"非局部返回"。
函数中的lambda不允许直接非局部返回,只能返回当前lambda表达式,return@lambda
例子
fun converRep(conver: (String) -> Unit) {}
fun crossTest(){
converRep{
// return 不被允许
return@converRep 只是返回了lambda表达式,并不影响converRep函数的运行
}
}
inline修饰的例子
inline fun converRep(conver: (String) -> Unit) {}
fun crossTest(){
converRep{
return 被允许,直接return 整个函数被return
}
println("return之后,将不会输出")
}
crossinline修饰的例子
inline fun converRep(crossinline +conver: (String) -> Unit) {}
fun crossTest(){
converRep{
// return 将不被允许
return@converRep 只能使用这种方式
}
println("return@之后,会正常输出")
}