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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ScrollPaneコンポーネントでのドラッグイベントの取得方法は?
投稿するにはまず登録を

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
961832p
Åê¹ÆNo.40627
投稿日時: 2008-10-30 21:56
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
Re: ScrollPaneコンポーネントでのドラッグイベントの取得方法は?
 
[2008-10-31: わかりにくかったのでソースを追加しました(一部省略)]

先日使えなかったLowLevelEventsが、なぜか大丈夫になったので自分も試してみました。
確かに投稿されてあるように、mouseMoveイベントがScrollPaneのドラッグ時に呼ばれなくなることを確認。
原因を確かめるためにライブラリのLowLevelEvents.asとScrollPane.asの処理の流れを追ってみると、

 ・LowLevelEventsはonRollOver時に、onMouseMoveへフック処理(mouseMoveイベントを発行したあと、オリジナルのonMouseMoveを実行)をセットしている
 ・ScrollPaneは、onPress時にstartDragLoop関数を呼んでonMouseMoveへドラッグ処理をセットしている
 ・onPress時におこなう処理(startDragLoop関数を呼ぶ)は、scrollDragプロパティをtrueへ変更した時にセットしている

こんな感じだったので、ScrollPaneにマウスカーソルが入ってくる→onRollOver発生→onMouseMoveへフック処理をセット→ドラッグするためクリック→onPress発生→onMouseMoveが上書きされる、このような流れのため、ドラッグ時はmouseMoveイベントが発生しなくなるようです。

なんとかできないかなと思い、ScrollPaneのonPressを上書きして、startDragLoopを実行後onRollOverを直接呼出し、再度フック処理を有効にするという無茶苦茶なことをしてしまいました(苦笑)。

a_event.target.content.onPress = function () {
    this._parent.startDragLoop();
    this.onRollOver();
};

これだとドラッグ時でもmouseMoveイベントを受け取れるようになりましたが、ドラッグしたままScrollPaneの外でマウスボタンを離すと、以降ドラッグできなくなる等といった問題も発生しました。

LowLevelEventsを使った、まともな実現方法はあるのかもしれませんが自分は結局、LowLevelEventsを使うことは諦め、ScrollPaneを継承したクラスを作って、startDragLoop関数内にあるonMouseMove処理の最後に、追加の関数を呼び出すよう少し変更することで実現できました。

自分でふったLowLevelEventsでしたが、自分で試していなかったのがダメでした…お騒がせしてすみません。
もっとスマートな実現方法があるといいのですが…。

 ・テストページ

(Main.as)

import mx.managers.DepthManager;
import flash.display.BitmapData;
//====================================================================//
class Main extends MovieClip{
    //----------------------------------------------------------------//
    function Main() {
        var self : MovieClip = this;
        trace("i Main");
    }
    //----------------------------------------------------------------//
    function onLoad() {
        var self : MovieClip = this;
        trace("i Main.onLoad");
        //----------------------------------
        // MyScrollPane
        var sp : MyScrollPane = self.createChildAtDepth("MyScrollPane", DepthManager.kTop, {
            scrollDrag : true, hScrollPolicy : "on", vScrollPolicy : "on"
        });
        sp.setStyle("borderStyle", "none");
        //completeイベント
        var spListener : Object = new Object();
        spListener.complete = function (a_event : Object) {
            trace("i ScrollPane.complete");
            //サムネイル作成
            …省略…
            …self.thumb_mc にサムネイル用MCを作成…
            …self.thumb_mc.frame_mc にサムネイルに表示する現在領域用MCを作成…
            …省略…
            //ドラッグ時の追加イベント
            a_event.target.addExtEvent({
                mouseDrag : function (a_event2 : Object) : Void{
                    trace("i mouseDrag");
                    //現在領域用MCを移動
                    self.thumb_mc.frame_mc._x = a_event2.target.hPosition;
                    self.thumb_mc.frame_mc._y = a_event2.target.vPosition;
                }
            });
        };
        sp.addEventListener("complete", spListener);
        //scrollイベント
        spListener.scroll = function (a_event : Object) {
            trace("i ScrollPane.scroll");
            //現在領域用MCを移動
            self.thumb_mc.frame_mc._x = a_event.target.hPosition;
            self.thumb_mc.frame_mc._y = a_event.target.vPosition;
        };
        sp.addEventListener("scroll", spListener);
        //画像を読み込む
        sp.contentPath = "test.jpg";
    }
}

(MyScrollPane.as)

import mx.containers.ScrollPane;
//====================================================================//
class MyScrollPane extends ScrollPane{
    private var m_extEvent : Object; //追加イベント用
    //----------------------------------------------------------------//
    function MyScrollPane() {
        trace("i MyScrollPane");
        //
        m_extEvent = new Object();
    }
    //----------------------------------------------------------------//
    function startDragLoop(Void) : Void{
        …省略…
        spContentHolder.onMouseMove = function () {
            …省略…
            //追加イベント mouseDrag を呼ぶ
            if (this._parent.m_extEvent.mouseDrag != undefined) {
                this._parent.m_extEvent.mouseDrag({
                    target : this._parent
                });
            }
        };
    }
    //----------------------------------------------------------------//
    // 追加イベント登録
    function addExtEvent(a_obj : Object) {
        for (var i in a_obj) {
            m_extEvent[i] = a_obj[i];
        }
    }
}


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
   ScrollPaneコンポーネントでのドラッグイベントの取得方法は? flashlite 2008-10-24 2:27
     Re: ScrollPaneコンポーネントでのドラッグイベントの取得方法は? 961832p 2008-10-24 19:30
       Re: ScrollPaneコンポーネントでのドラッグイベントの取得方法は? flashlite 2008-10-27 13:16
         Re: ScrollPaneコンポーネントでのドラッグイベントの取得方法は? 961832p 2008-10-27 21:08
       » Re: ScrollPaneコンポーネントでのドラッグイベントの取得方法は? 961832p 2008-10-30 21:56
           Re: ScrollPaneコンポーネントでのドラッグイベントの取得方法は? flashlite 2008-10-31 0:54

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