Анимация графических примитивов внутри элементов списка
Есть список(RecyclerView) элементы которого содержат картинки. Картинки содержат движущиеся линии.
В адаптере передается номер элемента списка через функцию initData. Но в функции onDraw значение переменной(itemId) принимающей номер элемента списка не меняется, почему?
Этот номер нужен что-бы картинки были разными.
Есть вариант отрисовывать внутри onBindViewHolder, но тогда не понятно как делать анимации и как рисовать не используя Bitmap. Потому, что когда я использовал Bitmap внутри класса CustomView анимации заметно лагали(хотя это были просто две вращающиеся линии).
Фрагмент кода адаптера:
override fun onBindViewHolder(holder: UsersViewHolder, position: Int) {
val context = holder.itemView.context
val cv = CustomView(context)
cv.initData(position) // передача номера элемента списка
}
Фрагмент кода с отрисовкой:
class CustomView : ImageView {
constructor(context: Context) : super(context) {init()}
constructor(context: Context, attrst: AttributeSet?) : super(context, attrst) {init()}
constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {init()}
private var itemId = 0
private var colCount = 3
private var imgWidth = (1440/colCount-3.5*4).toFloat()
private var imgHeight = (90*3.5-3.5*4).toFloat()
private var angle = 0f
fun initData(id: Int) {
itemId = id // прием номера элемента списка
}
private fun init() {
val dm = DisplayMetrics()
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
wm.defaultDisplay.getMetrics(dm)
val screenWidth = dm.widthPixels
val dpx = dm.densityDpi.toFloat()/160
imgWidth = screenWidth/colCount-4*dpx // 4 = padding(2dp) * 2
imgHeight = 90*dpx-4*dpx
}
public override fun onDraw(canvas: Canvas) {
val paint = Paint()
paint.strokeWidth = 2f
canvas.save()
canvas.rotate(angle,imgWidth/2,imgHeight/2)
if (itemId==0) {paint.color = Color.RED}
else {paint.color = Color.YELLOW}
canvas.drawLine(0f, 0f, imgWidth/2, imgHeight/2, paint)
paint.color = Color.BLUE
canvas.drawLine(imgWidth/2, imgHeight/2, imgWidth, imgHeight, paint)
canvas.restore()
paint.textSize = 52f
canvas.drawText("$itemId", 0f, 50f, paint) // почему-то номер элемента не меняется
angle = (angle + 5) % 360 // для анимации
postInvalidateDelayed(50); // для анимации
}
}