DragShadowBuilder使った時にonDragで取れる座標について
30分悩んで解決できたことの共有
あまりスマートじゃないのでもっと良い方法があったら教えて下さいー
onDragで取れる座標
onDragから帰ってくるDragEventではgetXとgetYの座標をとれるメソッドがあります。
しかしこのDragEvent、startDragしたView内の座標しか取れないんです(たぶん) ちがった追記に有り
例えば、この赤枠にあるListView内の子ViewでstartDragした場合、この赤枠内だけの座標しか取れませんでした。
例えば、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に対して座標を取得することが出来るようになりました。
パチパチー
最後に
ほーよく出来てる。
追記
@amyu_san あれっ。素直に childItem.startDrag() 、ListView.setOnDragListener() するのではダメなの?
— HaRu (@h6a_h4i) February 8, 2015
あああああああああああああ、これえええええええええ。
Listenerを親Viewに対してつければそりゃ中で動いてるものをとれるうううう...
startDragしたやつしかOnDragListenerをセットできないという謎の迷信に囚われてた...
はああああああああ。
無駄な30分を過ごした。
@amyu_san 気になったから勉強がてら書いてみたコード → https://t.co/2jMtm51lBV
— HaRu (@h6a_h4i) February 8, 2015
ありがたきGistはこちら
ほんとありがとうございました