| 14 | | class RoundRectButtonSprite extends flash.display.Sprite |
| 15 | | { |
| 16 | | import flash.display.*; |
| 17 | | import flash.geom.Matrix; |
| 18 | | |
| 19 | | protected var mBorderColor:uint; |
| 20 | | protected var mLeftRounded:Boolean; |
| 21 | | protected var mRightRounded:Boolean; |
| 22 | | protected var mR:Number = 6; |
| 23 | | protected const APOS:Number = 0.292893219; |
| 24 | | |
| 25 | | private var mGradColors:Array; |
| 26 | | private var mGradAlphas:Array; |
| 27 | | private var mGradRatios:Array; |
| 28 | | private var mGradMatrix:Matrix; |
| 29 | | private var mHighlightBorderColor:uint = 0xffffff; |
| 30 | | |
| 31 | | public function RoundRectButtonSprite(leftr:Boolean, rightr:Boolean) |
| 32 | | { |
| 33 | | createGradients(22); |
| 34 | | |
| 35 | | mLeftRounded = leftr; |
| 36 | | mRightRounded = rightr; |
| 37 | | redraw(32, 22); |
| 38 | | } |
| 39 | | |
| 40 | | protected function createGradients(h:Number):void |
| 41 | | { |
| 42 | | mGradColors = [0xf0f0f0, 0xd0d0d0]; |
| 43 | | mGradAlphas = [1 , 1 ]; |
| 44 | | mGradRatios = [0, 255]; |
| 45 | | mGradMatrix = new Matrix(); |
| 46 | | mGradMatrix.createGradientBox(h, h, Math.PI / 2, 0, 0); |
| 47 | | } |
| 48 | | |
| 49 | | public function redraw(w:Number, h:Number):void |
| 50 | | { |
| 51 | | var g:Graphics = graphics; |
| 52 | | |
| 53 | | g.lineStyle(); |
| 54 | | g.beginGradientFill(GradientType.LINEAR, mGradColors, mGradAlphas, mGradRatios, mGradMatrix); |
| 55 | | drawBorder(g, w, h, 0, false); |
| 56 | | g.endFill(); |
| 57 | | |
| 58 | | g.lineStyle(1, mHighlightBorderColor, 0.5, true); |
| 59 | | drawBorder(g, w, h, 1, false); |
| 60 | | |
| 61 | | g.lineStyle(1, mBorderColor, 0.3, true); |
| 62 | | drawBorder(g, w, h, 0, false); |
| 63 | | } |
| 64 | | |
| 65 | | protected function drawBorder(g:Graphics, w:Number, h:Number, padding:Number, opened:Boolean):void |
| 66 | | { |
| 67 | | if (mLeftRounded && mRightRounded) |
| 68 | | { |
| 69 | | g.moveTo(mR+padding, h-1-padding); |
| 70 | | roundedLeft(w, h, padding); |
| 71 | | g.lineTo(w-1-mR-padding, padding); |
| 72 | | roundedRight(w, h, padding); |
| 73 | | } |
| 74 | | else if (mLeftRounded) |
| 75 | | { |
| 76 | | g.moveTo(w-1-padding, h-1-padding); |
| 77 | | g.lineTo(mR+padding, h-1-padding); |
| 78 | | roundedLeft(w, h, padding); |
| 79 | | g.lineTo(w-1-padding, padding); |
| 80 | | } |
| 81 | | else if (mRightRounded) |
| 82 | | { |
| 83 | | g.moveTo(padding, padding); |
| 84 | | g.lineTo(w-1-mR-padding, padding); |
| 85 | | roundedRight(w, h, padding); |
| 86 | | g.lineTo(padding, h-1-padding); |
| 87 | | } |
| 88 | | } |
| 89 | | |
| 90 | | protected function roundedLeft(w:Number, h:Number, padding:Number):void |
| 91 | | { |
| 92 | | var A:Number = APOS*mR; |
| 93 | | var g:Graphics = graphics; |
| 94 | | |
| 95 | | g.curveTo(padding+A*2, h-1-padding, padding+A, h-1-padding - A); |
| 96 | | g.curveTo(padding, h-1-padding - A*2, padding, h-1-padding - mR); |
| 97 | | g.lineTo(padding, padding+mR); |
| 98 | | g.curveTo(padding, padding+A*2, padding+A, padding+A); |
| 99 | | g.curveTo(padding+A*2, padding, padding+mR, padding); |
| 100 | | } |
| 101 | | |
| 102 | | protected function roundedRight(w:Number, h:Number, padding:Number):void |
| 103 | | { |
| 104 | | var A:Number = APOS*mR; |
| 105 | | var g:Graphics = graphics; |
| 106 | | |
| 107 | | g.curveTo(w-1-padding-A*2, padding , w-1-padding-A, padding+A); |
| 108 | | g.curveTo(w-1-padding , padding+A*2, w-1-padding , padding+mR); |
| 109 | | g.lineTo(w-1-padding, h-1-padding-mR); |
| 110 | | g.curveTo(w-1-padding, h-1-padding-A*2, w-1-padding-A, h-1-padding-A); |
| 111 | | g.curveTo(w-1-padding-A*2, h-1-padding, w-1-padding-mR, h-1-padding); |
| 112 | | } |
| 113 | | |
| 114 | | } |