分类 Kotlin 下的文章

主要用:HorizontalScrollView 实现,然后里面放一个LinearLayout 就可以。
为什么用HorizontalScrollView ,如果用其它View窗口。LinearLayout 显示区以外的可能不显示
再使用动画类实现移动跟循环。喜欢封装的可以自己继续然后再用循环做

    for (item in logs) {
        createItem(item)
    }
    createItem(logs[0])

    MainScope().launch(Dispatchers.Main) {
        delay(100)
        loop2()
    }
}

private fun loop2(){
    val width = xxxLine.measuredWidth

    // 第一个多创一下。用于做动画
    var w1 = xxxLine[0].measuredWidth
    val w2 = xxxLine.measuredWidth
    var dx = width - w1 + (w2 - w1).coerceAtMost(0)

    val anim = ObjectAnimator.ofFloat(xxxLine, "translationX", 0.0f, -dx.toFloat())
    anim.duration = width * 10L
    anim.interpolator = LinearInterpolator() // 匀速
    anim.repeatCount = ValueAnimator.INFINITE // 循环
    anim.start()
}

禁掉HorizontalScrollView 的事件和android:scrollbarSize="0dp"就可能完美显示

hsXXX.setOnTouchListener { _, _ -> return@setOnTouchListener true }

常用功能,其它上网就可以:

//状态栏
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'

在每个ActivityOnCreate方法增加这个就可以

ImmersionBar.with(this)
    .transparentBar() // 透明
    .hideBar(BarHide.FLAG_HIDE_BAR) // 隐藏状态和导航条
    .init()

先引入库:

implementation 'com.tencent:mmkv-static:1.2.10'

这封装一个类

import android.widget.EditText
import android.widget.TextView
import androidx.annotation.Nullable
import com.tencent.mmkv.MMKV
import kotlinx.android.synthetic.main.activity_login_by_password.*
import java.lang.Exception

/**
 * 保存本地数据KEY
 */
object Save {
    /**
     * 常用保存
     */
    fun set(key: String, @Nullable value: Any) {
        when (value) {
            is String -> MMKV.defaultMMKV().encode(key, value)
            is Boolean -> MMKV.defaultMMKV().encode(key, value)
            is Long -> MMKV.defaultMMKV().encode(key, value)
            is Int -> MMKV.defaultMMKV().encode(key, value)
            is Double -> MMKV.defaultMMKV().encode(key, value)
            is Float -> MMKV.defaultMMKV().encode(key, value)
            else -> throw Exception("暂时不支持这类型");
        }
    }

    /**
     * 读取
     */
    fun get(key: String): String? {
        return MMKV.defaultMMKV().decodeString(key)
    }
    fun getLong(key: String): Long {
        return MMKV.defaultMMKV().decodeLong(key)
    }
    fun getInt(key: String): Int {
        return MMKV.defaultMMKV().decodeInt(key)
    }
    fun getBool(key: String): Boolean {
        return MMKV.defaultMMKV().decodeBool(key)
    }
    fun getDouble(key: String): Double {
        return MMKV.defaultMMKV().decodeDouble(key)
    }
    fun getFloat(key: String): Float {
        return MMKV.defaultMMKV().decodeFloat(key)
    }

    /**
     * 直接将值保存到EditText
     */
    fun setEditText(key: String, edit: EditText) {
        var value = MMKV.defaultMMKV().decodeString(key)
        value.let {
            edit.setText(it)
        }
    }

    /**
     * 直接将值保存到TextView
     */
    fun setTextView(key: String, edit: TextView) {
        var value = MMKV.defaultMMKV().decodeString(key)
        value.let {
            edit.text = it
        }
    }
}

类型判断并且转成类型:

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

范围:
when (x) {

    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}