Java swing实现音乐播放器桌面歌词字体变色效果

所属分类: 软件编程 / java 阅读数: 60
收藏 0 赞 0 分享

最近看到某音乐播放器的桌面歌词如下图

其中字母“U”有两种颜色,突发奇想想模仿一下实现文字变色。

思路:使用两种颜色分别把字符串绘制到两个BufferedImage中,然后根据两种颜色所占空间的比值分别擦除两个BufferedImage中的对应内容,最后再把两个BufferedImage合为一个。

效果图

可以通过以下代码更改两种颜色的比值

StringTwoColor stc = new StringTwoColor(jl1, Color.RED, Color.gray, 0.8);//0.8为比值

更改比值后的效果图

当然,也可以只使用一个字

以下是包含测试部分的完整代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class StringTwoColor{
 
 private BufferedImage buffImg;
 
 /**
 * @param label 显示字体的JLabel
 * @param c1 颜色1
 * @param c2 颜色2
 * @param ratio 颜色1与颜色2所占部分的比值
 */
 public StringTwoColor(JLabel label, Color c1, Color c2, double ratio){
 
 //获取字符串的宽(显示在屏幕上所占的像素px)
    FontMetrics metrics = label.getFontMetrics(label.getFont());
    int width = metrics.stringWidth(label.getText());
    int height = metrics.getHeight();
    height+=label.getFont().getSize();
  
    //构造一个具有指定尺寸及类型为预定义图像类型之一的 BufferedImage
 buffImg = new BufferedImage(width,height,BufferedImage.TYPE_4BYTE_ABGR);
 BufferedImage buffImg1 = new BufferedImage(width,height,BufferedImage.TYPE_4BYTE_ABGR);
 BufferedImage buffImg2 = new BufferedImage(width,height,BufferedImage.TYPE_4BYTE_ABGR);
 
 //通过BufferedImage创建一个 Graphics2D对象
 Graphics2D g1 = buffImg1.createGraphics();
 Graphics2D g2 = buffImg2.createGraphics();
 
 //设置抗锯齿
 g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
 //设置字体
 g1.setFont(label.getFont());
 g2.setFont(label.getFont());
 
 //设置颜色
 g1.setColor(c1);
 g2.setColor(c2);
 
 //画字符串
 g1.drawString(label.getText(), 0, height-label.getFont().getSize());
 g2.drawString(label.getText(), 0, height-label.getFont().getSize());
 
 //按照比例清除相关的像素点
 if(ratio<1 && ratio>0){
 
 int rgb = 0x00000000;
 
 //清除buffImg1
 for(int y=0;y<height;y++){
 for(int x=width-1;x>=width*ratio;x--){
  buffImg1.setRGB(x, y, rgb);
 }
 }
 
 //清除buffImg2
 for(int y=0;y<height;y++){
 for(int x=0;x<width*ratio;x++){
  buffImg2.setRGB(x, y, rgb);
 }
 }
 
 //写入buffImg
 for(int y=0;y<height;y++){
 for(int x=0;x<width*ratio;x++){
  buffImg.setRGB(x,y,buffImg1.getRGB(x, y));
 }
 }
 for(int y=0;y<height;y++){
 for(int x=width-1;x>=width*ratio;x--){
  buffImg.setRGB(x,y,buffImg2.getRGB(x, y));
 }
 }
 }
 }
 
 /**
 * 获取处理完的ImageIcon
 * @return
 */
 public ImageIcon getImageIcon(){
 
 Image img = buffImg;
 ImageIcon imgIcon = new ImageIcon(img);
 
 return imgIcon;
 }
 
 public static void main(String[] args) {
 
 JFrame jf = new JFrame();
 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 jf.setSize(300, 200);
 jf.setLocationRelativeTo(null);
 jf.setLayout(new BorderLayout());
 
 JLabel jl1 = new JLabel("梦");
 //JLabel jl1 = new JLabel("梦里梦到醒不来的梦");
 jl1.setFont(new Font("幼圆",Font.PLAIN,30));
 StringTwoColor stc = new StringTwoColor(jl1, Color.RED, Color.gray, 0.7);
 
 //获取处理完的图片并显示
 JLabel jl2 = new JLabel(stc.getImageIcon());
 jf.add(jl2, BorderLayout.CENTER);
 
 jf.setVisible(true);
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

SpringBoot环境搭建及第一个程序运行(小白教程)

这篇文章主要介绍了SpringBoot环境搭建及第一个程序运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

过滤器 和 拦截器的 6个区别(别再傻傻分不清了)

这篇文章主要介绍了过滤器 和 拦截器的 6个区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

SpringBoot整合SpringTask实现定时任务的流程

这篇文章主要介绍了SpringBoot整合SpringTask实现定时任务的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vscode快速引入第三方jar包发QQ邮件

这篇文章主要介绍了vscode快速引入第三方jar包发QQ邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java Enum和String及int的相互转化示例

这篇文章主要介绍了Java Enum和String及int的相互转化示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring boot如何快速的配置多个Redis数据源

这篇文章主要介绍了Spring boot如何快速的配置多个Redis数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JAVA 对接腾讯云直播的实现

这篇文章主要介绍了JAVA 对接腾讯云直播的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JavaSE static final及abstract修饰符实例解析

这篇文章主要介绍了JavaSE static final及abstract修饰符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

SpringBoot定时任务参数运行代码实例解析

这篇文章主要介绍了SpringBoot定时任务运行代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring Boot调用 Shell 脚本实现看门狗功能

这篇文章主要介绍了Spring Boot调用 Shell 脚本实现看门狗功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多