ListViewでYUBIが浮いた後の座標の取り方。
なんか久しぶりに更新する気がする。
ListViewで指が浮いた後の座標
ちょっと意味がわからないとか言われたら嫌なので、説明を。
ListViewとかScrollViewはビヨ~ンって出来ますよね?
そのビヨ~ンの時の座標、指が浮いてから加速の分で動くView達の座標を取りたかったんです。
ただ、これが探しても探しても見当たらないんですよー。
onTouchEvent系はTouchした時のListenerしか無いし、onScrollはそれぞれのpositionしか取れなかったりで。
「加速分の座標ってどこ!」って半ギレしながらやっつけコードを書いてたりしました。
事態が急変したのは今日の朝。
日課にしているAndroid Weeklyを読んでいるとこんなレポジトリが。
kmshack/Android-ParallaxHeaderViewPager · GitHub
これにやりたいことがある気がする、と思い立ってずっと今日一日コードを読んだり、Twitterをしてたりしました。
で、見つけたわけです。
素晴らしい、素晴らしい解決策が!
getScrollY()
まぁまぁ、焦らずこのコードを見て下さいよ。
public int getScrollY() { View c = mListView.getChildAt(0); if (c == null) { return 0; } int firstVisiblePosition = mListView.getFirstVisiblePosition(); int top = c.getTop(); int headerHeight = 0; if (firstVisiblePosition >= 1) { headerHeight = mPlaceHolderView.getHeight(); } return -top + firstVisiblePosition * c.getHeight() + headerHeight; }
コレを見た瞬間、10歳ぐらい脳が若返りました。
ListViewのgetCheildAt(0)で1カラム分のViewをcに入れてるんですね。
ココがキモですね。
その後topにc.getTop()をしており、1カラム分の座標を取っていこうとしているんです。
"topには常に1カラム分の座標が取れる"というのが激アツですね。
returnには現在の1カラムの座標、カラム数 * 1カラムの長さ、ヘッダーの長さをそれぞれ足して上げて、現在の座標を返しているんです。
で、onScrollが呼ばれた時にgetScrollY()を呼ぶと指が浮いてる時の座標が取れるんですね!!
最後に
思い付かなかったので、すっごい勉強になりました。
他にも
public static float clamp(float value, float max, float min) { return Math.max(Math.min(value, min), max); }
これとか、私はif文2つ使って書いてしまう気がします。
だけど、ネストを深くしたifよりも断然、↑のコードのほうが見やすいですよね。
流石っすねー。
またブログもボチボチ更新していきます。
Androidのしょうもない小ネタ、Tipsも溜まってきてるので。
ではではー