Я делаю Android-приложение с Kotlin в android studio и хочу рисовать на уже нарисованном пользовательском представлении.
Это простое приложение, отображающее графическую информацию с полученными данными через последовательный порт. На самом деле я новичок в Kotlin и новичок на Java / Android. Это код, который имеет проблемы.
Это XML пользовательского представления, (он находится в контринтауте)
<!--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)
...
}
...
}
}
И это DrawUI, который написал выше на XML. Я хочу нарисовать что-то в этом представлении с помощью функции вызова в 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
}
}
Я пытался использовать Canvas на DrawUIкласс, но он не работал должным образом. Также попытался сделать растровое изображение, но возникает ошибка, что ширина и высота равны нулю. Как я могу решить эту проблему?
РЕДАКТИРОВАТЬ
Таким образом, я решил эту проблему, может быть, есть другое и простое решение ..
- Создан ImageView, которыйимеет одинаковый размер с DrawUI на XML
<ImageView
android:id="@+id/DrawRx" ...
/>
Получите 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)
Прикрепить растровое изображение к ImageView, но для потока, это похоже на Dispatcher в C # ..
Ссылка activity.runOnUiThread(java.lang.Runnable {
iv.setImageBitmap(bitmap)
})
На самом деле только что перекрытое существующее представление, пожалуйста, ответьте, если есть работоспособныйспособ!