2014-06-14 2 views
4

ObjectAnimator.ofFloat (...)를 사용하여 화면의 오른쪽 위 모서리로 뷰를 이동하려고합니다. 그러나 예상 한 결과를 얻지 못하고 있습니다. ViewTreeListener 등을 사용하여 미리 뷰의 좌표를 가져오고 있으며 전체 폭의 끝에서 오프셋 할 필요가있는 x 값을 이미 알고 있습니다. 나는 어느 방향 으로든 내가 원하는 곳으로 이동할 수 없다. 관련 코드 :ObjectAnimator의 translationX/Y 값을 결정합니다. 보기를 정확한 화면 위치로 이동하는 방법?

시작 좌표 얻기; 뷰가 현재 여기서 놀랍게도

int[] userCoords = new int[]{0,0}; 
userControlLayout.getLocationInWindow(userCoords); 
//also tried getLocationInScreen(userCoords); same result 
userUpLeft = userCoords[0]; 
userUpTop = userCoords[1]; 

, 나는 (화면 좌표이며, 부모를 기준으로하지 않음) userUpLeft 내가 userControlLayout.getLeft()를 호출 할 때 나는 그들을 나의 이해에 따라 다른 것으로 기대할와 같은 값을 얻을 문서의 어쨌든 ...

는 ObjectAnimators를 구축 :

//testXTranslate is a magic number of 390 that works; arrived at by trial. no idea why that 
// value puts the view where I want it; can't find any correlation between the dimension 
// and measurements I've got 
ObjectAnimator translateX = ObjectAnimator.ofFloat(userControlLayout, "translationX", 
                    testXTranslate); 

//again, using another magic number of -410f puts me at the Y I want, but again, no idea //why; currently trying the two argument call, which I understand is from...to 
//if userUpTop was derived using screen coordinates, then isn't it logical to assume that -//userUpTop would result in moving to Y 0, which is what I want? Doesn't happen 
ObjectAnimator translateY = ObjectAnimator.ofFloat(userControlLayout, "translationY", 
                    userUpTop, -(userUpTop)); 

나의 이해는 하나의 인수를 호출하면/이동을 번역 할 좌표 끝을 지정하는 것과 같습니다, 두 인수 버전에서 시작된다는 점이다 ...에서 끝나는, 또는에서 ... 나는 둘 다로 어지럽 혔고 거기에 갈 수 없습니다.

분명히, 나는 정확히 무엇이 정확한지 알아 내려고 아주 근본적인 지식을 놓치고 있습니다. 어떤 조언을 많이 주셨습니다. 감사.

답변

14

먼저 userControlLayout.getLeft()은 부모보기에 대한 것입니다. 이 부모가 화면의 왼쪽 가장자리에 정렬되면 해당 값이 일치합니다. getTop()의 경우 일반적으로 getLocationInWindow()절대 좌표를 반환하기 때문에 간단합니다. 즉, y = 0은 윈도우의 왼쪽 상단 즉 동작 표시 줄 뒤에 있습니다.

일반적으로 부모를 기준으로 컨트롤을 변환하려고합니다 (경계 밖으로 벗어나는 경우 그려지지 않기 때문에). 당신이 ObjectAnimator에 여러 값을 제공 할 때,

int deltaX = targetX - button.getLeft(); 
int deltaY = targetY - button.getTop(); 

ObjectAnimator translateX = ObjectAnimator.ofFloat(button, "translationX", deltaX); 
ObjectAnimator translateY = ObjectAnimator.ofFloat(button, "translationY", deltaY); 

당신은 애니메이션의 중간 값을 나타내는 것 : 그래서 당신은 (targetX, targetY)의 위치 제어하려는 가정하면, 당신은 사용해야합니다. 따라서 귀하의 경우 userUpTop, -userUpTop은 번역이 먼저 내려간 다음 위로 이동하게됩니다. 번역 (회전 및 기타 모든 변형)은 항상 원래 위치에 상대적이라는 것을 기억하십시오.

+0

감사합니다. @matiash. userControlLayout.getTop()은 getLocationInWindow와 같은 값을 반환합니다. 그것은 다르지 않다. 토론을 위해 Y를 사용하여, 그것을 0으로 옮기고 싶습니다. 맨 위까지 (액션 바 없음). 내가 0 - userControlLayout.getTop()을 사용하면, 그것은 단지 위로 움직일 수 있습니다. 내가 옮기고 싶은 생각은 단편적이며 3 명의 부모가 있습니다. 모두 너비/높이가 부모를 채우기 위해 설정 됨 ... (계속) – wkhatch

+0

... (계속) 내가 언급 한 하드 코딩 된 값을 사용하여 원하는 위치로 이동할 수 있습니다 (이는 부모의 바깥으로 이동할 수 있음을 암시합니다).),하지만 내가 액세스 할 수있는 좌표와 측정에 대한 계산을 사용하지는 않습니다. 더 많은 정보를 얻기 위해 부모 레이아웃을 조사해야합니까? 그렇다면 무엇을해야합니까? 답장을 보내 주셔서 감사합니다 – wkhatch

+0

질문에 대한 답변을 얻었습니까? 같은 오해가 있기 때문에 묻기 (( – konunger