読者です 読者をやめる 読者になる 読者になる

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も溜まってきてるので。

ではではー