Home > Enterprise >  Why is Android Paint strokeWidth default value suddenly different?
Why is Android Paint strokeWidth default value suddenly different?

Time:01-21

Background

I have an app in the cyapass grid default

The grey lines between the (red) posts are drawn with the following method:

  private fun DrawGridLines() {
        val paint = Paint()
        for (y in 0..numOfCells) {
            xCanvas!!.drawLine(
                (0   leftOffset).toFloat(), (y * cellSize   topOffset).toFloat(),
                (numOfCells * cellSize   leftOffset).toFloat(),
                (y * cellSize   topOffset).toFloat(), paint
            )
        }

        for (x in 0..numOfCells) {
            xCanvas!!.drawLine(
                (x * cellSize   leftOffset).toFloat(), (0   topOffset).toFloat(),
                (x * cellSize   leftOffset).toFloat(), (numOfCells * cellSize   topOffset).toFloat(),
                paint
            )
        }

    }

The Problem

While working on updates to the app I ran it on the emulator and saw the following:

grid lines are not there

As you can see the gridlines are drawn properly. Very odd since it seems to be drawing partial grid lines. NOTE: I ran this on numerous API versions and they all draw the grid lines this way now.

paint.strokeWidth = 0.0

I added some code to examine the value of paint.strokeWidth but that is additionally odd. It shows that the value of strokeWidth is always 0.0.

You can see that in my logcat output:

logcat shows always 0.0

The Fix

Yes, I can simply fix this by explicitly setting the value myself.

I added the following line of code to the routine above:

paint.strokeWidth = 5F;

Now it looks like the following: grid is drawn properly

However, I'd like to know why this has suddenly occurred??

I'd also like to know how it seems to draw "some" of the lines since the value of the strokeWidth is actually 0.0???

CodePudding user response:

The first thing I see in your code is that nowhere the Paint gets configured or its strokeWidth assigned a value. You need to set specific values and not use defaults, as defaults don't take into consideration display densities neither may have a valid usable value at all.

In the next sniped of your code you instantiate a new Paint instance and use it straight away without setting any properties to it:

private fun DrawGridLines() {
        val paint = Paint()
        for (y in 0..numOfCells) {
             xCanvas!!.drawLine(....
            "Here using already the new paint??? where did you configure it?"

Secondly, notice that Paint.strokeWidth units are in pixels, therefore you need to take into account the device display density and adjust to it.

for example:

val DEFAULT_SIZE_PX = 5.0f
    
val scaledWidth = DEFAULT_SIZE_PX * context
        .resources
        .displayMetrics
        .density
    
paint.strokeWidth = scaledWidth

Or, which is the same as:

val DEFAULT_SIZE_PX = 5.0f
val displayMetrics = context.resources.displayMetrics
val scaledWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_SIZE_PX, displayMetrics)
paint.strokeWidth = scaledWidth

CodePudding user response:

The official docs on strokeWidth uses hairline

"Hairlines always draw a single pixel..."

I suppose the way that is handled is now probably handled differently and has this type of effect on output now. Or it is related to the density issue. Either way, it is odd that it has changed. And interesting/odd that it states that you can set it to 0 for hairline output.

  •  Tags:  
  • Related