practicas - Soporte para pantalla hdpi de Java 9-imágenes de resolución múltiple-convención de nombres y carga en Windows
nomenclatura de variables (1)
Según estos artículos:
http://news.kynosarges.org/2015/06/29/javafx-dpi-scaling-fixed
https://twitter.com/michaelsamarin/status/729234779292483584
Java 9 debería admitir pantallas de PPP altas (escalado automático de PPP) en Swing. Lo probé en la última versión de Java 9 Early Access + en Zulu 9 y funciona y se ve muy bien.
No pude resolver solo una cosa: carga de imágenes de alta resolución / retina.
De acuerdo con los artículos (enlaces) de arriba y abajo, debe usar una convención de nombres de Apple ( @ 2x ):
image.png
, [email protected]
, [email protected]
, etc.
He probado estos métodos de carga:
Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("something/image.png"));
y
ImageIO.read(getClass().getResource("/something/image.png"));
Pero ninguno de estos trabajos (la única imagen base estaba cargada y borrosa).
De acuerdo a esto:
El primer método debe ser prometedor.
¿Alguien ha tenido alguna experiencia con esto (usando Swing o incluso JavaFX)? No estoy seguro de si estoy haciendo algo mal o esta característica no está implementada en la versión actual de prelanzamiento de Java 9 sofar.
Actualizar:
Debería ser posible:
También he intentado seguir las convenciones de nomenclatura (descritas here ):
Windows : image.scale-<dpi-value>.png (image.scale-140.png)
Linux : image.java-scale2x.png
Mac : [email protected] and image.java-scale2x.png
Sin embargo, no puedo encontrar ninguna solución de trabajo o información oficial. No lo entiendo - las pantallas de hdpi son comunes hoy en día y las aplicaciones de Java se ven como s ... en ellas.
Como parte del soporte de HiDPI , Java 9 introdujo el soporte de resolución múltiple a través de la interfaz java.awt.MultiResolutionImage y las clases java.awt.image.AbstractMultiResolutionImage y otros. A pesar de que son compatibles con Swing, ha habido bugs y misunderstandings en esta área.
Esos no existen en versiones anteriores de Java, por lo que si desea que sus usuarios puedan continuar ejecutándose con tiempos de ejecución anteriores, tendrá que escribir código para usar clases de imagen normales cuando se ejecute en JRE anteriores.
Para usarlos, haces algo como :
- Comience con un conjunto de imágenes con diferentes resoluciones:
Luego crea y carga el MultiResolutionImage:
List<Image> imgList = new ArrayList<Image>(); imgList.add(ImageIO.read(new File("320px-Eagle.jpg")); imgList.add(ImageIO.read(new File("800px-Eagle.jpg")); imgList.add(ImageIO.read(new File("1024px-Eagle.jpg")); imgList.add(ImageIO.read(new File("1280px-Eagle.jpg")); imgList.add(ImageIO.read(new File("Eagle.jpg")); MultiResolutionImage mrImage = new BaseMultiResolutionImage(imgList.toArray(new Image[0]));
Usa el objeto
mrImage
como cualquier otra imagen.
La convención de nomenclatura no tiene nada automático: la resolución de la imagen se toma del contenido del archivo de imagen.