
A więc klasa ta służy do generacji kolorów pośrednich między dwoma podanymi kolorami, pomiędzy którymi mogą być dowolne inne kolory pośrednie (np. przejście z bialego do czarnego przez czerwony). Wszystko jest w zasadzie opisane w komentarzach do kodu, łącznie z przykladem uzycia. Nadmienie tylko w razie, gdyby nie bylo to takie oczywiste, ze jak dodamy np. 4 kolory, to poczatkowym jest ten pierwszy, koncowym ostatni dodany, natomiast wszystkie dodane "w srodku" beda kolorami, przez które gradient będzie stopniowo przechodził.
Ilosc kolorow posrednich, ktore chcemy uzyskac (czyli w pewnym sensie dokladnosc czy tez szczegolowosc gradientu) jest podawana przez parametr do metody get() Ilosc ta zawiera kolory podane.. czyli jak np. generujemy gradient z dwoch kolorow w 100 krokach, samych kolorow posrednich (tych co zostaly wygenerowane), bedzie wynosila 98.
Oto i kod:
<?php /** * @package ColorGradient * @author FiDO <fido@list.pl> * @version 0.9.1 */ /** * Generuje gradient z jednego podanego koloru do drugiego z mozliwosci * ustalenia dowolnej ilosci kolorow posrednich * * Przykład użycia: * <code> * <?php * * $cGrad = new ColorGradient; * // z białego do czarnego przez szary * $cGrad->addColors(array('#000000', '#C0C0C0', '#FFFFFF')); * // ilosc kroków * $kolory = $cGrad->get(100); * if ($kolory === false) * { * echo \"Za mało kolorów lub liczba kroków mniejsza niż liczba kolorów\"; * } * foreach ($kolory as $kolor) * { * echo \"<span style='background: $kolor; width: 5px;'> </span>\"; * } * * ?> * </code> * * @package ColorGradient * @author FiDO <fido@list.pl> * @version 0.9.0 */ class ColorGradient { /** * tablica kolorów, z których generujemy gradient * * @access private */ var $_aColors = array(); /** * zmienna decydujaca o tym, czy zwrócone kolory będa w formacie html (np. #FFFFFF) * gdy false, każdy kolor zwracany jest jako tablica składajaca się z 3 elem ntów, * których wartosci oznaczaja kolejno red, green, blue * * @access public */ var $return_html = true; /** * Sprawdza poprawnosć koloru w formacie tablicowym (r,g,b) * * @access private * @return boolean true jesli poprawny, w przeciwnym przypadku false */ function _isColorValid($aColor) { if (!is_array($aColor) || count($aColor) != 3) { return false; } for ($i = 0; $i < 3; $i++) { if (!is_int($aColor[$i]) || $aColor[$i] > 255 || $aColor[$i] < 0) { return false; } } return true; } /** * dodaje pojedynczy kolor do tablicy kolorów * * dozwolone sa następujace formaty: * string : #FFFFFF * string : 255,255,255 * tablica: (255, 255, 255) * (wszystkie w kolejnosci RGB) * * @access public * @param mixed dodawany kolor * @return boolean true jesli dodanie się powiodło (kolor jest poprawny) */ function addColor($color) { // zamiana formatów innych niż tablicowy na tablicowy // string: 255,255,255 // białe znaki pomiędzy liczbami a przecinkami dozwolone if (@preg_match('#^(d+)s*,s*(d+)s*,s*(d+)$#', $color, $rgb)) { $color = array((int)$rgb[1], (int)$rgb[2], (int)$rgb[3]); } // string: #FFFFFF elseif (@preg_match('/^#[0-9a-f]{6}$/i', $color)) { $color = array_map( \"hexdec\", explode(\"n\", wordwrap(substr($color, 1), 2, \"n\", true)) ); } // string: black, white, red, etc. elseif (is_string($color)) { @include 'ColorNames.inc.php'; if (isset($colorNames[$color])) { $color = $colorNames[$color]; } } // jesli kolor poprawny, dodajemy na koniec tablicy if ($this->_isColorValid($color)) { $this->_aColors[] = $color; return true; } return false; } /** * dodaje kilka kolorów przekazanych za pomoca tablicy * * @access public * @param array tablica zawierajaca pojedyncze kolory w dozwolonym formacie * @return integer liczba poprawnie dodanych kolorów */ function addColors($colors) { if (!is_array($colors)) { return 0; } $added = 0; foreach ($colors as $color) { if ($this->addColor($color)) { $added++; } } return $added; } /** * konwertuje kolor w postaci tablicy na format zgodny z html * * array(255,0,255) -> #FF00FF * * @param array kolor do konwersji * @return string kod html koloru */ function _toHex($color) { if (!$this->return_html) { return $color; } // konwersja elementów tablicy na liczbe szesnastkowa $color = array_map('strtoupper', array_map('dechex', $color)); // dopełnienie zerem liczb jednocyfrowych array_walk($color, create_function('&$v', '$v = str_pad($v, 2, \"0\", 0);')); return '#'. implode('', $color); } /** * pobiera tablice kolorów posrednich między dwoma danymi (wyłaczajac dane kolory) * * @param integer indeks pierwszego koloru * @param integer indeks drugiego koloru * @param integer ilosć kolorów posrednich do wygenerowania * @access private * @return array tablica kolorów posrednich */ function _getGradient($c1idx, $c2idx, $steps) { // no steps.. no intermediate colors.. if ($steps == 0) { return array(); } // obliczamy krok dla każdej składowej for ($i = 0; $i < 3; $i++) { $aStep[$i] = ($this->_aColors[$c2idx][$i] - $this->_aColors[$c1idx][$i]) / ($steps + 1); } $inter = array(); // generacja kolorów posrednich for ($i = 1; $i <= $steps; $i++) { for ($j = 0; $j < 3; $j++) { $color[$j] = round($this->_aColors[$c1idx][$j] + $aStep[$j] * $i); // make sure we don't go off beyond limits $color[$j] = ($color[$j] > 255) ? 255: $color[$j]; $color[$j] = ($color[$j] < 0 ) ? 0 : $color[$j]; } $inter[] = $color; } return array_map(array(&$this, \"_toHex\"), $inter); } /** * zwraca tablice kolorów posrednich pomiędzy dodanymi kolorami * * @param integer ilosć kolorów, które ma zawierać gradient * @return mixed tablica kolorów lub false gdy niemożliwa generacja */ function get($steps) { // sprawdzenie czy sa dodane conajmniej 2 kolory oraz czy // liczba kroków wynosi conajmniej tyle co liczba kolorów if ($steps < count($this->_aColors) || count($this->_aColors) < 2) { return false; } $nColors = count($this->_aColors); // liczbę kolorów posrednich do uzyskania pomniejszamy o liczbę kolorów $steps -= $nColors; // obliczenie ile potrzeba kroków do przejscia między każda para kolorów // najpierw wszystkim dzielimy po równo $step = array_fill(0, $nColors - 1, (int)($steps / ($nColors - 1) )); // jesli zostanie reszta to dodajemy po 1 zaczynajac od poczatku for ($i = 0; $i < ($steps % ($nColors - 1)); $i++) { $step[$i]++; } $out = array($this->_toHex($this->_aColors[0])); for ($i = 0, $n = $nColors - 1; $i < $n; $i++) { $inter = $this->_getGradient($i, $i + 1, $step[$i]); $out = array_merge( $out, $inter, array($this->_toHex($this->_aColors[$i + 1])) ); } return $out; } } // end class ?>
Dodatkowo wersja do sciagniecia: http://willow.iie.uz.zgora.pl/~ipatalas/de...lorGradient.zip
(szerokosc TAB'ow w kodzie: 4)
A teraz mozecie krytykowac
