トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     [AS2] スケールされたステージ上の ComboBox スクローラーの不具合
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
うじゅ
Åê¹ÆNo.46942
投稿日時: 2011-1-31 11:28
半人前
居住地:
投稿: 31
使用環境:
WinXP
MX Pro2004, Flash8
[AS2] スケールされたステージ上の ComboBox スクローラーの不具合
Flash8 で作業しています。

スケールされたステージ上のコンボボックスをドロップダウンした状態でスクロールバーを操作すると、範囲外をクリックされた際の動作が実行され、ドロップダウンリストが閉じられてしまう現象に遭遇しました。

550×400の新規ファイルにComboBoxを追加して、以下のコードをタイムラインにペーストした状態で再現します。

_global.origWidth  = 550;
_global.origHeight = 400;

Stage.scaleMode = 'noScale';
Stage.align = 'LT';

var stageResizeListener = {
    owner    : this,
    onResize : function() {
        var rate = Math.min(Stage.width/origWidth, Stage.height/origHeight);
        _level0._xscale = rate * 100;
        _level0._yscale = rate * 100;
        _level0._x = (Stage.width  - origWidth*rate)  /2;
        _level0._y = (Stage.height - origHeight*rate) /2;
    }
};

Stage.addListener(stageResizeListener);
stageResizeListener.onResize();


var content_mc:MovieClip = this.createEmptyMovieClip('content_mc', 0);
var test = function() {
    content_mc.createClassObject(mx.controls.ComboBox, "my_cb", 10, {_x:10, _y:10});
    var my_cb = content_mc.my_cb;
    
    for(var i=0; i<=20; i++) {
        my_cb.addItem({data:i, label:"選択肢 "+ i});
    }
};
test();


ステージをスケールする前は正常な動作をしますが、ステージをスケールするとスクロールバーが入力を受け付けなくなります。

この現象の回避方法はあるのでしょうか?
よろしくお願いします。


----------------
UJU

うじゅ
Åê¹ÆNo.46944
投稿日時: 2011-1-31 14:06
半人前
居住地:
投稿: 31
使用環境:
WinXP
MX Pro2004, Flash8
Re: [AS2] スケールされたステージ上の ComboBox スクローラーの不具合
並行して調査していました。これで解決するのかどうかはまだ判断できませんが、mx.managers.PopUpManager をいじることで、正常な振る舞いをするようでした。

mx.managers.PopUpManager の onMouseDown 内で MovieClip::hitTest() により矩形範囲内判定しているところを、別のやり方にしてみました。

import mx.managers.PopUpManager;
var tmpfunc = function() {
    PopUpManager.prototype.onMouseDown = function()
    {
        var root = this.owner._root;
        if (root == undefined) root = _root;
        var pt = {x: root._xmouse, y: root._ymouse};
        root.localToGlobal(pt);
        
        var bnd = this.owner.getBounds(this.owner);
        var p0 = {x:bnd.xMin, y:bnd.yMin};
        var p1 = {x:bnd.xMax, y:bnd.yMax};
        this.owner.localToGlobal(p0);
        this.owner.localToGlobal(p1);
        
        var hit = (p0.x <= pt.x && pt.x <= p1.x && p0.y <= pt.y && pt.y <= p1.y);
        if( hit ) {
            // do nothing
        } else {
            this.owner.mouseDownOutsideHandler(this.owner);
        }
    };
};
tmpfunc();
delete tmpfunc;


これは MovieClip.hitTest() のバグということなのでしょうか?


----------------
UJU

うじゅ
Åê¹ÆNo.46952
投稿日時: 2011-2-1 17:29
半人前
居住地:
投稿: 31
使用環境:
WinXP
MX Pro2004, Flash8
Re: [AS2] スケールされたステージ上の ComboBox スクローラーの不具合
その後 MovieClip.hitTest() をテストしてみたところ、どうやら _root のローカル座標を渡すと正しい結果を返すような感じでした。

PopUpManager のハック処理を localToGlobal しないで以下のようにしても正常に動作するようでした。

import mx.managers.PopUpManager;
PopUpManager.prototype.onMouseDown = function()
{
    var root = this.owner._root;
    if (root == undefined) root = _root;
    if( !this.owner.hitTest(root._xmouse, root._ymouse, false) ) {
        this.owner.mouseDownOutsideHandler(this.owner);
    }
};


※変数「root」は _lockroot = true の時を考慮してのものかと推測しますが、こちらのテストはしていません。

マニュアルには下記のように書かれていました。
ここで言う「グローバル座標空間」は、localToGlobal を適用した座標を意味するものでは無いか、嘘かと思います。

引用:
パラメータ : x: Number はステージ上のヒット領域の x 座標、
y: Number は、ステージ上のヒット領域の y 座標です。x 座標と
y 座標は、グローバル座標空間で定義されます。



今回はとりあえず、より確実な localToGlobal を通した座標同士で比較する方法で PopUpManager に対するハック処理を行い、対処しておこうと思います。


----------------
UJU

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops