转自http://www.eoeandroid.com/forum.php?mod=viewthread&tid=229066




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


一个精美的java时钟 (自动换背景 秒针平滑移动) - 云代码http://yuncode.net/code/c_50a4b7d13f80f60

更多相关文章

  1. android GPS 获取位置
  2. 00015-相对布局位置属性
  3. Android对话框的高级设置《二》设置对话框按钮的透明度和对话框
  4. Android之GPS定位网上详解总结
  5. [android]Activity切换动画
  6. Android常用的技术点
  7. Android(安卓)自定义充电动画
  8. 设置Android程序的默认安装位置
  9. 安卓课程二十一 SeekBar拖动控件的使用

随机推荐

  1. golang gin框架错误处理
  2. golang中创建错误的方法
  3. golang chan是否关闭
  4. golang web开发乱码的原因与解决方法
  5. golang与java语法上的区别
  6. golang-cache是全局吗
  7. golang中使用rand产生随机不重复数字
  8. golang中fscanf读取文件时把回车替换成0
  9. golang 包怎么调用
  10. golang 1.9什么时候发布