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

DragShadowBuilder使った時にonDragで取れる座標について

Android

30分悩んで解決できたことの共有
あまりスマートじゃないのでもっと良い方法があったら教えて下さいー

onDragで取れる座標

onDragから帰ってくるDragEventではgetXとgetYの座標をとれるメソッドがあります。
しかしこのDragEvent、startDragしたView内の座標しか取れないんです(たぶん) ちがった追記に有り

f:id:amyu_dev:20150209012448p:plain
例えば、この赤枠にあるListView内の子ViewでstartDragした場合、この赤枠内だけの座標しか取れませんでした。

で、今回のViewでやりたかったのがこんな感じ。
http://i.gyazo.com/73a443b0e016621123d08cae69fca08b.gif


例えば、Dragした状態で右方向にずらすとTouchが追えなくなり、DragEventが帰ってこなくなります。
するとy座標で判定していた部分が機能しなくなり...
悩ましかったです。

全部渡せばいいじゃん!

"DragEvent、startDragしたView内の座標しか取れない"
と書いたとおり、渡した部分のView内の座標しか取れないので...
ということは、親Viewを渡して、DragShadowBuilder#onDrawShadowで子Viewをdrawして上げればいいじゃないか!
というふうになったわけです。

するとこんな感じ。

private class DragShadow extends View.DragShadowBuilder {

    View childView;

    public DragShadow(View parent, View child) {
        super(parent);
        childView = child;
    }

    @Override
    public void onDrawShadow(@NonNull Canvas canvas) {
        childView.draw(canvas);
    }

    @Override
    public void onProvideShadowMetrics(@NonNull Point shadowSize, @NonNull Point shadowTouchPoint) {
        int height = childView.getHeight();
        int width = childView.getWidth();
        shadowSize.set(width, height);
        shadowTouchPoint.set(width / 2, height / 2);
        }
    }

こうすることにより、子Viewを保持しているでっかなViewに対して座標を取得することが出来るようになりました。
パチパチー

最後に

ほーよく出来てる。

追記

あああああああああああああ、これえええええええええ。
Listenerを親Viewに対してつければそりゃ中で動いてるものをとれるうううう...
startDragしたやつしかOnDragListenerをセットできないという謎の迷信に囚われてた...

はああああああああ。
無駄な30分を過ごした。


ありがたきGistはこちら


ほんとありがとうございました