一个java时钟 非常精致!

一个精美的java时钟 (自动换背景 秒针平滑移动)

 

 

 

 

部分核心代码:

  
  
  
  
  1. public void paint(Graphics g1) {  
  2.     // Graphics2D继承Graphics,比Graphics提供更丰富的方法  
  3.     Graphics2D g = (Graphics2D) g1;  
  4.  
  5.     /** ***画圆形时钟的刻度,每6度便有一个刻度**** */ 
  6.     for (int i = 0; i < 360; i = i + 6) {  
  7.         g.setColor(Color.gray);  
  8.         // 设置画笔的宽度为2  
  9.         g.setStroke(new BasicStroke(2));  
  10.  
  11.         // 画刻度  
  12.         if (i % 90 == 0) {  
  13.             // 对于0,3,6,9点位置,使用一个大的刻度  
  14.             g.setColor(Color.pink);  
  15.             g.setStroke(new BasicStroke(7));// 画笔宽度为5  
  16.             // 当起点和终点一样时,画的就是点  
  17.             g.drawLine(  
  18.                     CIRCLE_X  
  19.                             + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS),  
  20.                     CIRCLE_Y  
  21.                             + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS),  
  22.                     CIRCLE_X  
  23.                             + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS),  
  24.                     CIRCLE_Y  
  25.                             + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS));  
  26.         } else if (i % 30 == 0) {  
  27.             // 如果角度处于小时的位置,而且还不在0,3,6,9点时,画红色的小刻度  
  28.             g.setColor(Color.orange);  
  29.             g.setStroke(new BasicStroke(3));// 画笔宽度为3  
  30.             g.drawLine(  
  31.                     CIRCLE_X  
  32.                             + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS),  
  33.                     CIRCLE_Y  
  34.                             + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS),  
  35.                     CIRCLE_X  
  36.                             + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS),  
  37.                     CIRCLE_Y  
  38.                             + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS));  
  39.         } else {  
  40.             // 其他位置就画小刻度  
  41.             g.setColor(Color.gray);  
  42.             g.drawLine(  
  43.                     CIRCLE_X  
  44.                             + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS),  
  45.                     CIRCLE_Y  
  46.                             + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS),  
  47.                     CIRCLE_X  
  48.                             + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS),  
  49.                     CIRCLE_Y  
  50.                             + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS));  
  51.         }  
  52.     }  
  53.  
  54.     /** ****** 画时钟的指针 ******** */ 
  55.     // 画时针  
  56.     Line2D.Double lh = new Line2D.Double(CIRCLE_X, CIRCLE_Y, CIRCLE_X  
  57.             + Math.cos((arcHour - 90) * Math.PI / 180) * HOUR_LENGTH,  
  58.             CIRCLE_Y + Math.sin((arcHour - 90) * Math.PI / 180)  
  59.                     * HOUR_LENGTH);  
  60.     // 设置画笔宽度和颜色  
  61.     g.setStroke(new BasicStroke(8));  
  62.     g.setColor(Color.pink);  
  63.     // 利用Graphics2D的draw方法画线  
  64.     g.draw(lh);  
  65.  
  66.     // 画分针  
  67.     Line2D.Double lm = new Line2D.Double(CIRCLE_X, CIRCLE_Y, CIRCLE_X  
  68.             + Math.cos((arcMin - 90) * Math.PI / 180) * MIN_LENGTH,  
  69.             CIRCLE_Y + Math.sin((arcMin - 90) * Math.PI / 180)  
  70.                     * MIN_LENGTH);  
  71.     g.setStroke(new BasicStroke(4));  
  72.     g.setColor(Color.orange);  
  73.     g.draw(lm);  
  74.  
  75.     // 画秒针  
  76.     Line2D.Double ls = new Line2D.Double(CIRCLE_X, CIRCLE_Y, CIRCLE_X  
  77.             + Math.cos((arcSec - 90) * Math.PI / 180) * SEC_LENGTH,  
  78.             CIRCLE_Y + Math.sin((arcSec - 90) * Math.PI / 180)  
  79.                     * SEC_LENGTH);  
  80.     g.setStroke(new BasicStroke(1));  
  81.  
  82.     g.setColor(Color.lightGray);  
  83.     g.draw(ls);  
  84.  
  85.     /** **** 画时钟背景,并将其透明处理 ******* */ 
  86.     // 所有使用bufferedImageGraphics画的图像,都画在bufferedImage上,  
  87.     // drawImage方法的参数含义分别是:背景图片对象、目标位置第一个角的X、Y坐标、目标位置第二个角的X、Y坐标、  
  88.     // 源位置第一个角的X、Y坐标、源位置第二个角的X、Y坐标、图像对象改变时的通知接受者  
  89.     bufferedImageGraphics.drawImage(img[imageID], 00, imageSize,  
  90.             imageSize, 00, imageSize + 10, imageSize + 10this);  
  91.     // 将背景图片透明化  
  92.     for (int j = 0; j < imageSize; j++) {  
  93.         for (int i = 0; i < imageSize; i++) {  
  94.             // 获得背景图像中(i, j)坐标的颜色值  
  95.             int pix = bufferedImage.getRGB(i, j);  
  96.             Color c = new Color(pix);  
  97.             int R = c.getRed();  
  98.             int G = c.getGreen();  
  99.             int B = c.getBlue();  
  100.             // 通过Color对象的alpha,使颜色透明。  
  101.             int newpix = new Color(R, G, B, alpha).getRGB();  
  102.             // 重新设置背景图像该象素点的颜色  
  103.             bufferedImage.setRGB(i, j, newpix);  
  104.         }  
  105.     }  
  106.  
  107.     /** 以上画背景操作都是画在bufferedImage上的,这里要将bufferedImage画在ClockLabel **/ 
  108.     // 将当前用户剪贴区 Clip 与椭圆区域相交,并将 Clip 设置为所得的交集  
  109.     g.clip(new Ellipse2D.Double(9545, imageSize, imageSize));  
  110.     g.setColor(Color.white);  
  111.     // 在用户剪贴区画bufferedImage  
  112.     g.drawImage(bufferedImage, 9545this);  
  113. }  

 

你可能感兴趣的:(java,时钟,平滑移动,背景自动换)