2008年9月5日星期五

某公司徵 flex 人才時出的考題

產業界看到有公司在應徵 flash/flex 的人才時,都會看到有一段來自 Jeramy 家代 po 的徵才文案:

http://ria.richtechmedia.com/2007/08/07/%E4%BB%A3%E8%B2%BC%E5%BE%B5%E4%BA%BA%E5%BB%A3%E5%91%8A-adobe-flex-2-developers/


-熟悉 Flex 2 與 ActionScript 3

-熟悉開發模組化與物件導向式之 Flex 2 應用程式

-熟悉 Flex 2 元件設計、製作(元件生命週期與運作方式)與樣式設計

-熟悉物件導向式編程技巧(Classes, Interfaces, Composition, Inheritance and re-usable code)


而,最近又看到另外一家公司,除了上述徵才條件相同之外,還另外自己出了考題給應徵者:

http://www.104.com.tw/jobbank/cust_job/job.cfm?jobnum=3999639&invoice=28479524000&intro=1&jobsource=intr&page=1


-求職者可先參考本公司正在協詢的外包工作說明網站,http://sites.google.com/site/apeerfilter/裡面有code和說明,請先行試做一個自已喜歡的濾鏡,以作為面試時的作品之一,謝謝。


一時興起玩玩,依照下載的檔案中所提供的範例來看,你可以選擇使用 _arrFilter 存放自訂濾鏡的方式,或是使用 _arrDisplayObject 存放自訂 DisplayObject 的方式,我選擇後者,並且因為它的來源動畫是一段 *.flv,所以我順便抓了背景音樂的音軌來做繪圖,至於自訂控制介面中,我就僅增加一個 checkbox 來決定是否要清除每次畫出音軌紀錄點的軌跡。





完整原始碼 FilterMyWork.as 如下:


package apeer.filters
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.media.SoundMixer;
import flash.text.TextField;
import flash.utils.ByteArray;

import mx.controls.CheckBox;
import mx.core.UIComponent;

public class FilterMyWork extends FilterBasic
{
private var spectrum:ByteArray;
private var spectrumBD:BitmapData;
private var spectrumBMP:Bitmap;

private var cx:Number; //圓中心要放在BD的座標
private var cy:Number; //圓中心要放在BD的座標
private var r:Number; //半徑

private var isClear:Boolean; //是否要清除軌跡

public function FilterMyWork()
{
super();
}

override protected function init():void
{
super.init();

spectrum = new ByteArray();
r = 100;
isClear = true;



var clear_uic:UIComponent = new UIComponent();

var clear_cb:CheckBox = new CheckBox();
clear_cb.label = "清除軌跡";
clear_cb.selected = isClear;
clear_uic.addChild(clear_cb);
clear_cb.addEventListener(Event.CHANGE
, function(evt:Event):void{
isClear = (evt.target as CheckBox).selected
});

var clear_txt:TextField = new TextField();
clear_txt.text = "清除軌跡";
clear_txt.x = 20;
clear_txt.y = -10;
clear_uic.addChild(clear_txt);

_arrEditPanel.push(clear_uic);
}

override public function setTimeHead(millisecond:Number):Array
{
//trace("this=" + this + ", millisecond=" + millisecond + ", duration=" + duration);

//基本方法一:套用濾鏡
//_arrFilter = [new BlurFilter(100)];

//基本方法二:顯示DisplayObject
/*
var bd:BitmapData = new BitmapData(src_bd.width, src_bd.height);
bd.fillRect(bd.rect, 0xffffffff * Math.random());
var bmp:Bitmap = new Bitmap(bd);

_arrDisplayObject = [bmp];
*/


/*
flash.media.SoundMixer 提供了 computeSpectrum(),
可以將音樂的 Spectrum 放入一個 512 的 ByteArray 中,
前 256 表示左聲道,後 256 表示右聲道,這 512 個資料,都是 -1~1 的資料
*/
SoundMixer.computeSpectrum(spectrum);

if(!spectrumBD){
var src_bd:BitmapData = this.getFrameBitmapData();
spectrumBD = new BitmapData(src_bd.width, src_bd.height, true, 0x00000000);
}else{
if(isClear){
spectrumBD.fillRect(spectrumBD.rect, 0x00000000);
}
}

if(!spectrumBMP){
spectrumBMP = new Bitmap(spectrumBD);
}

if(!cx)cx = spectrumBD.width/2;
if(!cy)cy = spectrumBD.height/2;

var v:Number;
var a:Number;
var x:Number;
var y:Number;
var i:int;
for(i=0; i< 256; i++){
//左聲道
v = spectrum.readFloat(); //-1~1
a = Math.PI * (-0.5 - i/256); //從正上方,向左逆時針
x = cx + Math.cos(a) * r * (1+v);
y = cy + Math.sin(a) * r * (1+v);
spectrumBD.setPixel32(x, y, 0xffffffff);
}
for(i=0; i< 256; i++){
//右聲道
v = spectrum.readFloat(); //-1~1
a = Math.PI * (-0.5 + i/256); //從正上方,向右順時針
x = cx + Math.cos(a) * r * (1+v);
y = cy + Math.sin(a) * r * (1+v);
spectrumBD.setPixel32(x, y, 0xffffffff);
}

_arrDisplayObject = [spectrumBMP];

return super.setTimeHead(millisecond);
}
}
}


================================================

[2008-09-09-11-01]

再添加兩個例子

1.
使用 BlurFilter,先是水平由模糊變清楚,然後垂直由清楚變模糊。





原始碼:


package apeer.filters
{
import flash.filters.BlurFilter;

public class FilterMyWork2 extends FilterBasic
{
override public function setTimeHead(millisecond:Number):Array
{
var bf_x:Number = 0;
var bf_y:Number = 0;

//先 水平,後 垂直
if(millisecond/duration<.5){
bf_x = 50 * (1 - (millisecond/duration) / .5);
}else{
bf_y = 50 * ((millisecond/duration) / .5 - 1);
}

trace(bf_x + ", " + bf_y)
var filter:BlurFilter = new BlurFilter(bf_x, bf_y);

_arrFilter = [filter];

return super.setTimeHead(millisecond);
}
}
}


2.
繪製漸層。





原始碼:


package apeer.filters
{
import flash.display.*;
import flash.events.Event;
import flash.geom.Matrix;

import mx.controls.CheckBox;

public class FilterMyWork3 extends FilterBasic
{
private var w:Number;
private var h:Number;

private var isColor:Boolean; //是否多彩
private var isRandom:Boolean; //是否亂數

override protected function init():void
{
super.init();

isColor = false;
isRandom = false;

var color_cb:CheckBox = new CheckBox();
color_cb.label = "是否多彩";
color_cb.selected = isColor;
color_cb.addEventListener(Event.CHANGE
, function(evt:Event):void{
isColor = (evt.target as CheckBox).selected
});
_arrEditPanel.push(color_cb);

var random_cb:CheckBox = new CheckBox();
random_cb.label = "是否亂數";
random_cb.selected = isRandom;
random_cb.addEventListener(Event.CHANGE
, function(evt:Event):void{
isRandom = (evt.target as CheckBox).selected
});
_arrEditPanel.push(random_cb);
}

override public function setTimeHead(millisecond:Number):Array
{
if(!w || !h){
var src_bd:BitmapData = this.getFrameBitmapData();
w = src_bd.width;
h = src_bd.height;
trace(w + ", " + h);
}

var colors:Array;
if(isColor){
colors = [Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff
, Math.random() * 0xffffff]
}else{
colors = [0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff];
}

var c:Number;
if(isRandom){
c = 255 * Math.random();
}else{
c = 255 * (millisecond/duration);
}

var matr:Matrix = new Matrix();
matr.createGradientBox(w, h, 0, 0, 0);
matr.rotate(45);
var shape:Shape = new Shape();
shape.graphics.beginGradientFill(GradientType.LINEAR
, colors
, [0, 0, .5, .75, .5, .75, .5, 0, 0]
, [0, c-50, c-30, c-10, c, c+10, c+30, c+50, 255]
, matr
, SpreadMethod.REFLECT
, InterpolationMethod.RGB
, .75);
shape.graphics.drawRect(0, 0, 400, 300);
shape.graphics.endFill();

_arrDisplayObject = [shape];

return super.setTimeHead(millisecond);
}
}
}

0 意見:

關於我






* ben {dot} chang {at} ben {dot} idv {dot} tw
* FriendFeed

贊助我1元美金:

Plurk

標籤雲