|
|
|
package com.fr.design.utils;
|
|
|
|
|
|
|
|
import com.fr.base.svg.SVGLoader;
|
|
|
|
import com.fr.base.svg.SystemScaleUtils;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
|
|
|
|
import java.awt.Graphics;
|
|
|
|
import java.awt.Graphics2D;
|
|
|
|
import java.awt.Image;
|
|
|
|
import java.awt.image.ImageObserver;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 用于绘制svg图片缩放(高分屏下)
|
|
|
|
*
|
|
|
|
* @author hades
|
|
|
|
* @since 11.0
|
|
|
|
* Created on 2022/5/6
|
|
|
|
*/
|
|
|
|
public class SvgDrawUtils {
|
|
|
|
|
|
|
|
private static final boolean HI_DPI_ENABLED = SystemScaleUtils.isJreHiDPIEnabled();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 绘制svg前若环境支持高清化则对缩放比例进行适配
|
|
|
|
* */
|
|
|
|
public static void beforeDraw(Graphics2D g2) {
|
|
|
|
if (HI_DPI_ENABLED) {
|
|
|
|
g2.scale(1 / SVGLoader.SYSTEM_SCALE, 1 / SVGLoader.SYSTEM_SCALE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 绘制svg后还原缩放矩阵
|
|
|
|
* */
|
|
|
|
public static void afterDraw(Graphics2D g2) {
|
|
|
|
if (HI_DPI_ENABLED) {
|
|
|
|
g2.scale(SVGLoader.SYSTEM_SCALE, SVGLoader.SYSTEM_SCALE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算高缩放下绘制svg图标时新的的位置x,y
|
|
|
|
* @param position 旧坐标的值
|
|
|
|
* @return 新的position值
|
|
|
|
* */
|
|
|
|
public static int calculatePosition(int position) {
|
|
|
|
return HI_DPI_ENABLED ? (int) (position * SVGLoader.SYSTEM_SCALE) : position;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 绘制svg图像的完整逻辑
|
|
|
|
* @param graphics 绘图
|
|
|
|
* @param svgDraw 具体绘制逻辑
|
|
|
|
* */
|
|
|
|
public static void doDrawSVG(@NotNull Graphics graphics, @NotNull final SvgDraw<Graphics> svgDraw) {
|
|
|
|
SvgDrawUtils.beforeDraw((Graphics2D) graphics);
|
|
|
|
svgDraw.drawSVG();
|
|
|
|
SvgDrawUtils.afterDraw((Graphics2D) graphics);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 绘制前对坐标x和y进行处理
|
|
|
|
* @param graphics 绘图
|
|
|
|
* @param image svg的Image对象
|
|
|
|
* @param x x坐标
|
|
|
|
* @param y y坐标
|
|
|
|
* @param imageObserver 图像观察器
|
|
|
|
* */
|
|
|
|
public static void drawImage(Graphics graphics, Image image, int x, int y, ImageObserver imageObserver) {
|
|
|
|
//如果环境支持高清化,在调整缩放比例时绘制svg会影响到位置的变化,若图标无确定裁剪位置,则需要进行调整
|
|
|
|
graphics.drawImage(image, SvgDrawUtils.calculatePosition(x), SvgDrawUtils.calculatePosition(y), imageObserver);
|
|
|
|
}
|
|
|
|
}
|