如何在现有的自定义视图上绘制内容?

时间:2019-10-22 08:14:54

标签: android kotlin

我现在正在Android Studio中使用Kotlin制作android应用,并希望在已经绘制的自定义视图上绘制。

这个应用程序是简单的应用程序,用于显示带有串行端口的图形信息以及接收到的数据。实际上,我是Kotlin的新手,而Java / Android的新手。这是有问题的代码。

这是自定义视图的XML,(位于contraintlayout中)

<!--activity_main.xml-->
<androidx.constraintlayout.widget.ConstraintLayout ... >
    <com.(...).DrawUI
        android:id="@+id/DrawUI" ...
    />

尝试在此线程上调用绘图函数'DrawRxData(rxData)'

//BluetoothController.kt

class BluetoothClient(private val activity: MainActivity,
private val socket:BluetoothSocket): Thread() {
    override fun run() {
        ...
                if(inputStream.available() > 0) {
                    ...
                    inputStream.read(buffer)

                    val rxData = BluetoothRxParser(buffer)
                    DrawRxData(rxData)
                    ...
                }
        ...
    }
}

这是上面在XML上编写的DrawUI 我想在此视图上通过BluetoothController.kt中的调用函数绘制一些内容!

//DrawUI.kt

class DrawUI(context: Context, attrs: AttributeSet?) : View(context, attrs) {
    init {
        // initializing Paint()s
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        // measuring dimension and determine drawing sector
    }

    override fun onDraw(canvas: Canvas) {
        // drawing background
    }
}

我尝试在DrawUI类上使用Canvas,但无法正常工作。 也尝试制作位图,但是宽度和高度为零会发生错误。我该如何解决这个问题?

编辑

这种方式是我解决此问题的方式,也许还有另一个简单的解决方案。

  1. 创建的ImageView与XML上的DrawUI具有相同的大小
    <ImageView
        android:id="@+id/DrawRx" ...
    />
  1. 获取View并转换为ImageView,然后创建位图和画布。DrawRxData()在BluetoothClient类中。
    private fun DrawRxData (rxData: RxData) {
        val v : View = activity.findViewById(R.id.DrawRx)
        val iv : ImageView = v as ImageView
        val bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(bitmap)
        val paint = Paint(Paint.ANTI_ALIAS_FLAG)
        paint.setColor(Color.BLACK)

        canvas.drawCircle(50F, 50F, 10F, paint)
  1. 将位图附加到ImageView,但对于线程,它看起来像C#中的Dispatcher。 Reference
        activity.runOnUiThread(java.lang.Runnable {
            iv.setImageBitmap(bitmap)
        })

实际上只是重叠存在的视图,如果有有效的方法,请回答!

0 个答案:

没有答案