Search code examples
androidcanvastextright-alignleftalign

Adding text on the left and right sides of Canvas


I'm creating a custom canvas as shown below with Text that is on the left side and also need text on the right as shown in the image below. I've got part of the text on the left side but how do I get the text to show on the left and right in a canvas?

Here's what I'd like to show :

enter image description here

Current Code:

private val textSize: Float = 70.toFloat()
private val groupSpacing = 100
private val paint = Paint()
init {
    paint.textSize = textSize
}
override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
    for (i in 0 until parent.childCount) {
        val view = parent.getChildAt(i)
        val position = parent.getChildAdapterPosition(view)
        if (position == 0) {
            c.drawText("  Default", view.left.toFloat(),
                    view.top - groupSpacing / 2 + textSize / 3, paint)
        } else if (position == 1) {
            c.drawText("  Other", view.left.toFloat(),
                    view.top - groupSpacing / 2 + textSize / 3, paint)
        }
    }
}

The code above only shows Default


Solution

  • I was able to achieve this via :

    class CustomItemDecorator(context: Context) : RecyclerView.ItemDecoration() {
        private var textSize: Float
        private val groupSpacing = 100
        private val paint = Paint()
        private val dragPaint = Paint()
    
        init {
            val dpSize: Int = context.resources.getDimensionPixelSize(R.dimen.decorator_font_size)
            textSize = dpSize * context.resources.displayMetrics.scaledDensity
            paint.textSize = textSize
    
    
            paint.color = context.resources.getColor(R.color.venue_grey)
            paint.typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD)
    
            dragPaint.textSize = textSize
            dragPaint.color = context.resources.getColor(R.color.venue_grey)
        }
    
        override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
            super.onDrawOver(c, parent, state)
            for (i in 0 until parent.childCount) {
                val view = parent.getChildAt(i)
                val position = parent.getChildAdapterPosition(view)
                if (position == 0) {
                    paint.textAlign = Paint.Align.LEFT
                    c.drawText("DEFAULT", 35f,
                            view.top - groupSpacing / 2 + textSize / 3, paint)
                    dragPaint.textAlign = Paint.Align.RIGHT
                    c.drawText("Some Text that is off to the right", view.right.toFloat() - 30,
                            view.top - groupSpacing / 2 + textSize / 3, dragPaint)
                } else if (position == 1) {
                    val x = view.x + 30
                    view.width
                    //the alignment below may need to be adjusted to 80 or 90?
                    paint.textAlign = Paint.Align.LEFT
                    c.drawText("OTHER", 35f,
                            view.top - groupSpacing / 2 + textSize / 3, paint)
                }
            }
        }
    
        override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
            if (parent.getChildAdapterPosition(view) == 0 || parent.getChildAdapterPosition(view) == 1) {
                outRect.set(0, groupSpacing, 0, 0)
            }
        }
    }