可以被FLASH動態加載的背景透明圖片大致就GIF,PNG兩種
先說說GIF圖片,用普通的加載方法加載GIF圖片完後只能看到動態圖片的第一幀,由動態圖變成靜態的了
所幸有達人完美解決了這個問題,並封裝好類供我們使用,這就是GIFPlayer。下載地址網上搜一下很多
GIFPlayer使用示例
package{
import flash.net.URLRequest;
import flash.display.Sprite;
import org.gif.events.GIFPlayerEvent;
import org.gif.player.GIFPlayer;
public class GIFPlayerTest extends Sprite {
private var player:GIFPlayer;
private var request:URLRequest;
public function GIFPlayerTest() {
request=new URLRequest("girl.gif");
player = new GIFPlayer();
startLoadImg();
this.addChild(player);
player.addEventListener(GIFPlayerEvent.COMPLETE,imageLoadComplete);
}
public function startLoadImg():void {
player.load(request);
}
public function imageLoadComplete(e:GIFPlayerEvent):void {
trace("圖片加載成功");
trace(e);
}
}
}
AS3傳統的方法加載透明圖片,看着是透明的,但鼠標事件還是會響應的。有兩種解決方案
第一種:在需要的鼠標事件觸發時 判斷鼠標所點位置的像素是否透明,透明的話則不響應該事件
爲了程序的擴展性,可以添加一些自定義事件代替原有鼠標事件
程序如下:
package king.loadAphaImage{
import flash.display.*;
import flash.events.*;
public class Main extends Sprite{
private var loadImage:LoadImage;
private var sprite:Sprite;
public function Main(){
loadImage=new LoadImage(completeHandler);
loadImage.Loading("king/loadAphaImage/langfangshi.png");
}
private function completeHandler(events:Event):void {
sprite=new Sprite();
var bitmap:Bitmap=events.target.content;
sprite.addChild(bitmap);
DealImage.dealImage(sprite);
sprite.addEventListener(MouseEvent.CLICK,clickHandle);
sprite.addEventListener("IMAGE_MOUSE_CLICK",imageClickHandle);
this.addChild(sprite);
}
private function clickHandle(e:MouseEvent):void{
trace("點擊到我啦CLICK事件");
}
private function imageClickHandle(e:MouseEvent):void{
trace("點擊到我啦IMAGE_CLICK事件");
}
}
}
------------------------------------------------------------------------------------
package king.loadAphaImage{
import flash.display.*;
import flash.events.*;
import flash.net.*;
public class LoadImage{
private var fun:Function;
public function LoadImage(completeFun:Function){
fun=completeFun;
}
public function Loading(url:String){
try {
var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,cancel);
loader.load(new URLRequest(url));
} catch (error:Error) {
trace(error);
}
}
private function cancel(events:IOErrorEvent):void {
trace(events);
}
private function completeHandler(events:Event):void {
fun(events);
}
}
}
--------------------------------------------------------------------------------------------
package king.loadAphaImage{
import flash.display.*;
import flash.events.*;
public class DealImage{
public static function dealImage(sprite:Sprite){
sprite.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandle);
sprite.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandle);
sprite.addEventListener(MouseEvent.MOUSE_OUT,mouseOutHandle);
sprite.addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandle);
sprite.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandle);
sprite.addEventListener(MouseEvent.CLICK,mouseClickHandle);
}
private static function mouseDownHandle(events:MouseEvent):void {
var sprite:Sprite=events.currentTarget as Sprite;
if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_DOWN"));
}
private static function mouseMoveHandle(events:MouseEvent):void {
var sprite:Sprite=events.currentTarget as Sprite;
if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_MOVE"));
}
private static function mouseOutHandle(events:MouseEvent):void {
var sprite:Sprite=events.currentTarget as Sprite;
if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_OUT"));
}
private static function mouseOverHandle(events:MouseEvent):void {
var sprite:Sprite=events.currentTarget as Sprite;
if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_OVER"));
}
private static function mouseUpHandle(events:MouseEvent):void {
var sprite:Sprite=events.currentTarget as Sprite;
if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_UP"));
}
private static function mouseClickHandle(events:MouseEvent):void {
var sprite:Sprite=events.currentTarget as Sprite;
if(checkIsApha(events))sprite.dispatchEvent(new MouseEvent("IMAGE_MOUSE_CLICK"));
}
private static function checkIsApha(events:MouseEvent):Boolean{
var sprite:Sprite=events.currentTarget as Sprite;
if((sprite.getChildAt(0) as Bitmap).bitmapData.getPixel32(events.localX,events.localY)){
return true;
}
return false;
}
}
}
第二種方法是把這種圖片裏的像素重新處理,只有不透明的像素才留下來
原圖san.png
因爲圖片上傳網站的原因把圖片透明背景處理成淡藍色的了
private function copyImagExtendTransparent(bit:BitmapData):Sprite{
var _width:uint=bit.width;
var _height:uint=bit.height;
var ht:Sprite=new Sprite();
for(var x:uint=0;x<_width;x++){
for(var y:uint=0;y<_height;y++){
if(bit.getPixel32(x,y)){
var aphaValue:uint=bit.getPixel32(x,y) >> 24 & 0xFF;
ht.graphics.beginFill(bit.getPixel(x,y),aphaValue/255);
ht.graphics.drawRect(x,y,1,1);
ht.graphics.endFill();
}
}
}
return ht;
}
處理完的圖片效果和原圖一樣 不過在透明位置不會效應鼠標事件,圖片的寬高也不包括透明位置
------------------------------------------------------------------
private function getImageBorder(bit:BitmapData):Sprite{
var _width:uint=bit.width;
var _height:uint=bit.height;
var ht:Sprite=new Sprite();
ht.graphics.beginFill(0);
for(var x:uint=0;x<_width;x++){
for(var y:uint=0;y<_height;y++){
if(bit.getPixel32(x,y)){
if(!bit.getPixel32(x-1,y)||!bit.getPixel32(x,y-1)||!bit.getPixel32(x+1,y)||!bit.getPixel32(x,y+1)){
ht.graphics.drawRect(x,y,1,1);
}
}
}
}
ht.graphics.endFill();
return ht;
}
獲取圖片的邊框
--------------------------------------------------------------------------------------------
private function copyNoAphaImag(bit:BitmapData):Sprite{
var minx:uint=100000;
var miny:uint=100000;
var pointXArray:Array=new Array();
var pointYArray:Array=new Array();
var _width:uint=bit.width;
var _height:uint=bit.height;
for(var x:uint=0;x<_width;x++){
for(var y:uint=0;y<_height;y++){
if(bit.getPixel32(x,y)){
minx=minx>x?x:minx;
miny=miny>y?y:miny;
pointXArray.push(x);
pointYArray.push(y);
}
}
}
var ht:Sprite=new Sprite();
ht.graphics.beginFill(0);
var _length:uint=pointXArray.length;
for(var i:uint=0;i<_length;i++){
ht.graphics.drawRect(pointXArray[i]-minx,pointYArray[i]-miny,1,1);
}
ht.graphics.endFill();
ht.x=minx;
ht.y=miny;;
return ht;
}
這個方法得到圖片和第一個方法外表看沒有差別,但第一個圖片的X,Y值是0,0.而這個X,Y值則是剔除透明區域後,圖片仍在原位置時所需的X,Y值,更符合現實邏輯。感興趣的同學可以分別輸出他倆的寬高和X,Y值,比較一下。
本文轉自:http://blog.163.com/wuyongxiaodi@126/blog/static/7273500520100634727588/