Java swing实现音乐播放器桌面歌词字体变色效果
程序员文章站
2022-04-25 20:23:29
最近看到某音乐播放器的桌面歌词如下图
其中字母“u”有两种颜色,突发奇想想模仿一下实现文字变色。
思路:使用两种颜色分别把字符串绘制到两个bufferedimage...
最近看到某音乐播放器的桌面歌词如下图
其中字母“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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 大秦最后的名将章邯,仅靠一人不能挽救大秦
下一篇: 我的女友是*