2011-02-11 8 views
7

Android의 애니메이션 프레임 워크를 사용하여 ImageView를 다이아몬드 패턴으로 이동하려고합니다. 여기 내 animation.xml입니다 :Android 애니메이션 XML 문제

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
<translate 
    android:fromXDelta="40%p" android:toXDelta="90%p" 
    android:fromYDelta="10%p" android:toYDelta="40%p" 
    android:duration="500" android:startOffset="0"/> 
<translate 
    android:fromXDelta="90%p" android:toXDelta="40%p" 
    android:fromYDelta="40%p" android:toYDelta="90%p" 
    android:duration="500" android:startOffset="500"/> 
<translate 
    android:fromXDelta="40%p" android:toXDelta="10%p" 
    android:fromYDelta="90%p" android:toYDelta="40%p" 
    android:duration="500" android:startOffset="1000"/> 
<translate 
    android:fromXDelta="10%p" android:toXDelta="40%p" 
    android:fromYDelta="40%p" android:toYDelta="10%p" 
    android:duration="500" android:startOffset="1500"/> 
</set> 

내 레이아웃 :

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> 
    <ImageView 
     android:id="@+id/img" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/icon"/> 
</FrameLayout> 

그리고 내 ONSTART :

protected void onStart() { 
    super.onStart(); 

    ImageView img = (ImageView)findViewById(R.id.img); 
    Animation a = AnimationUtils.loadAnimation(this, R.anim.diamond); 
    img.startAnimation(a); 
} 

나는 내가 보는 모든 후 2 초 빈 화면 내 응용 프로그램을 시작할 때 내 이미지가 화면의 왼쪽 상단 모서리에 나타납니다. 번역 애니메이션 중 하나를 제외하고 모두 제거하면 이미지가 대각선으로 이동하는 것을 볼 수 있습니다.

XML을 사용하여 Java가 아닌 애니메이션을 정의하는 것을 선호합니다.

누구나 전체 애니메이션을 볼 수있는 방법에 대한 통찰력이 있습니까?

-Dan

+0

"% p"를 (를) 사용하는 것과 관련이있는 것으로 보입니다. "% p"를 "%"로 변경하면 전체 애니메이션이 작동하지만 화면의 훨씬 작은 부분에만 국한됩니다. 문서 "%"는 객체와의 관계에 있으며 "% p"는 객체의 부모와 관련이 있습니다. 실제로는 원하는 것입니다. 그래서 왜 작은 상자에 애니메이션을 수행하는지 설명합니다. – Dan

+0

더 명확히하기 위해 애니메이션을 사용하는 ImageView의 부모와 관련하여 XML을 사용하여 애니메이션을 정의하고 싶습니다. 프레임 워크가 손상되었다는 답변을 수락하지 않으며 Java에서 애니메이션을 정의해야하는 대답도 수락하지 않습니다. – Dan

답변

15

애니메이션 속성은 시작할 때 그들이 어디에 기준으로합니다. 이것은 아마 당신이 원하는에 많이 가깝다 :

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
<translate 
    android:fromXDelta="40%p" android:toXDelta="90%p" 
    android:fromYDelta="10%p" android:toYDelta="40%p" 
    android:duration="500" android:startOffset="0"/> 
<translate 
    android:fromXDelta="0%p" android:toXDelta="-50%p" 
    android:fromYDelta="0%p" android:toYDelta="50%p" 
    android:duration="500" android:startOffset="500"/> 
<translate 
    android:fromXDelta="0%p" android:toXDelta="-30%p" 
    android:fromYDelta="0%p" android:toYDelta="-50%p" 
    android:duration="500" android:startOffset="1000"/> 
<translate 
    android:fromXDelta="0%p" android:toXDelta="30%p" 
    android:fromYDelta="0%p" android:toYDelta="-30%p" 
    android:duration="500" android:startOffset="1500"/> 
</set> 
+0

우수! 그것은 효과가있다! 빠른 응답 주셔서 감사합니다! – Dan

+0

Reuben Scratton 안녕하세요, 버튼 클릭시이 애니메이션을 일시 중지하고 다시 클릭시 다시 시작하겠습니다. 그것은 가능한가? – Deepak

+0

문자 그대로 하루 종일이 것을 알아 내려고 노력했습니다. 나는 이제 막 포기했다. 솔루션을 가져 주셔서 감사합니다. – DroidT

1

이 시도 :

Animation anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.diamond); 
findViewById(R.id.img).setAnimation(anim); 
anim.start(); 

당신은 또한 아마 다른 후 하나를로드 할 애니메이션을 변경해야합니다. 나는 당신이 만든 세트가 모든 애니메이션을 한 번에 재생하려고 시도 할 것이고 그것은 그렇게 잘 작동하지 않을 것이라고 생각합니다.

사용이 같은 animationListener는 :

anim.setAnimationListener(new Animation.AnimationListener() { 

     public void onAnimationStart(Animation animation) { 
     } 

     public void onAnimationEnd(Animation animation) { 
      Animation anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.diamond2); 
      findViewById(R.id.img).setAnimation(anim); 
      anim.start(); 
     } 

     public void onAnimationRepeat(Animation animation) { 
     } 
    }); 
+0

이것은 나에게 아무런 효과가 없었다. doc (http://developer.android.com/guide/topics/resources/animation-resource.html)에 따르면, 애니메이션에서 startOffset을 지정할 수 있어야합니다.이 startOffset을 사용하면 애니메이션을 '연결'할 수 있어야합니다. 내가 보여준 방식. – Dan

1

를 사용하여 작동이 하나, 내가 그것을

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
    <translate 
     android:fromXDelta="40%p" android:toXDelta="90%p" 
     android:fromYDelta="10%p" android:toYDelta="40%p" 
     android:duration="500" android:startOffset="0" 
     /> 
    <translate 
     android:fromXDelta="0%p" android:toXDelta="-40%p" 
     android:fromYDelta="0%p" android:toYDelta="40%p" 
     android:duration="500" android:startOffset="500"/> 
    <translate 
     android:fromXDelta="0%p" android:toXDelta="-40%p" 
     android:fromYDelta="0%p" android:toYDelta="-40%p" 
     android:duration="500" android:startOffset="1000"/> 
    <translate 
     android:fromXDelta="0%p" android:toXDelta="40%p" 
     android:fromYDelta="0%p" android:toYDelta="-40%p" 
     android:duration="500" android:startOffset="1500"/> 
    </set> 
0

사용이 애니메이션 XML 코드를 테스트 HVE. 그것은 작동합니다 :

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="true"> 
<translate 
    android:fromXDelta="40%" android:toXDelta="90%" 
    android:fromYDelta="10%" android:toYDelta="40%" 
    android:duration="500" android:startOffset="0"/> 
<translate 
    android:fromXDelta="90%" android:toXDelta="40%" 
    android:fromYDelta="40%" android:toYDelta="90%" 
    android:duration="500" android:startOffset="500"/> 
<translate 
    android:fromXDelta="40%" android:toXDelta="10%" 
    android:fromYDelta="90%" android:toYDelta="40%" 
    android:duration="500" android:startOffset="1000"/> 
<translate 
    android:fromXDelta="10%" android:toXDelta="40%" 
    android:fromYDelta="40%" android:toYDelta="10%" 
    android:duration="500" android:startOffset="1500"/> 
</set>