Jan 14, 2006

サブツリーの展開

TBEでサブツリーを展開したとき、Windowsのエクスプローラのフォルダツリーのように、以下の挙動を行うようにした。

  • サブツリーの全てのタブが画面内に収まる場合は、そのまま。
  • 展開されたサブツリーがタブの表示領域外にはみ出る場合、サブツリーの全体が見えるところまで自動スクロール。
  • サブツリーの全体がタブの表示領域に収まらない場合は、サブツリーの親となっているタブが表示領域の上端に来るように自動スクロール。

効率のいいやり方が分からなかったので、以下のような方法をとってみた。

  1. サブツリーを展開した(しようとした)タブの全ての子孫タブを一次の配列として取得
  2. それをタブの表示順でソート
  3. 最初のタブと最後のタブについて、タブの表示領域の中に収まっているかどうかを調査
  4. 両方とも画面内にあるなら、何もしない。最初のタブが表示領域の上または左の外側にある場合、そのタブの位置までスクロール。最後のタブが表示領域の下または左の外側似ある場合、そのサブツリーの高さが表示領域よりも大きければ、最初のタブを表示領域の上または左端に合わせるようにスクロール。表示領域内に収まるようなら、最後のタブの位置までスクロール。

実装しているのはscrollableTabBar.xml。タブバーのスクロールに関する処理は基本的にここに書くようにしている。

同じような処理を何度も書くのが嫌だったので、タブが表示領域の中に収まっているかどうかを調べる方法について少し工夫をしてみた。いつもの自分なら、タブの位置を調べて「表示領域内にある」か「表示領域にない」かの真偽値を返すように書くところだし、実際、今までもそうしてたんだけど、今回は、ここで「表示領域内にある(0)」「左の画面外にある(-1)」「右の画面外にある(1)」「上の画面外にある(-2)」「下の画面外にある(2)」と5つの定数値を返すようにしてみた。これで、返り値が0であるかどうかを見れば画面内かどうかが、0より大きければ右か下の画面外であることが、小さければ左か上の画面外であることが、また、返り値を2で割った余り(returnedValue % 2)が1であればタブバーが上か下に表示されていることが、それぞれ分かるというわけ。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能