1

まあ言ってみれば

-「タップ」イベントをリッスンし、何かを実行する関数に指示するボタンがあります。

・ボタンを覆うImageRactを入れました。1層上げます。

ボタンが後ろにある領域のすぐ上のカバー画像をクリックすると、イベント関数が実行されます。

どうすればこれを回避できますか?

例:

local function hidebg()

    display.remove(logo3)
    logo3=nil
end

local logo2= display.newImage("logo.png")
logo2.x=display.contentCenterX
logo2.y=280
logo2.width=200
logo2.height=74
logo2:addEventListener("tap", hidebg)

local cover =display.newImageRect("NEW GAME A.png", 480,320)
cover.x=display.contentCenterX/2
cover.y=display.contentCenterY/2

「logo2」は「cover」画像で覆われていますが、hidebg() 関数は引き続き実行されます。

ボタンを isVisible=false にして問題を解決できることはわかっていますが、さまざまなレイヤーのさまざまなグループに多数のボタンがあり、スマートな方法でそれを行うにはどうすればよいでしょうか。どういうわけかグループ全体を無効にしますか?知らない。

4

2 に答える 2

6

プロジェクトでそのボタンを無効にする方法は 2 つあります。

1)cover以下のようにリスナーを作成するだけreturn trueです:

function coverPressed()
    return true;
end
cover:addEventListener("tap",coverPressed)

2)存在するかどうかを確認coverし、次のリスナーを削除しますlogo2

logo2:removeEventListener("tap", hidebg)

コーディングを続ける........

于 2013-08-26T06:26:08.557 に答える
0

タッチ伝播の制御

受け入れられた回答trueで示唆されているように、マスキングDisplayObjectに戻るタッチイベントリスナーを追加することでこの問題を解決できる理由は、これがタッチの伝播を処理または停止するためです。マスキング オブジェクトによって処理されたタッチは、表示階層のさらに下 (または、必要に応じてさらに後ろ) にあるボタンのリスナーに到達しません。

これは、タップ/タッチ伝播に関するコロナ SDK ドキュメントで説明されています。

ユーザーが画面に触れると、イベントが表示階層にディスパッチされます。画面上のタッチ位置と交差する表示オブジェクトのみがイベントを受け取ります。

タップおよびタッチ イベントは、これらのオブジェクトを特定の順序で伝播します。デフォルトでは、イベントを受け取る最初のオブジェクトは、タッチ位置と交差する表示階層の最前面の表示オブジェクトです。イベントを受信する次のオブジェクトは、タッチ位置と交差する階層内の次のオブジェクトなどです。

タップおよびタッチ イベントは、「処理」されるまで伝播します。これは、複数のオブジェクトが表示階層で互いに重なり合っており、それぞれにタップまたはタッチ イベント リスナーが適用されている場合、イベントはこれらすべてのオブジェクトに伝播することを意味します。ただし、イベントが処理されたことをコロナに伝えることで、次の基になるオブジェクトへの伝播を停止できます。これは、イベント リスナーからtrue [emphasis mine] を返すのと同じくらい簡単です。これにより、伝播サイクルが停止し、基になるオブジェクトがヒット イベントに応答しなくなります。

ウィジェットのプロパティを変更する

buttonライブラリからのものである場合はwidget.*、それを無効にして非表示にすることで、より簡単に同じ結果を得ることができます。

button:setEnabled( false )
button.isVisible = false

ちなみに、isVisible( を変更するのではなくalpha) を使用する利点は、ボタンを非表示にする前にアルファ値を追跡する必要がないことです。後で行うbutton.isVisible = trueと、ButtonWidget は以前と同じアルファ値になります。

于 2017-04-13T00:32:24.843 に答える