8

I ran into a problem while coding in Kotlin. I copy-pasted a java code sample that converts DP to Pixels, in order to place it as a parameter for setting padding programatically. I was expecting the IDE to automatically transform it all to Kotlin, however it failed in the process.

The code in Java looks like the following:

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

After the translation to Kotlin:

val scale = resources.displayMetrics.density
val dpAsPixels = (sizeInDp * scale + 0.5f) as Int 

The cast as Int is marked with the error

"This cast can never succeed"

How can this be fixed?

Zoe stands with Ukraine
  • 25,310
  • 18
  • 114
  • 149
S. Czop
  • 494
  • 5
  • 16

3 Answers3

18

Why not trying it with an Extension Function such as

val Int.dp: Int get() = (this / getSystem().displayMetrics.density).toInt()

to convert to DP and

val Int.px: Int get() = (this * getSystem().displayMetrics.density).toInt()

to convert to Pixels?

Hope it helps :)

pentexnyx
  • 609
  • 7
  • 16
5

The error can be solved by removing the cast as Int and instead replace it with the method .toInt()

val scale = resources.displayMetrics.density
val dpAsPixels = (16.0f * scale + 0.5f).toInt()
S. Czop
  • 494
  • 5
  • 16
3

If you have value in dimens.xml

<dimen name="textSize">24dp</dimen>

Then, you can get value in pixel as Int

val value = resources.getDimensionPixelSize(R.dimen.textSize)