Это моя первая попытка создания пользовательских видов в Android. Тем не менее, я, кажется, что-то пропустил и не знаю, как отладить проблему. Я написал собственный вид для рисования диаграммы в Android с их значениями ниже столбцов. Мой метод onDraw в коде выглядит следующим образом:
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
if (mBars == null) {
return
}
canvas.save()
val rectBaseLine = measuredHeight * FRACTIONAL_MAX_BAR_HEIGHT + convertDpToPixel(TOP_MARGIN_FOR_BAR, context);
canvas.translate(0f, rectBaseLine.toFloat())
mBars.forEach {
canvas.drawRoundRect(it.mRect,
BAR_CORNER_RADIUS, BAR_CORNER_RADIUS,
mapToPaints.getValue(it.paintType))
var textWidth = textPaint.measureText(it.num.toString())
canvas.drawText(it.num.toString(),
it.mRect.left + (it.mRect.right - it.mRect.left) / 2 - textWidth / 2,
convertSpToPixel(TEXT_SIZE, context) + convertDpToPixel(DISTANCE_BW_TEXT_N_BAR, context),
mapToTextPaints.getValue(it.paintType))
}
canvas.restore()
}
fun prepareBarsArr(arr: IntArray) {
val max = arr.max();
val viewHeight = measuredHeight
val rectHeight = measuredHeight * FRACTIONAL_MAX_BAR_HEIGHT /*- ( convertSpToPixel(TEXT_SIZE, context) + convertDpToPixel(DISTANCE_BW_TEXT_N_BAR, context))*/;
val width = measuredWidth
widthPerBar = (width - INTER_BAR_GAP * (arr.size - 1)) / arr.size
var currentX = -widthPerBar - INTER_BAR_GAP
mBars = Array<BarDetails>(arr.size, {
val desiredHeight = arr[it] * rectHeight / max!!
currentX += widthPerBar + INTER_BAR_GAP
val mRect = RectF(currentX.toFloat(), 0f, (currentX + widthPerBar).toFloat(), (-desiredHeight).toFloat());
BarDetails(mRect, arr[it], STATEPAINTS.NORMAL)
});
invalidate()
}
mBars хранит информацию, связанную с Bar, например: объект Rect, числовое значение (которое помогает определить высоту бара), используемую краску и т. Д.
Проблема в том, что этот код отлично работает на эмуляторе, но на моем устройстве (с использованием Lenovo Zuk Z2 Plus) он не рисует столбцы. Я проверил несколько постов и попробовал разные комбинации с hardwareAccelerated = "true / false"
и drawRoundRect / drawRect и т. д. Была только 1 комбинация, в которой столбцы отображались на моем устройстве, что было, когда hardwareAccelerated было ложно, и я использовал drawRect. Однако, когда я использую RoundedRect, столбцы не отображаются. Не знаю, относится ли это к конкретной проблеме, так как у меня есть только 1 устройство для тестирования. В любом случае, некоторые пункты о том, как отладить это, были бы полезны.