RenderingHints 参数

 

RenderingHints 类定义了多种着色微调,它们存储在一个映射集的 Graphics2D 对象里。setRenderingHint() 方法的参数是一个键以及对应的键值。在我们的代码中,第一个参数是代表 alpha 合成微调的键,第二个参数是该微调的值。该微调的其它可能的值有 VALUE_ALPHA_INTERPOLATION_DEFAULT,代表平台缺省值;以及 VALUE_ALPHA_INTERPOLATION_SPEED,代表追求速度而不是质量。

您还可以为下面的键提供微调:

描述
KEY_ANTIALIASING决定是否使用抗锯齿。当着色有倾斜角度的线时,通常会得到一组阶梯式的像素排列,使这条线看上去不平滑,经常被称为 锯齿状图形抗锯齿是一种技术,它设置有倾斜角度的线的像素亮度,以使线看起来更平滑。因此,这个微调是用来决定在着色有倾斜角度的线时是否在减少锯齿状图形上花费时间。可能的值有 VALUE_ANTIALIAS_ON, _OFF_DEFAULT
KEY_COLOR_RENDERING控制颜色着色的方式。可能的值有 VALUE_COLOR_RENDER_SPEED, _QUALITY_DEFAULT
KEY_DITHERING控制如何处理抖动。抖动是用一组有限的颜色合成出一个更大范围的颜色的过程,方法是给相邻像素着色以产生不在该组颜色中的新的颜色幻觉。可能的值有 VALUE_DITHER_ENABLE, _DISABLE_DEFAULT
KEY_FRACTIONALMETRICS控制显示文本的质量。可能的值有 VALUE_FRACTIONALMETRICS_ON, _OFF_DEFAULT
KEY_INTERPOLATION确定怎样做内插。

在对一个源图像做变形时,变形后的像素很少能够恰好对应目标像素位置。在这种情况下,每个变形后的像素的颜色值不得不由周围的像素决定。

内插就是实现上述过程。有许多可用的技术。可能的值,按处理时间从最多到最少,是 VALUE_INTERPOLATION_BICUBIC, _BILINEAR_NEAREST_NEIGHBOR
KEY_RENDERING确定着色技术,在速度和质量之间进行权衡。可能的值有 VALUE_RENDERING_SPEED, _QUALITY_DEFAULT
KEY_TEXT_ANTIALIASING确定对文本着色时是否抗锯齿。可能的值有 VALUE_TEXT_ANTIALIASING_ON, _OFF_DEFAULT

我们绕得已经够远了。让我们回到绘制 sprite 上……

抖音时间罗盘是一种根据系统时间动态变换背景颜色的效果,可以通过以下Java代码实现: ```java import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class DouyinTimeCompass extends JPanel implements ActionListener { private Timer timer; public DouyinTimeCompass() { timer = new Timer(1000, this); timer.start(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); int r = 200; int x = getWidth() / 2; int y = getHeight() / 2; RenderingHints rh = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHints(rh); drawBackground(g2d, x, y, r); drawHourHand(g2d, x, y, r, hour, minute); drawMinuteHand(g2d, x, y, r, minute, second); drawSecondHand(g2d, x, y, r, second); } private void drawBackground(Graphics2D g2d, int x, int y, int r) { int[] colors = {0xFFEEC900, 0xFF4285F4, 0xFF34A853, 0xFFEA4335}; int direction = Calendar.getInstance().get(Calendar.SECOND) % 4; g2d.setColor(new Color(colors[direction])); g2d.fillOval(x - r, y - r, 2 * r, 2 * r); } private void drawHourHand(Graphics2D g2d, int x, int y, int r, int hour, int minute) { int handRadius = (int) (r * 0.4); int angle = (int) ((hour + minute / 60.0) / 12 * 360 - 90); int handX = (int) (x + Math.cos(Math.toRadians(angle)) * handRadius); int handY = (int) (y + Math.sin(Math.toRadians(angle)) * handRadius); g2d.setColor(Color.white); g2d.drawLine(x, y, handX, handY); } private void drawMinuteHand(Graphics2D g2d, int x, int y, int r, int minute, int second) { int handRadius = (int) (r * 0.6); int angle = (int) ((minute + second / 60.0) / 60 * 360 - 90); int handX = (int) (x + Math.cos(Math.toRadians(angle)) * handRadius); int handY = (int) (y + Math.sin(Math.toRadians(angle)) * handRadius); g2d.setColor(Color.white); g2d.drawLine(x, y, handX, handY); } private void drawSecondHand(Graphics2D g2d, int x, int y, int r, int second) { int handRadius = (int) (r * 0.9); int angle = (int) ((second) / 60.0 * 360 - 90); int handX = (int) (x + Math.cos(Math.toRadians(angle)) * handRadius); int handY = (int) (y + Math.sin(Math.toRadians(angle)) * handRadius); g2d.setColor(Color.white); g2d.drawLine(x, y, handX, handY); } public void actionPerformed(ActionEvent e) { repaint(); } public static void main(String[] args) { JFrame frame = new JFrame("Douyin Time Compass"); DouyinTimeCompass compass = new DouyinTimeCompass(); frame.add(compass); frame.setSize(new Dimension(400, 400)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } } ``` 以上代码是通过Java Swing来实现抖音时间罗盘的效果。代码中使用了Timer类来定时更新界面,根据系统时间获取小时、分钟、秒钟,然后根据这些值计算时针、分针和秒针的位置,并在界面上绘制各个指针。同时,根据当前秒钟数的奇偶性来决定背景颜色的变换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值