2

그래서 내 레이아웃에 ImageView가 있고 사용자가 후자를 스 와이프하면 이미지를 오른쪽 또는 왼쪽으로 밀기를 원했습니다. 아래 그림과 같이 TranslateAnimation을 사용하여 ImageView를 번역했습니다.TranslateAnimation on ImageView (안 드 로이드)

ImageView logoFocus = (ImageView) findViewById(R.id.logoFocus); 

Animation animSurprise2Movement = new TranslateAnimation(logoFocus.getLeft(), logoFocus.getLeft()+150, logoFocus.getTop(), logoFocus.getTop()); 
animSurprise2Movement.setDuration(1000); 
animSurprise2Movement.setFillAfter(true); 
animSurprise2Movement.setFillEnabled(true); 
logoFocus.startAnimation(animSurprise2Movement); 

내 오른쪽으로 스 와이프 섹션에서이 코드를 배치하고, 동일한 코드 만 메쏘드 getLeft()를 사용하여 한 - 슬쩍 왼쪽 섹션 (150). 처음으로 스 와이프하면 예상대로 작동하지만 다른 방향으로 스 와이프하면 ImageView가 원래 위치로 돌아가 원래 위치로 슬라이드하는 대신 다른 방향으로 슬라이드됩니다.

나는 이미 AnimationListener의 onAnimationEnd 메소드에 다음을 추가하려고 시도했지만, AnimationListener는 Animation으로 설정했지만 헛된 것입니다.

MarginLayoutParams params = (MarginLayoutParams) logoFocus.getLayoutParams(); 
params.setMargins(logoFocus.getLeft()+150, logoFocus.getTop(), logoFocus.getRight(), logoFocus.getBottom()); 
logoFocus.setLayoutParams(params); 

다음과 같은 방법으로 시도했지만 예상대로 작동하지 않았습니다.

((RelativeLayout.LayoutParams) logoFocus.getLayoutParams()).leftMargin += 150; 
logoFocus.requestLayout(); 

아무도 도와 주시겠습니까? 애니메이션 후 setFillAfter (true) 및 setFillEnabled (true)를 사용하더라도 위치가 변경되지 않는 것 같습니다. TranslateAnimation 사용에 대한 대안이 있습니까?

도움을 제공해 주셔서 감사합니다. :)

+1

예, TranslateAnimation API로 디자인 제한이 있습니다. ImageView가 화면 상에 렌더링되는 곳에서는 애니메이션이 변경되지만 실제로 레이아웃의 ImageView 위치는 변경되지 않습니다. Android 3.0에서 소개 된 새로운 객체 기반 애니메이션 API (http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html) – mportuesisf

+0

응답 해 주셔서 감사합니다. 하지만 Android 2.3 (API 레벨 9) 용으로 개발한다면 어떻게 될까요? 다른 방법은 없나요? :/ – jpmastermind

+0

수동으로 항목을 이동할 수 있다고 생각합니다. 그렇게하기위한 올바른 마법 방법을 찾지 못했습니다. 현재 레이아웃을 업데이트하는 대신 ImageView에 새로운 LayoutParams를 설정하십시오. 죄송합니다. 내가 시도한 코드를 놓친 것을 유감스럽게 생각합니다. 프로그래밍 방식으로 레이아웃에서 ImageView를 이동할 수 있으므로 안심하십시오. 다른 사람이 코드에서 결함을 발견 할 수 있습니다. – mportuesisf

답변

11

좋아, 그래서 나는 그 주위를 돌아 다녔다. ImageView가 실제 위치를 변경하도록 강제하는 대신 ImageView를 움직일 때마다 업데이트하는 전역 변수를 사용하고 있습니다. setFillAfter (true) 및 setFillEnabled (true)를 사용하고 있기 때문에 의도하지 않게 원래 위치로 되돌아 가지 않습니다.

private float xCurrentPos, yCurrentPos; 
private ImageView logoFocus; 

logoFocus = (ImageView) findViewById(R.id.logoFocus); 
xCurrentPos = logoFocus.getLeft(); 
yCurrentPos = logoFocus.getTop(); 

Animation anim= new TranslateAnimation(xCurrentPos, xCurrentPos+150, yCurrentPos, yCurrentPos); 
anim.setDuration(1000); 
anim.setFillAfter(true); 
anim.setFillEnabled(true); 
animSurprise2Movement.setAnimationListener(new AnimationListener() { 

    @Override 
    public void onAnimationStart(Animation arg0) {} 

    @Override 
    public void onAnimationRepeat(Animation arg0) {} 

    @Override 
    public void onAnimationEnd(Animation arg0) { 
     xCurrentPos -= 150; 
    } 
}); 
logoFocus.startAnimation(anim); 

같은 문제가 발생하면 도움이 될 것입니다. 좋은 답변이없는 여러 게시물을 보았습니다.

관련 문제