Letter avatar like Gmail Android best practice

后端 未结 4 1950
既然无缘
既然无缘 2020-12-17 05:30

What is the best way of generating (in code) a letter avatar like in Gmail? Here you have an example https://drive.google.com/folderview?id=0B0Fhz5fDg1njSmpUakhhZllEWHM&

4条回答
  •  一整个雨季
    2020-12-17 06:22

    Below is a class that generates an Image avatar both a circle and Square. Source is here

        class AvatarGenerator {
        companion object {
        lateinit var uiContext: Context
        var texSize = 0F
    
        fun avatarImage(context: Context, size: Int, shape: Int, name: String): BitmapDrawable {
          uiContext = context
          val width = size
          val hieght = size
    
          texSize = calTextSize(size)
          val label = firstCharacter(name)
          val textPaint = textPainter()
          val painter = painter()
          val areaRect = Rect(0, 0, width, width)
    
          if (shape == 0) {
            painter.color = RandomColors().getColor()
          } else {
            painter.color = Color.TRANSPARENT
          }
    
          val bitmap = Bitmap.createBitmap(width, width, ARGB_8888)
          val canvas = Canvas(bitmap)
          canvas.drawRect(areaRect, painter)
    
          //reset painter
          if (shape == 0) {
            painter.color = Color.TRANSPARENT
          } else {
            painter.color = RandomColors().getColor()
          }
    
          val bounds = RectF(areaRect)
          bounds.right = textPaint.measureText(label, 0, 1)
          bounds.bottom = textPaint.descent() - textPaint.ascent()
    
          bounds.left += (areaRect.width() - bounds.right) / 2.0f
          bounds.top += (areaRect.height() - bounds.bottom) / 2.0f
    
          canvas.drawCircle(width.toFloat() / 2, hieght.toFloat() / 2, width.toFloat() / 2, painter)
          canvas.drawText(label, bounds.left, bounds.top - textPaint.ascent(), textPaint)
          return BitmapDrawable(uiContext.resources, bitmap)
    
        }
    
        private fun firstCharacter(name: String): String {
          return name.first().toString().toUpperCase()
        }
    
        private fun textPainter(): TextPaint {
          val textPaint = TextPaint()
          textPaint.textSize = texSize * uiContext.resources.displayMetrics.scaledDensity
          textPaint.color = Color.WHITE
          return textPaint
        }
    
        private fun painter(): Paint {
          return Paint()
        }
    
        private fun calTextSize(size: Int): Float {
          return (size / 3.125).toFloat()
        }
      }
    }
    

    You can then pass context, a string, size, and the shape to generate 1/0

        imageView.setImageDrawable(
          AvatarGenerator.avatarImage(
            this,
            200,
            1,
            "Skyways"
          )
    

提交回复
热议问题