關於AS3加載透明圖片

可以被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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章