• actionscript3 中关于sprite的mask问题


    在项目中,对某一个sprite应用遮罩,升级了新的flashplayer11之后出现了问题,会出现一些界面消失或部分消失的情况。

    测试代码如下:

    package
    {
    	import flash.display.SpreadMethod;
    	import flash.display.Sprite;
    	import flash.events.Event;
    	import flash.events.MouseEvent;
    	
    	public class Test extends Sprite
    	{
    		private var testBtn:BTN1 = new BTN1();
    		private var testMc2:Panel2 = new Panel2();
    		private var maskMc:MC2 = new MC2();
    		
    		private var layer:Sprite = new Sprite();
    		
    		public function Test()
    		{
    			mask = maskMc;
    			addChild(maskMc);
    			addChild(testBtn);
    			
    			testBtn.addEventListener(MouseEvent.CLICK,onClick);
    			stage.addEventListener(Event.RESIZE, resizeHandler);
    		}
    		
    		private function onClick(e:MouseEvent):void
    		{
    			if(testMc2.parent == null)
    			{
    				addChild(testMc2);
    				testMc2.x = 200;
    				testMc2.y = 100;
    			}
    			else
    			{
    				testMc2.parent.removeChild(testMc2);
    			}
    		}
    		
    		/**
    		 * SWF尺寸改变时调度
    		 */
    		private function resizeHandler(event:Event):void
    		{
    			mask = maskMc;
    		}
    	}
    }
    

     在浏览器中运行时,通过点击testBtn显示testMc2,然后拉伸浏览器尺寸使得swf尺寸改变。这个时候会发现testMc2显示上会出现问题。

    这在flashplayer 11.1.102.62 上有所出现,但在其他版本却看不到这个问题。

    最终原因发现是因为少写了一行代码:

    			addChild(maskMc);
    

     原因是未将遮罩列入显示列表中,所以当swf尺寸改变时遮罩已经开始失效了。这在官方API中有所说明:

    调用显示对象被指定的 mask 对象遮罩。 要确保当舞台缩放时蒙版仍然有效,mask 显示对象必须处于显示列表的活动部分。
     但不绘制 mask 对象本身。 将 mask 设置为 null 可删除蒙版。
    

    所以,记得将遮罩也addChild。

    关注我: weibo.com/holycy
  • 相关阅读:
    关于服务器并发量的简单计算
    重温Android和Fragment生命周期
    JVM类加载机制
    设计六大原则总结
    Android Navigation使用
    Android BrocastReceiver解析
    Android LiveData使用
    Android Service解析
    Activity的生命周期和启动模式
    Java四种引用
  • 原文地址:https://www.cnblogs.com/holycy/p/2363342.html
Copyright © 2020-2023  润新知