2010-11-27 4 views
23

나는 View 커스텀을 썼다. 이제 사용자가 터치 할 때 약간의 맞춤 애니메이션을 만들고 싶습니다. 나는 정의를 말할 때안드로이드의 맞춤 애니메이션

, 나는 기본적으로 각 프레임에게 자신을 렌더링 할 말은하고, 설명 here 같은 "미리 정의 된"애니메이션을 사용하지 마십시오.

이것을 구현하는 올바른 방법은 무엇입니까?

+0

[안드로이드 사용자 지정 애니메이션은] (http://www.singhajit.com/android-custom-animations/) –

+0

@AjitSingh는, 그 기사는 표준 애니메이션 (회전, 번역 등)에 대해 설명합니다. 여기서 내가 묻는 것은 맞춤 애니메이션입니다. – aioobe

답변

22

대부분의 유연성 (꽤 쉬운) 방법은 Animation 클래스를 확장하는 것입니다. 일반적으로

: setDuration() 방법을 사용하여 애니메이션의

  1. 설정 기간입니다.
  2. 선택적으로
  3. 재정 applyTransformation 방법 (exapmle 당신이 LinearInterpolator 또는 AccelerateInterpolator 등을 사용할 수 있습니다) setInterpolator()를 사용하여 애니메이션 보간을 설정합니다. 여기서 우리는 interpolatedTime 변수에 관심이 있으며 0.0에서 1.0 사이에서 변경되며 애니메이션 진행 상황을 나타냅니다. 여기

은 예입니다. (내 BitmapBitmap 자체가 draw 방식으로 그려의 ofsset을 변경하려면이 클래스를 사용하고 있습니다) :

public class SlideAnimation extends Animation { 

    private static final float SPEED = 0.5f; 

    private float mStart; 
    private float mEnd; 

    public SlideAnimation(float fromX, float toX) { 
     mStart = fromX; 
     mEnd = toX; 

     setInterpolator(new LinearInterpolator()); 

     float duration = Math.abs(mEnd - mStart)/SPEED; 
     setDuration((long) duration); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.applyTransformation(interpolatedTime, t); 

     float offset = (mEnd - mStart) * interpolatedTime + mStart; 
     mOffset = (int) offset; 
     postInvalidate(); 
    } 

} 

은 또한 당신이 Transformation#getMatrix()를 사용하여 View을 수정할 수 있습니다.

UPDATE

당신이 안드로이드 애니메이터 프레임 워크 (또는 호환성 구현 - NineOldAndroids)를 사용하는 경우에 경우에 당신은 당신의 사용자 정의 View 속성에 대한 세터와 게터를 선언하고 직접 애니메이션을 적용 할 수 있습니다. 다음은 다른 예입니다.

public class MyView extends View { 

    private int propertyName = 50; 

    /* your code */ 

    public int getPropertyName() { 
     return propertyName; 
    } 

    public void setPropertyName(int propertyName) { 
     this.propertyName = propertyName; 
    } 

    /* 
    There is no need to declare method for your animation, you 
    can, of course, freely do it outside of this class. I'm including code 
    here just for simplicity of answer. 
    */ 
    public void animateProperty() { 
     ObjectAnimator.ofInt(this, "propertyName", 123).start(); 
    } 

} 
+1

"Ahaaaa!" 효과. 좋은! – Terry

-1

XML에서 트위닝 된 애니메이션을 정의하는 것 외에도 프레임 별 애니메이션 (res/drawable에 저장 됨)을 정의 할 수 있습니다.

<animation-list 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true" 
> 
    <item android:drawable="@drawable/frame1" android:duration="300" /> 
    <item android:drawable="@drawable/frame2" android:duration="300" /> 
    <item android:drawable="@drawable/frame3" android:duration="300" /> 
</animation-list> 

애니메이션을 setBackgroundResource를 통해보기 배경으로 설정하십시오.

더 복잡한 작업을 수행하려는 경우 Canvas 클래스를 살펴보십시오. draw with Canvas에 대한 간단한 소개를 참조하십시오.

+1

그는 프로그램 안의 각 프레임을 렌더링하려고합니다. – dacwe

+0

흠 ... 애니메이션은 구성 요소가 눌린 위치에 따라 달라집니다. – aioobe

2
Animation animation = new AnimationDrawable(); 
animation.addFrame(getResources().getDrawable(R.drawable.exp1), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp2), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp3), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp4), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp5), 50); 
animation.addFrame(getResources().getDrawable(R.drawable.exp6), 50); 

이것은 내 onCreate()에서 프레임 별 애니메이션을 사용자 정의하는 데 사용하는 코드입니다.

그런 다음 애니메이션을 시작해야하지만 UI 스레드 내부에서 애니메이션을 시작해야합니다. 그래서 나는 Runnable을 사용한다. I 가정

((ImageView) findViewById(R.id.ImageToAnimateOnClicking)).post(new Starter()); 
+0

멋지게 보입니다. 이러한 드로어 블을 프로그래밍 방식으로 렌더링하는 것이 실현 가능합니까? (애니메이션은 사용자가 클릭하는 위치에 따라 달라집니다 ...) – aioobe

+0

'AnimationDrawable' '애니메이션'은 setBackgroundResource를 통해 배경보기로 설정할 수 있습니다. 오버레이를 사용하여 절대적으로 배치하는 쉬운 방법을 찾을 수도 있습니다. 아마 사용자가 클릭하는 위치에 달려 있습니다! (버튼, 표면보기, 이미지, 목록보기) –

1

비트 맵으로서 각각의 프레임을 생성 한 다음, 애니메이션에 건네

class Starter implements Runnable { 
    public void run() { 
     animation.stop(); 
     animation.start(); 
    } 
} 

저는 이미지 뷰의 .post() 메소드를 사용하여) (온 클릭으로부터의 Runnable 것을 시작할 리소스에서 드로어 블을 가져 오는 대신 직접 가져올 수 있습니다. 사용자 지정 애니메이션을 만들 수

Bitmap bm = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_888); 
Canvas c = new Canvas(bm); 
.... Draw to bitmap 
animation.addFrame(bm,50) 
.... repeat for all frames you wish to add. 
+0

장치가 처리 할 수있는 FPS의 수를 미리 말할 수는 없지만 수치 스럽습니다. 5FPS처럼 처리 할 수 ​​있다면 20FPS 애니메이션을 렌더링 할 때 많은 리소스를 낭비하지 않아야합니다 ... "반복적으로"다시 칠하기를 계획하고 요청에 따라 프레임을 렌더링하는 좋은 방법이 있다면, 이 문제가 있습니다. – aioobe

+1

글쎄, OpenGL을 사용한다면 30fps를 아무 문제없이 처리 할 수 ​​있어야합니다. 그래픽 적으로 도전적인 일을하는 경우에해야합니다. Canvas와 GL은 성능 차이가 큽니다. – HaMMeReD

0

사용자 정의보기에 추가 할 수있는 네 가지 유형의 애니메이션이 있습니다.

  1. 알파 -
  2. 번역 요소의 투명성을 애니메이션 -
  3. 스케일 요소의 위치를 ​​애니메이션 - 소자의 크기를 애니메이션
  4. 로테이션 - 여기

blog post 인 요소의 회전을 애니메이션화하는 그들 각각에 대해 자세히 설명합니다.

일단 애니메이션을 만들었 으면 아래 코드를 사용하여 해당 맞춤 애니메이션을보기에 추가하십시오.

findById(R.id.element).startAnimation(AnimationUtils.loadAnimation(this, R.anim.custom_animation)); 
+0

제 질문에서 두 번째 단락을 놓친 것 같아요. – aioobe