자바 스윙 음악 재생 기 데스크 톱 가사 글꼴 변색 효과 구현

최근 한 음악 재생 기 를 본 데스크 톱 가 사 는 다음 과 같다.

그 중에서 자모'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);
 }
 
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기