66のビューのグリッドがあり、ビューをタッチしたり、ドラッグ/移動したりした場合は、背景色を変更したいと思います。
親のViewGroupにタッチリスナーを配置する必要があると思いますが、ドラッグ/移動されている子ビューを特定するにはどうすればよいですか?
ここで私の答えを見つけました:
Android:どのタッチがリリースされたかのみを表示します
子ビューをループし、ヒット検出を手動で実行して、タッチが現在終了しているビューを見つける必要があるようです。
親LinearLayoutのdispatchTouchEventをオーバーライドすることでこれを行いました。
LinearLayout parent = new LinearLayout(this.getActivity()){
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int x = Math.round(ev.getX());
int y = Math.round(ev.getY());
for (int i=0; i<getChildCount(); i++){
LinearLayout child = (LinearLayout)row.getChildAt(i);
if(x > child.getLeft() && x < child.getRight() && y > child.getTop() && y < child.getBottom()){
//touch is within this child
if(ev.getAction() == MotionEvent.ACTION_UP){
//touch has ended
}
}
}
return true;
}
}
テストされていませんが、次のようなことができると思います: ScrollView Inside ScrollView
parentView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.v(TAG,"PARENT TOUCH");
findViewById(R.id.child).getParent().requestDisallowInterceptTouchEvent(false);
return false;
}
});
childView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event)
{
Log.v(TAG,"CHILD TOUCH");
// Disallow the touch request for parent on touch of child view
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
おそらく、すべてのchildViewをループして、OnTouchListenerを設定するだけです。