Vertical SeekbarでthumbをsetThumb()を使ってアニメーションをさせようとすると上手く行かない件(´・ω・`)

ようやく重い腰を上げてアニメーションthumb付きのSeekbarをプログラムに組み込む。
特に問題なく動いた(・∀・)

Vertical Seekbarにもアニメーションthumbのコードを追加した。
特に問題なく動いた(・∀・)  …かのように見えた。


次のステップに進もうして眺めているうちに、Vertical Seekbarでのアニメーションが
おかしいことに気づく。アニメーションはしているが、アニメーション中はthumbが移動しないのだ(´・ω・`)

今実装しているアニメーションは決め打ちのアニメパターン(6枚)をsetThumb()で差し替えるものであったが、
追加時に面倒くさくて4枚しかdrawableフォルダにコピーしてなかったので発覚したのであった(ノ∀`)
この状態だとアニメパターンはループせずに4枚目を表示した後に停止し、setThumb()を呼び出さず、
thumbの移動が開始する。試しに残りの2枚も追加するとVertical Seekbarではthumbが全く移動せずに
ひたすらアニメパターンが繰り返し描画された。

おおまかな原因を突き止めている現在にこういう風に書くと、誰が見てもおかしいのはsetThumb()にあるのは
すぐにわかるが、それを突き止める為に数日間を無駄にした…(ヽ’ω`)

まあ専従でバグを突き止めようとしていたのではなく、dmm見放題ライトのavを流しつつ、kindle等で無料
配信されていた漫画を読んだり、テレビを横目に見つつだったり、PS2のゲームをやりつつ、ちょろっと
思いついたことを試したりしていたので余計に時間がかかったのかもしれない(・∀・)


一番最初に疑ったのはVertical Seekbarのコード。これは覚え書き 主にレイアウトの背景色の時に
参考にしたものだが、完全には理解してない(ノ∀`)

というわけで、このコードの部分を変更したり削ったりしてみたが、状況は変わらず。

次に疑ったのはアニメーション用に追加したValueAnimatorだったが、これはよくよく考えてみたら
横方向のCustomSeekbarにも同じように追加しているので犯人でないw

ますますもってわからなくなり、最後にsetThumb()をコメントアウトし、その状態で実行すると
問題なくthumbが動くことから(ValueAnimator追加前に戻したとも言える)、setThumb()を疑うことに。


なんかバグじゃろかとぐぐったりしたが、特にヒットすることもなく。
悩んだ挙句に親クラスを追っていった。

すぐ上のSeekbarはsetThumb()を持ってない。2つ上のprogress barはthumbを持たないはず。
ということはAbsSeekbarか( ・´ω・`)!!

でまぁ、中を適当に見たがよくわからない。しばらくこれとVertical Seekbarの挙動を眺めた末に
setThumbPos()に対して渡す引数がgetWidth()とか横向きのSeekbarしか想定されていないのが
原因なんじゃないかなぁと推測した。setThumb()する度にここで横向きの位置にセットされてしまい、
縦方向は移動せず、その幅から横方向にも移動せず、その場に止まっているように見えるのでは
なかろうかと。

で、じゃあsetThumbPos()をオーバーライド出来ないかと思ったけど無理(´・ω・`)
setRotation()を使う形にしてdrawThumb()をオーバーライドしてどうにか出来ないかと思ったが無理(´・ω・`)
とにもかくにもAbsSeekbarを触るのは駄目らしい。


ここで考えられる対応策は

  1. Progressbarを継承してAbsSeekbarの実装を移して、更にSeekbarの実装を移す。
  2. 最低限の単純な機能しか持たない独自の嘘んこSeekbarを作る。
  3. Vertical Seekbarでのアニメーションthumbを諦める。

くらい。

でもまあ1番目の策はめどい(´・ω・`)
そしてそこまでの能力はない。故にパス。

2番目の策もめどい。でも最悪これもありか?

3番目の策はアリといえばアリだが、この先も出てくるであろう妥協しなければならない点を
踏まえるとここで妥協カードを早速使ってしまっていいのだろうかと悩むw

どうしようかと思いつつ色々と試す。
そして上手くいくかどうかはともかく思いつく( ゚Д゚)ピコーンッ

「setThumb()しなければ、位置は動く。drawThumb()は変えられないけど、SeekbarのonDraw()の中で
thumbの位置に絵を描いちゃえばいいんじゃね(・∀・)?」

			Drawable d = getResources().getDrawable(i);
			c.save();
			c.translate(super.getPaddingLeft()-super.getThumbOffset(), super.getPaddingTop());
			d.setBounds(getThumb().getBounds().left,
						getThumb().getBounds().top,
						getThumb().getBounds().left + d.getIntrinsicWidth(),
						getThumb().getBounds().top+d.getIntrinsicHeight());
			d.draw(c);
			c.restore();

みたいな感じ。
c.save()とc.restore()ってやる必要があるかどうかわかってないw

まあこれでValueAnimatorのonAnimationUpdate()でカウント用の変数をインクリさせて、onDraw()で
アニメパターンを変更しているけど、これでいいのかどうかはわからないw

何はともあれ、これでthumbをアニメーション化出来るみたいだ(・∀・)
まあ今回は元の絵(アイコン)とアニメパターン(元の絵にちょっと追加しただけのもの)は基本的な部分が
同じなので問題はないが、実際の実装時にはアニメーション時のデフォルトthumbは何も描かれていない
画像をセットしなくちゃいけないかな?


中々先へ進まない(´・ω・`)