특히 만든 드래그 앤 드롭 상황에서 내가 만든 사용자 정의 ViewGroup에서 뷰 요소를 배치하는 데 문제가 있습니다. Android 2.2 이상을 타겟팅하므로 Android 3에 제공된 드래그 앤 드롭 API를 실제로 사용할 수 없습니다.Android : MotionEvent를 사용하여 사용자 정의 ViewGroup에서 뷰의 드래그 앤 드롭 위치 지정
내 사용자 정의 ViewGroup은 "NodeGrid"라고하며 "RelativeLayout"을 확장합니다. 그 onLayout 방법은 다음과 같습니다하도록 오버라이드 (override)한다 : "NodeGrid"의
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4)
{
//pxConversion is a multiplier to convert 1 dip to x pixels.
//We will use it to convert dip units into px units.
Resources r = getResources();
float pxConversion = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, r.getDisplayMetrics());
//Layout the children of this viewgroup
int childCount = this.getChildCount();
for (int i = 0; i < childCount; i++)
{
NodeView view = (NodeView) this.getChildAt(i);
if (view.DataContext != null)
{
int left = (int) (view.DataContext.get_left() * pxConversion);
int top = (int) (view.DataContext.get_top() * pxConversion);
int right = left + (int) (view.DataContext.get_width() * pxConversion);
int bottom = top + (int) (view.DataContext.get_height() * pxConversion);
view.layout(left, top, right, bottom);
}
}
}
아이들은 유형 (위의 코드에서 볼 수 있듯이) "NodeView"에 있습니다. NodeView는 내가 만든 사용자 정의 뷰 클래스입니다. 여기에는 NodeGrid의 NodeView 인스턴스에 대한 위치 정보가있는 getter/setter가 포함 된 뷰 모델 클래스 인 "DataContext"라는 멤버가 포함되어 있습니다.
내 "NodeView"클래스는 사용자가 터치 이벤트를 캡처하므로 사용자는 그리드의 아무 곳이나 노드를 드래그 앤 드롭 할 수 있습니다. 이벤트 핸들러는 다음과 같습니다
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
isBeingDragged = true;
}
else if (event.getAction() == MotionEvent.ACTION_UP)
{
isBeingDragged = false;
}
else if (event.getAction() == MotionEvent.ACTION_MOVE)
{
if (DataContext != null && isBeingDragged)
{
float xPosition = event.getRawX();
float yPosition = event.getRawY();
DataContext.set_left(xPosition);
DataContext.set_top(yPosition);
this.requestLayout();
}
}
return true;
}
내 문제는 내가 내 "NodeGrid"에 그것을 기대하는 것처럼 끌고있는 뷰가 배치되지 않는 것입니다. 드래그하면 x 축의 위치는 정확하지만 y 축의 위치는 언제든지 일정한 픽셀만큼 오프셋됩니다. 이 문제의 원인은 무엇입니까? getRawX() 및 getRawY()보다는 getX() 및 getY() 메서드를 사용하여 시도했지만 더 나쁜 경우에만 발생합니다.
getRawX() 및 getRawY()가 px 단위 또는 dip 단위를 나에게 반환했는지 확신 할 수 없기 때문에 px 단위를 돌려 주었을 것으로 예상되어 새로운 x를 할당하기 전에 dip 단위로 변환하려고 시도했습니다. y 값을 노드에 전달했으나 오프셋 만 줄이면 제거되지 않았습니다.
내가 만지고있는 곳과 노드가있는 곳의 차이를 일으키는 원인은 무엇일까요? 분명히 다른 사람이 이런 상황을 발생하지 것을
안녕하세요, 문제를 해결 했습니까? 전체 다운로드 코드를 가지고 있습니까? – Ricardo