ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ActionScript LoungeコミュのNumericStepper.checkValidValue()メソッド

  • mixiチェック
  • このエントリーをはてなブックマークに追加
FLASH-japanのお題より。

「NumericStepperでの奇数表示」
http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=5372&forum=11

他にも、minimum = 0、maximum = 10、stepSize = 4として、最大値10まで数値を上げた後下げると8になるという不具合を見つけました。

まだ試作ですけど、これでどうでしょう? [ライブラリ]にNumericStepperがあれば、ステージには何も置く必要はありません。いろいろな値で、試していただけるとありがたいです(インデントは全角スペースを使っています。コピー&ペーストした際には、削除するかタブで置換えてください)。

// NumericStepperインスタンスを動的に配置
import mx.managers.DepthManager;
import mx.controls.NumericStepper;
var myNumericStepper:NumericStepper = this.createClassChildAtDepth(NumericStepper, DepthManager.kTop);
// 初期設定
myNumericStepper.move(10, 10);
myNumericStepper.minimum = 1;
myNumericStepper.maximum = 10;
myNumericStepper.stepSize = 4;
myNumericStepper.value = myNumericStepper.minimum;
// NumericStepper.checkValidValue()メソッドの修正
NumericStepper.prototype.checkValidValue = function(val:Number):Number {
 var currentVal:Number = this.value; // *追加
 // var initDiv:Number = val/this.stepSize;
 var initDiv:Number = (val-currentVal)/this.stepSize+currentVal;
 // var roundD:Number = Math.floor(initDiv);
 var roundD:Number = Math.floor(initDiv-currentVal)+currentVal;
 var stepS:Number = this.stepSize;
 var minVal:Number = this.minimum;
 var maxVal:Number = this.maximum;
 // if (val>minVal and val<maxVal) {
 if (val>minVal && val<maxVal) {
  if (initDiv-roundD == 0) {
   return val;
  } else {
   var tmpV:Number = Math.floor(val/stepS);
   var stepDownV:Number = tmpV*stepS;
   if ((val-stepDownV>=stepS/2 && maxVal>=stepDownV+stepS && minVal<=stepDownV-stepS) || (val+stepS == maxVal && maxVal-stepDownV-stepS>0.00000000000001)) {
    stepDownV += stepS;
   }
   return stepDownV;
  }
 } else {
  if (val>=maxVal) {
   return maxVal;
  } else {
   return minVal;
  }
 }
};

コメント(8)

minimum = 1、maximum = 11、stepSize = 2
minimum = 5、maximum = 11、stepSize = 2
奇数で推移します。ばっちりんこです。

minimum = 0.5、maximum = 10.5、stepSize = 2
0.5, 2.5, 4.5, 6.5, 8.5, 10.5 でばっちりです。

minimum = 1、maximum = 12、stepSize = 2
で、12まで上げた後、下げると、偶数で推移します。
これは、仕様と考えた方が良いのでしょうか。
>> 1: ひろゆきさん
ご確認ありがとうございます。

> minimum = 1、maximum = 12、stepSize = 2
> で、12まで上げた後、下げると、偶数で推移します。
_____
minimum = 1、maximum = 10、stepSize = 4、value = 0のとき、私はつぎのように動作すべきものと思っていました。どんなもんでしょう?
0 > 4 > 8 > 10 > 6 > 2 > 1 > 5 > 9 > 10
「奇数表示」というのが念頭にあったので、
minimum = 1、maximum = 10、stepSize = 2、value = 1のとき、
1 > 3 > 5 > 7 > 9 > 7 > 5 > 3 > 1
と思いこんでいたので、違和感を感じていただけかもしれません。

stepSize = 2 を基準に考えて、
2ずつ増減するのものなのだと考えると、
1 > 3 > 5 > 7 > 9 > 10 > 8 > 6 > 4 > 2 > 0
の方がおかしくないですね。

奇数表示したければ、maximum をきちんと設定してやれば済みますし。
>> 2: Fumio
あぁ、スクリプトだとminimum = 1、value = 0とかできますけど、[パラメータ]では刻みが(minimum + stepSize*n)に決まるんですね。どちらがいいんでしょう。
>> 2: Fumio
> 0 > 4 > 8 > 10 > 6 > 2 > 1 > 5 > 9 > 10
_____
つぎのように値が変更されるバージョンです。
0 > 1 > 5 > 9 > 10 > 9 > 5 > 1

NumericStepper.prototype.checkValidValue = function(val:Number):Number {
 // var currentVal:Number = this.value;
 // var initDiv:Number = val/this.stepSize;
 // var initDiv:Number = (val-currentVal)/this.stepSize+currentVal;
 // var roundD:Number = Math.floor(initDiv);
 // var roundD:Number = Math.floor(initDiv-currentVal)+currentVal;
 var stepS:Number = this.stepSize;
 var minVal:Number = this.minimum;
 var maxVal:Number = this.maximum;
 var initDiv:Number = (val-minVal)/this.stepSize+minVal;
 var roundD:Number = Math.floor(initDiv-minVal)+minVal;
 // if (val>minVal and val<maxVal) {
 if (val>minVal && val<maxVal) {
  if (initDiv-roundD == 0) {
   return val;
  } else {
   // var tmpV:Number = Math.floor(val/stepS);
   var tmpV:Number = Math.floor((val-minVal)/stepS);
   // var stepDownV:Number = tmpV*stepS;
   var stepDownV:Number = tmpV*stepS+minVal;
   if ((val-stepDownV>=stepS/2 && maxVal>=stepDownV+stepS && minVal<=stepDownV-stepS) || (val+stepS == maxVal && maxVal-stepDownV-stepS>0.00000000000001)) {
    stepDownV += stepS;
   }
   return stepDownV;
  }
 } else {
  if (val>=maxVal) {
   return maxVal;
  } else {
   return minVal;
  }
 }
};
>> 4: Fumio
いってることがわかりづらいですね。(^^;

minimum = 1、value = 0で値が「0から始まって4になる」のなら、最大値「10から下がって6になる」のが自然だということです。

値が最大値と最小値を除いて1 > 5 > 9に固定されるというのなら、それもひとつの仕様として成立つと思います。それが5: のバージョンです。
5: バージョンも
minimum = 1、maximum = 11、stepSize = 2
minimum = 5、maximum = 11、stepSize = 2
minimum = 0.5、maximum = 10.5、stepSize = 2
問題なしですね。

minimum = 1、maximum = 12、stepSize = 2
奇数で推移しますね。
個人的には、こちらの方が好きです。(^o^)
5: バージョンで、F-siteに記事を掲載しました。

「NumericStepperで奇数を表示する」
http://f-site.org/articles/2006/08/23152105.html

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

ActionScript Lounge 更新情報

ActionScript Loungeのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。