欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-25 20:23:29
最近看到某音乐播放器的桌面歌词如下图 其中字母“u”有两种颜色,突发奇想想模仿一下实现文字变色。 思路:使用两种颜色分别把字符串绘制到两个bufferedimage...

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

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

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

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

效果图

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

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

stringtwocolor stc = new stringtwocolor(jl1, color.red, color.gray, 0.8);//0.8为比值

更改比值后的效果图

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

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

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

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

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);
 }
 
}

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