Android에서 뷰 위치를 동적으로 설정하려면 어떻게해야합니까? X, Y 위치를

코드를 통해보기 위치를 변경하려면 어떻게해야합니까? X, Y 위치를 변경하는 것과 같습니다. 가능할까요?



답변

Honeycomb (API 레벨 11) 이하의 경우 setLayoutParams(...).

당신이 벌집에 지원을 제한 할 수있는 경우 사용할 수있는 최대 setX(...), setY(...), setLeft(...), setTop(...), 등


답변

예, Android에서보기 위치를 동적으로 설정할 수 있습니다. 마찬가지로 당신은이 ImageViewLinearLayout당신의 XML을 통해 당신의 위치를 설정할 수 있습니다 file.So LayoutParams나누었다 취할 있는지 확인 LayoutParams하여 XML file.There에서 촬영 레이아웃에 따라 다른 LayoutParams촬영 레이아웃에 따라.

설정할 코드는 다음과 같습니다.

    LayoutParams layoutParams=new LayoutParams(int width, int height);
    layoutParams.setMargins(int left, int top, int right, int bottom);
    imageView.setLayoutParams(layoutParams);

자리를 잡는 데 도움이 되었으면합니다.


답변

이미 다른 유효한 답변이 있지만 해당 API 수준 제한을 제외하고 어떤 경우에 사용할 방법을 올바르게 제안하는 것은 없습니다.

  • 레이아웃주기를 기다릴 수 있고 상위 뷰 그룹이 MarginLayoutParams(또는 하위 클래스)를 지원 하는 경우 marginLeft/ marginTop그에 따라 설정하십시오 .

  • 위치를 즉시 지속적으로 변경해야하는 경우 (예 : PopupMenu 앵커의 경우) 추가로 layout(l, t, r, b)동일한 좌표로 호출 하십시오. 이것은 레이아웃 시스템이 나중에 확인할 것을 선점합니다.

  • 즉각적인 (임시적인) 변경 (예 : 애니메이션)의 경우 대신 setX()/를 setY()사용합니다. 부모 크기가 WRAP_CHILDREN에 의존하지 않는 경우 setX()/ setY()배타적 으로 사용하는 것이 좋습니다 .

  • setLeft()/ setRight()/ setBottom()/를 사용 하지 마십시오setTop() . 아래를 참조하십시오.

배경 : mLeft/ mTop/ mBottom/ mRight필드는 layout ()의 해당 LayoutParams에서 채워집니다. 레이아웃은 Android 뷰 레이아웃 시스템에서 암시 적 및 비동기 적으로 호출됩니다. 따라서를 설정하는 MarginLayoutParams것이 위치를 영구적으로 설정하는 가장 안전하고 깨끗한 방법 인 것 같습니다. 그러나 비동기 레이아웃 지연은 경우에 따라 문제가 될 수 있습니다. 예를 들어 뷰를 사용하여 커서를 렌더링 할 때 위치를 변경하고 동시에 PopupMenu 앵커 역할을해야합니다. 이 경우 전화가 layout()잘 작동했습니다.

의 문제는 다음 setLeft()setTop()같습니다.

  • 혼자 그들을 호출하는 것만으로는 충분하지 않습니다 – 당신은 또한 호출해야 setRight()하고 setBottom()스트레칭이나 뷰를 축소시키지 마십시오.

  • 이러한 메서드의 구현은 비교적 복잡해 보입니다 (= 각각에 의해 발생하는보기 크기 변경을 설명하기 위해 몇 가지 작업 수행).

  • 입력 필드에 이상한 문제가 발생하는 것 같습니다. EditText 소프트 숫자 키보드가 때때로 숫자를 허용하지 않습니다.

setX()setY()작업 레이아웃 시스템의 외부에서, 상기 대응하는 값은 이에 따라 볼을 이동, 배치 시스템에 의해 결정된 좌 / 상 / 하 / 좌 오프셋 값 추가로 처리된다. 애니메이션에 추가 된 것 같습니다 (레이아웃주기를 거치지 않고 즉각적인 효과가 필요한 경우).


답변

NineOldAndroids 라는 라이브러리가있어 Honeycomb 애니메이션 라이브러리를 버전 1까지 사용할 수 있습니다.

즉, 약간 다른 인터페이스로 왼쪽, 오른쪽, translationX / Y를 정의 할 수 있습니다.

작동 방식은 다음과 같습니다.

ViewHelper.setTranslationX(view, 50f);

ViewHelper 클래스의 정적 메서드를 사용하고 뷰와 설정하려는 값을 전달하기 만하면됩니다.


답변

setTranslationX및을 사용하는 것이 좋습니다 setTranslationY. 나는 이것에 대해 단지 시작일 뿐이지 만 이것은 뷰를 이동하는 가장 안전하고 선호되는 방법 인 것 같습니다. 정확히 무엇을하려고하는지에 따라 크게 달라지는 것 같지만 2D 애니메이션에서는 잘 작동합니다.


답변

HoneyComb Sdk (API 레벨 11)를 사용하는 경우 다음 방법을 사용해 볼 수 있습니다.

view.setX(float x);

매개 변수 x는이 뷰의 시각적 x 위치입니다.

view.setY(float y);

매개 변수 y는이보기의 시각적 y 위치입니다.

도움이 되었으면합니다. 🙂


답변

모든 API 레벨에 대한 지원을 위해 다음 과 같이 사용할 수 있습니다 .

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);