2011-02-28 125 views
2

我只是不明白爲什麼mouseEnabledWhereTransparent不適用於此皮膚。mouseEnabledWhereTransparent不按預期工作

創建的皮膚基本上是一個帶有透明背景和左側的小三角形的按鈕,如下所示:> ButtonText但Triangle周圍的空白空間不會接收鼠標事件。

我試過圍繞三角形路徑包裹另一組,並試圖將它包裝到一個圖形對象中,也沒有成功。我可以在任何地方創建一個帶0 alpha的Rect,但不是那個mouseEnabledWhereTransparent應該爲我做什麼?

<?xml version="1.0" encoding="utf-8"?> 
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:fb="http://ns.adobe.com/flashbuilder/2009" minWidth="21" minHeight="21" alpha.disabled="0.5" 
      mouseEnabledWhereTransparent="true"> 

    <!-- host component --> 
    <fx:Metadata> 
     <![CDATA[ 
     [HostComponent("spark.components.Button")] 
     ]]> 
    </fx:Metadata> 

    <!-- states --> 
    <s:states> 
     <s:State name="up" /> 
     <s:State name="over" /> 
     <s:State name="down" /> 
     <s:State name="disabled" /> 
    </s:states> 

    <!-- triangle tip --> 
    <s:Path data="M 0 0 L 0 14 L 10 7 L 0 0" bottom="5"> 
     <s:fill> 
      <s:SolidColor color="0xFFFFFF" /> 
     </s:fill> 
    </s:Path> 


    <!-- text --> 
    <s:Label id="labelDisplay" 
       textAlign="center" 
       verticalAlign="bottom" 
       maxDisplayedLines="1" 
       left="14" right="10" top="2" bottom="2" color="0x000000" fontSize="14"> 
    </s:Label> 
</s:SparkSkin> 
+0

您是否運行了以下答案? – Ryan 2011-03-02 18:06:26

+0

好吧,如果它有mouseEnabledWhereTransparent = true,那麼完全空的組將響應不可見區域上的mouseEvents。當mouseEnabledWhereTransparent = true時,SparkSkin將不會響應不可見區域上的mouseEvents。 SparkSkin是Group的一個子類。我不明白。 – iddqd 2011-03-02 21:35:41

回答

1

喲,你需要的是添加一個矩形之前路徑作爲點擊區域行動,這個工程:

<s:Rect left="0" right="0" top="0" bottom="0" > 
    <s:fill> 
     <s:SolidColor alpha="0" /> 
    </s:fill> 
</s:Rect> 

這傢伙here有製作自定義按鈕的一個很好的例子(減標籤)

+0

布賴恩你的解決方案的作品,但它仍然讓我想知道,爲什麼我必須添加一個不可見的矩形有一個命中區域。但我不必爲這個空組添加一個不可見的矩形:。即使它是空的,該組也會對點擊作出響應。爲什麼不皮膚?這不是什麼大問題,但似乎mouseEnabledWhereTransparent不一致。 – iddqd 2011-03-02 21:29:52

+0

當我繪製一個沒有涉及組/矩形的路徑時,我會想到,路徑的邊界是該組件的邊界。它不是三角形(>)路徑周圍的區域是透明的,只是除了舞臺之外沒有任何東西可以點擊! – Ryan 2011-03-03 10:02:12

0

如果在設置的組上沒有鼠標事件偵聽器,mouseEnabledWhereTransparent無效。在你的例子中,Button對象有一個點擊事件監聽器,但Button的皮膚對象(SparkSkin)沒有。

從ASDoc的爲GroupBase.mouseEnabledWhereTransparent:

「此屬性只有在那張如果鼠標,觸摸,或Flash Player的手勢事件被添加到這個實例效應」

一種解決方法,你將鼠標事件偵聽器添加到什麼都不會做的皮膚,例如:

<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
      mouseEnabledWhereTransparent="true" click="doNothing()"> 
    <fx:Script> 
     <![CDATA[ 
      protected function doNothing():void { 
       trace('doNothing'); 
      } 
     ]]> 
    </fx:Script> 
    ... 
</s:SparkSkin> 

主要用例該物業已被直接添加點擊事件一個集團,但想想你提出的案例很有意思。按照「在皮膚上設置mouseEnabledWhereTransparent時,如果hostComponent附加了鼠標偵聽器,應該會產生效果」這一行提交增強請求可能是合理的。

+0

嗯,但你通常不會在按鈕外觀中添加點擊監聽器。 Spark皮膚的全部重點是將邏輯從UI分離出來,將點擊監聽器添加到實際的按鈕上。 – iddqd 2011-03-02 21:27:11

+0

是的,你是對的,你不應該在皮膚中添加該聽衆。如果你真的希望mouseEnabledWhereTransparent屬性能夠工作,我只是提到它是一種解決方法。正確的做法是不在皮膚中使用mouseEnabledWhereTransparent,而是繪製透明的Rect。 – 2011-03-03 06:33:57

+0

所以我們可以說,如果在皮膚中使用它,mouseEnabledWhereTransparent不起作用?如果是,爲什麼?以此爲例:http://forums.adobe.com/thread/710351無論您啓用還是禁用mouseEnabledWhereTransparent,CustomButtonSkin.mxml代碼的行爲都完全相同。 – iddqd 2011-03-06 10:27:10