カテゴリー: Java関連

久し振りにAndroid SDKマネージャーを起動して更新してみたら…(´・ω・`)

大きく分けて二つほどエラーが出るようになった(´・ω・`)

一つは”‘d:skin’で始まる無効なコンテンツが見つかりました。ここでは子要素を使用できません。”みたいなエラメッセージのDialogが出るやつ。

これは

  • Android Wear ARM EABI v7a System Image
  • Android Wear Intel x86 Atom System Image

をSDKマネージャーでdeleteしてしまえば良いらしい。

‘d:skin’で始まる無効なコンテンツが見つかりました。ここでは子要素を使用できません。
android – Error Loading the sdk when eclipse is started

ちなみにこの回答はAPI22の時の話だが、API23に関しても同じことをしないと駄目だった。
うちの環境ではAndroid TVかなんかでもエラーが出てたので、それらも削除したような…


もう一つはGoogle Play Serviceのライブラリ絡みで、“No resource found that matches the given name (at ‘value’ with value ‘@integer/google_play_services_version’)”とかいうエラーが出るやつ。

Eclipse 用の Google Play Services Library のありか
android – Missing “/extras/google/google_play_services/libproject” folder after update to revision 30
などを眺めていると、「Looks like Google just broke down Google Play Services into multiple libraries. (GoogleはGoogle Play Servicesのライブラリを複数のライブラリに分解したみたい)」みたいなことが書かれていたので、そういうことなんだろうか。

まあ、上のリンクの方の結論である、https://dl-ssl.google.com/android/repository/google_play_services_8298000_r28.zipを落として来て解凍し、”libproject”フォルダを\extras\google\google_play_servicesにペーストして、eclipse上でインポートし直したら、エラーが消えた。

これが本当に正しい対処方法なのかはよくわからないw
他にもaarを解凍して必要なライブラリを取ってくる?とかUnity用のパッケージをインポートしてなんか色々やると一応は解決するらしい。admobだかなんかのライブラリか?


原因はよくわからないが、取り敢えず解決したから良しとする(・∀・)

Animatorの無限ループってどうやってやんのよ(´・ω・`)?

本来のAnimatorの使い方をしていないので、アニメのループをどうすべきかわからない。
setDuration()でとんでもなく大きい数値を指定するのもなぁ(´・ω・`) ダサイ
その場合でも停止状態で時間が過ぎてしまえば、いずれはアニメーションは停止してしまうし。

Animator.AnimatorListenerとか言うのがあって、その中にonAnimationEnd()みたいなのが
あったのでぐぐる。

ヒットしたページを見てみたがよくわからない(´・ω・`)
つーかこれJavaScript用?
AndroidでAnimatorSetをRepeatするときの注意点

試しに何となくでコーディングしてみたが上手く行かない(´・ω・`)
しょうがないので他の方法を探る。


setDuration()で引数に-1を設定したらどうだろうかとソースを見たら、

if (duration < 0) {
            throw new IllegalArgumentException("Animators cannot have negative duration: " +
                    duration);
        }

ということらしいので駄目(´・ω・`)

更にぐぐってINFINITEなんてのを見かける(・∀・) オ?
Techniques.RollOut

この回答に評価が全くなかったので、駄目なんじゃろうかと更にぐぐる。
INFINITE

example3辺りにObjectAnimator.INFINITEとあったのでValueAnimator.INFINITEでもいいんかなと
setRepeatCount()の引数に指定してみると、上手く行った模様。

まあ定数の中身としてはAnimation.INFINITEと一緒なのかな?


取り敢えずアニメの無限ループはするようになったけれど、再生停止中のアニメーションを
停止させるべきか否か。androidの設計思想というかプログラムの思想としては余計な処理は
止めておけよってことだから、停止させるべきなのかな(´・ω・`) メドイナ

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は何も描かれていない
画像をセットしなくちゃいけないかな?


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

俺氏のやる気スイッチどこー (・ω・`≡´・ω・)

相変わらず、こうすれば出来るんだなぁとわかると中々手の進まなくなる俺氏(´・ω・`)

取り敢えずseekbarを動的生成するやり方がわかる。正確に言うと、以前実験して
試したコードをコメントアウトしてちょこちょこ修正しただけだけどw

リソースからDrawableにする方法を忘れてぐぐる。
Bitmap, Drawableに変換

eclipseが「Resources#getDrawable(int)はレベル22でもうdeprecatedやでー(・∀・)」と言うのでぐぐる。

deprecatedなResources.getDrawableメソッドを置き換える
という形にしとけばいいのか……まあほっといても大した問題にはならなさそうだけどw

まあこれが出来るのであればController自体もxmlを使わずに動的生成しようかなぁ。
その方がカスタマイズ出来る部分が増えそうだし…


DMM.R18の見放題ch ライトを試す。
俺氏の接続環境では夜の3Mbpsでもちょっとバッファリング状態で止まったりしてしまって駄目だった。
1Mbpsならなんとかなる。画質的にも1Mbpsでもそんなに”使用”には問題はないかなぁって感じがする。
ラインナップは2000本で週三回更新という形なので、凄いお気に入りの女の子が居て、そういう子達のみが
観たい人向けではないような気がする。

まあでも月額540円なので、今まで名前は知っていたけど観たことない子をつまみ食い程度に観るには
いいのではなかろうかと思ったり。ただ、なんらかの作業中のBGVにしてはアダルト映像だけというのは
ちょっと飽きてくるので、これに500~600円の一般系定額見放題の動画サービスを加えた方がいいかなぁ。
お金ないから買い物しないけど年会費3900円(325円/月)のamazonプライムに入ってあれの動画サービスと
組み合わせるなら悪くもないか。あれもそんなに大したラインナップではないけれども古い邦画とかあるし。

まああと接続環境もあるけどローカルの動画と比べると当然のことながらバッファリング等が発生して
やや歯痒い感は否めないかもしれない。バッファリング量や画質も事前にユーザー側で設定出来て、
どのくらいバッファリングされているかの表示も欲しいところか。

ふーむ(´・ω・`)