2012-10-31 3 views
7

나는 Property AnimationHardware Acceleration을 읽었지 만, 애니메이터 클래스를 사용하는 가장 효율적인 방법은 무엇인지 아직도 확신 할 수 없습니다. (이 질문을 위해 Honeycomb보다 먼저 장치를 지원할 필요가 없으므로 애니메이터 클래스를 사용하고 싶습니다.)애니메이터 클래스를 사용하여 뷰 내에서 드로어 블을 애니 메이팅하는 최적의 방법은 무엇입니까?

예를 들어보기가 있다고 가정 해보십시오. 이 뷰에는 페이드 인하고자하는 BitmapDrawable이 있습니다. 뷰 내에 변경되지 않는 많은 다른 요소가 있습니다.

애니메이터에 가장 적합한 속성이나 개체는 무엇입니까? 드로어 블? onDraw에서 비트 맵을 그리는 페인트는 무엇입니까? 다른 것?

어떻게 하드웨어 가속을 사용하면 가장 효율적으로 수행 할 수 있습니까? 이 경우 애니메이션의 각 단계마다 무효화를 호출해야합니까, 아니면 드로어 블 만 애니메이션으로 표시하고 애니메이션의 각 단계마다 나머지 뷰가 완전히 다시 그려지지 않게 할 수 있습니까?

내가 생각하기에 최적의 경우는 소프트웨어에서 완전히 다시 그리지 않아도되는 뷰의 나머지 부분이지만 하드웨어 가속을 사용하면 효율적으로 드로어 블을 페이드 아웃시킬 수 있다고 생각합니다.

권장되는 접근 방법에 대한 제안이나 조언이 있으십니까?

감사합니다.

+0

음, 문제가되고 있기 때문에 이것을 묻는 것 같습니다. 애니메이션은 모든 것을 무효로 만들지 만, 우리가 가지고있는 뷰 계층 구조를 보여 주면 해결 방법을 찾을 수 있습니다. 당신이 그 안에 움직이는 것을 지정하십시오. –

+0

아니, 아직 아무 것도 쓰지 않았다. 내가하기 전에 모든 정보를 얻으려고했다. :) – cottonBallPaws

+0

음, 애니메이션이 평균적인 장치에서 잘 작동한다면, 우리는 괜찮습니다. 그러나 하드웨어 가속과 같은 일반적인 향상 (항상 사용할 수있는 것은 아님) 이후에도 눈에 띄게 무겁다면 자신 만의 솔루션을 찾아야합니다. 예를 들어, 전체 계층 구조를 무효로 만드는 배경에 애니메이션을 적용하는 경우 계층 구조의 스냅 샷을 만들고 그 뒤에 배경을 애니메이션으로 만듭니다. 어쨌든 하드웨어 가속 및 대부분의 장치에서 작동하기 때문에 노력을 기울일 지 여부는 기본적으로 결정됩니다. (잘하면 :) –

답변

4

Object Property Animators를 사용하면 기본적으로 변경하려는 속성이 "N"인 모든 X 밀리 초마다 "setN()"메소드를 반복적으로 호출하는 수학 함수입니다.

알파의 경우 제공된 예제에서 애니메이트하는 뷰를 다시 그리려면 invalidate()을 호출해야합니다. 차이점은 이라고 View 개체에서 호출하면 invalidate()이 호출됩니다. 드로어 블을 그리는 데 사용되는 Paint 개체로 대상 객체를 설정하려면 View에서 invalidate()을 호출해야합니다. 그러면 새 Paint 매개 변수로 다시 그려집니다.

대상을 가능한 한 가장 높은 수준의 자식으로 설정하는 것이 이상적입니다. 다시 그리기는 애니메이션하려는보기에서만 발생합니다. 예를 들어 대상을 루트보기로 설정하면 전체 ViewGroup의 모든 하위에 invalidate()이 호출되고 ViewGroup의 모든 하위에 draw()이 차례로 호출됩니다. 최상위 레벨 ImageView으로 설정하면 ImageView 만 다시 그려집니다.

하드웨어를 최대한 활용하려면 레이어 속성을 사용해야합니다. 먼저 애니메이션을 적용 할 상위 뷰를 결정해야합니다. Drawable 만 사라지게하려면 Drawable 또는 View을 포함하게됩니다. 모든 것을 사라지게하려는 경우 루트보기가됩니다. 애니메이션으로 결정한 내용은 전체적으로 View에 즉시 적용됩니다.

Animator를 시작하기 바로 전에 부모보기에서 setLayerType()을 사용하십시오. View#LAYER_TYPE_HARDWARE으로 설정하십시오. 그런 다음 AnimationListener을 설정하고 애니메이터 완료시 LayerType을 View#LAYER_TYPE_SOFTWARE 또는 View#LAYER_TYPE_NONE으로 재설정하십시오.당신이 translateX 속성을 사용하여 myParentView을 번역한다면

myParentView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
myObjectAnimator.addListener(new ViewAnimator.AnimatorListener() { 
    public void onAnimationEnd(Animator animation) { 
    myParentView.setLayerType(View.LAYER_TYPE_NONE); 
    } 
    public void onAnimationRepeat(Animator animation) { 
    } 
    public void onAnimationStart(Animator animation) { 
    } 
    public void onAnimationCancel(Animator animation) { 
    myParentView.setLayerType(View.LAYER_TYPE_NONE, null); 
    } 
} 
myObjectAnimator.start(); 

이 경우, 그것은 하나 개의 평면에 레이어 myParentView 모든 그것의 아이들을 넣어 것입니다. 그것을 하드웨어 메모리에 넣으십시오. 한 번에 전체보기를 번역하십시오. 그런 다음 완료되면 메모리에서 myParentView을 제거하십시오.

편집 :

마지막으로 참고, 알파는 CPU에 혼란을 낸다. 하프 - 알파 (half-alpha)에 대해 뭔가를 가지고 뷰를 가로 질러 번역하면, 단순히 뷰를 번역하는 것보다 렌더링하는 것이 더 어려울 것입니다. 아껴서 사용하십시오.

1

아마, 원래 뷰에 새 뷰 (애니메이터 만 포함)를 오버레이 할 수 있습니다. 새로운 뷰는 Transparent로 설정됩니다.

원래대로 표시하지 않고 새보기를 무효화하면됩니다.

1

귀하의 질문을 거친 후 standard document을 통해 가급적 정확하게 invalidate()을 사용하는 방법을 이해하도록하십시오. 둘째, 이미 다양한 상황에서 애니메이션을 사용하기 위해 안드로이드 API가 제공하는 다양한 방법이 있습니다.

Here 대부분의 의구심이 사라지기를 바랍니다. 하위 섹션 및 관련 블로그를 통해 이동하십시오.

희망이 도움이 될 것입니다.