How do I use the "long" color?

Android API 26 introduces new ways to handle color :

Colored longitudes are a representation provided in Android O for storing color in different color spaces, with greater precision than color longitudes.

We can now use new color spaces, for example:

    long longGreenColor = Color.pack(0.0f, 3.1415f, 0.0f, 1.0f, ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB));

      

Nice, long color. Now what?

  • Can NOT be usedandroid.graphics.Canvas

  • May NOT useandroid.graphics.Paint

  • May NOT be used inandroid.graphics.Bitmap

How should I use long color when painting?

For example:

    Bitmap bitmap = Bitmap.createBitmap(20, 20, Bitmap.Config.RGBA_F16, true, ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB));
    long longColor = Color.pack(0.0f, 3.1415f, 0.0f, 1.0f, ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB));

    bitmap.eraseColor(longColor);//ERROR
    bitmap.eraseColor(Color.toArgb(longColor));//BAD!
    bitmap.eraseColor((int) longColor);//WRONG!!!

    Paint paint = new Paint();
    paint.setColor(longColor);//ERROR

    Canvas canvas = new Canvas(bitmap);
    canvas.drawPoint(1, 1, paint);

      

+3


source to share


1 answer


Color instances are immutable and can be instantiated using one of the various valueOf methods. For example:

// sRGB
 Color opaqueRed = Color.valueOf(0xffff0000); // from a color int
 Color translucentRed = Color.valueOf(1.0f, 0.0f, 0.0f, 0.5f);

 // Wide gamut color
 @ColorLong long p3 = pack(1.0f, 1.0f, 0.0f, 1.0f, colorSpaceP3);
 Color opaqueYellow = Color.valueOf(p3); // from a color long

 // CIE L*a*b* color space
 ColorSpace lab = ColorSpace.get(ColorSpace.Named.LAB);
 Color green = Color.valueOf(100.0f, -128.0f, 128.0f, 1.0f, lab);

      



More information: https://developer.android.com

+1


source







All Articles