美文网首页
Kotlin自定义 View - 画一幅实时心电测量图

Kotlin自定义 View - 画一幅实时心电测量图

作者: 碧云天EthanLee | 来源:发表于2021-08-18 16:32 被阅读0次
概述

在前几期自定义 View的文章里,有一篇是画了一幅实时心电测量图
。这次再重画一遍,用 Kotlin画。因为逻辑原理与上次画的一样,只是换了科特林。所以原理这里就不讲了,就直接贴出代码。并总结部分语法区别,自己看就好。

心电图

代码:

class ECGRealTimeChartKt : BaseChartKt {
    private val TAG = "ECGRealTimeChart"
    // 画网格
    private lateinit var mBackgroundDrawer: GridDrawerKt
    // 画曲线
    private lateinit var mPathDrawerKt: PathDrawerKt
    // 画单位
    private lateinit var mNumericalUnitDrawerKt: NumericalUnitDrawerKt
    // 没数据来时才去设置参数以及滑动
    private var noDataComing = false

    constructor(context: Context) : this(context, null)

    constructor(context: Context, attributeSet: AttributeSet?) : this(context, attributeSet, 0)

    constructor(context: Context, attributeSet: AttributeSet?, defStyle: Int) :
            super(context, attributeSet, defStyle) {
            init(context, attributeSet, defStyle)
    }

    private fun init(context: Context, attributeSet: AttributeSet?, defStyle: Int) {
        this.mBackgroundDrawer = GridDrawerKt(this)
        this.mPathDrawerKt =  PathDrawerKt(this)
        this.mNumericalUnitDrawerKt =  NumericalUnitDrawerKt(this)
    }

    /**
     * @param noData 没数据来了
     */
    public fun setNoDataComing(noData: Boolean) {
        this.noDataComing = noData
    }

    public fun getNoDataComing(): Boolean {
        return this.noDataComing;
    }

    /**
     * 设置横坐标每大格内显示的数据点数,即 X轴方向的增益
     *
     * @param numbersPerGrid 数据点
     */
    public fun setDataNumbersPerGrid(numbersPerGrid: Int){
        this.mPathDrawerKt.setDataNumbersPerGrid(numbersPerGrid)
    }

    /**
     * @return 横坐标每大格点数
     */
    public fun getDataNumbersPerGrid(): Int{
        return this.mPathDrawerKt.getDataNumbersPerGrid()
    }

    /**
     * 设置纵坐标每大格代表多少毫伏,即纵坐标增益
     *
     * @param mv 毫伏
     */
    public fun setMvPerLargeGrid(mv: Float){
        this.mPathDrawerKt.setMvPerLargeGrid(mv)
    }

    /**
     * @return 纵坐标每大格毫伏数
     */
    public fun getMvPerLargeGrid(): Float{
        return this.mPathDrawerKt.getMvPerLargeGrid()
    }


    /**
     * @return 每小格边长
     */
    public fun getGridSpace(): Float {
        return mBackgroundDrawer.getGridSpace()
    }

    /**
     * 清除数据
     */
    public fun clearData() {
        this.mPathDrawerKt.clearData()
        this.mPathDrawerKt.reset()
        scrollTo(0, 0)
    }

    /**
     * @param data 添加数据
     */
    public fun addData(data: IntArray) {
        this.mPathDrawerKt.addData(data)
    }

    /**
     * @param data 添加数据
     */
    public fun addData(data: Int) {
        this.mPathDrawerKt.addData(data)
    }

    /**
     * @param data 添加数据
     */
    public fun addData(data: List<Int>) {
        this.mPathDrawerKt.addData(data)
    }

    /**
     * 获取当前数据
     */
    public fun getData(): List<Int> {
        return this.mPathDrawerKt.getData()
    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        mBackgroundDrawer.onSizeChange()
        mPathDrawerKt.onSizeChange()
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        setBackgroundColor(Color.parseColor("#dd000000"))
    }

    override fun onDraw(canvas: Canvas) {
        this.mBackgroundDrawer.onDraw(canvas)
        this.mPathDrawerKt.onDraw(canvas)
        this.mNumericalUnitDrawerKt.onDraw(canvas)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        if (!getNoDataComing()) return false
        return mPathDrawerKt.onTouchEvent(event)
    }

    override fun computeScroll() {
        this.mPathDrawerKt.computeScroll()
    }
}

完整代码:心电图

总结两条语法区别:
1、java的 switch
java:

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // ......
                break;
            case MotionEvent.ACTION_MOVE:
                // ......
                break;
            case MotionEvent.ACTION_UP:
                // ......
                break;
        }

Kotlin :

        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                // ......
            }
            MotionEvent.ACTION_MOVE -> {
                // ......
            }
            MotionEvent.ACTION_UP -> {
                // ......
            }
        }

2、三目运算符
java:

boolean is = false;
int num = if(is) ? 0 : 1;

Kotlin :

var is = false
var num = if(is) 0 else 1

3、开子线程
java:

new Thread(() -> {
 // ......
}).start();

Kotlin:

Thread{
// ......
}.start()

相关文章

网友评论

      本文标题:Kotlin自定义 View - 画一幅实时心电测量图

      本文链接:https://www.haomeiwen.com/subject/zbigbltx.html