2012-04-12 6 views
5

목표 왼쪽에서 오른쪽으로 숫자 (그래픽이 아닌)를 스크롤하는 카운트 다운 타이머를 구현하고 싶습니다.어떻게 가로로 스크롤하는 카운트 다운 타이머를 구현합니까?

효과 숫자가 왼쪽에서 확대되고 중간으로 느려지고 오른쪽으로 확대되는 효과가 나타납니다.

노트 이미 코드를 매 초마다 실행하기 위해 TimerTask를 사용하고 있기 때문에, 나는 수평 스크롤 텍스트 뷰를 통해 스크롤 다음 숫자를 트리거하기 위해 그것을 사용할 수 있습니다.

scrollview 내부의 텍스트 뷰로 구현 될 수 있습니까? 시작하려면 코드 샘플을 찾으십시오.

답변

9

애니메이션을 사용하는 것이 가장 간단한 해결책이 될 것입니다. 직접 만들거나 여러 번 조합 해보십시오. TranslateAnimationsScaleAnimations을 사용할 수 있습니다.

이렇게하면 스크롤보기를 사용하는 대신 각 숫자를 고유 한 TextView로 변환 할 수 있습니다.

Interpolator으로 가속을 제어 할 수 있습니다. 인터폴 레이터는 안드로이드가 여유를 어떻게 처리 하는지를 나타냅니다. 속도 향상/감속 효과에 대해서는 AccelerateDecelerateInterpolator이 좋습니다.

AnimationSet을 사용하면 동일한보기에 여러 애니메이션을 적용 할 수 있습니다. 훌륭한 AnimationSet을 어떻게 조합 하는지를 파악하는 것이 프로젝트에서 가장 어려운 부분입니다. "채우기"속성에주의하십시오. 사실 약간 놀아 본 후, 준비된 애니메이션을 사용하는 것보다 맞춤 애니메이션이 더 간단하다고 생각합니다.

my GitHub project을 포크하여 매우 간단하게 구현할 수 있습니다. 4 월 17 일 전에 여러 개의 사전 제작 애니메이션을 사용했습니다. 최신 버전을 보면 맞춤 애니메이션이 표시됩니다.

하나의 애니메이션 기간을 설정하면 각 애니메이션의 타이밍이 자동으로 처리됩니다. A Handler은 이전 번호가 끝난 후 다음 번호를 호출합니다. 나는 이것이 X 초마다 함수를 호출하여 모든 것을 업데이트하는 것보다 조금 깔끔한 것이라고 생각한다.

의 기능 개요 :

  • 활동 (CountDownActivity.java)를 통해 모든 것을 본다.
    • Activitiy의 레이아웃 XML에는 카운트 다운을 시작하는 데 사용되는 버튼이 있습니다.
    • 카운트 다운이 시작되면 버튼이 사라집니다. 카운트 다운이 완료되면 다시 나타납니다.
  • 는 활동은 Handler (MotionHandler.java)가 포함되어 있습니다. Handler은 숫자의 이동 및 타이밍을 제어합니다.
    • 핸들러 종속성
      • 이 유연성에있다
        • AnimationSet는 전달 된 숫자를 이동하는 AnimationSet를 이용한다. 단순히 숫자가 AnimationSet는 네 애니메이션 사용자 지정 애니메이션 구성되어
        • 를 이동하는 방법을 변경하기 위해 다른 AnimationSet 전달
    • AnimationSet 공유 AccelerateDecelerateInterpolator를 사용합니다 (아래 참조)하는 알맞게 일하는 것 같습니다. 자신의 글쓰기를 포함하여 다른 옵션이 있습니다.
    • 핸들러는 delayed message 다음 번호
    • 상기 회전 기기 맞춤 수신기 (MotionHandler >> CountdownListener)
  • 를 사용하여 수행되어 카운트 다운 할 때, 핸들러는 작업을 통보를 시작하는 데 사용 카운트 다운을 다시 시작합니다.

참고 - 이전에 하나의 AnimationSet에서 4 개의 준비된 애니메이션을 사용하고 있었지만 하나의 맞춤 애니메이션 만 포함하도록 편집했습니다 ... 원하는대로 알고리즘을 조정할 수 있습니다.

이 사용자 정의 애니메이션은 숫자가 더 크고 작게 표시되도록 Cycloid을 사용합니다.

/** 
* A custom animation to move and scale the numbers. 
* 
*/ 
public class NumberAnimation extends Animation 
{ 
    final public static float MINIMUM = 3; 
    private int mHorizontal; 
    private int mScaling; 

    public NumberAnimation(int horizontalMovement, int scaling) 
    { 
     mHorizontal = horizontalMovement; 
     mScaling = scaling; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) 
    { 
     // Cycloid repeats every 2pi - scale interpolatedTime to that 
     double time = 2 * Math.PI * interpolatedTime; 
     // Cycloid function 
     float currentScale = (float) (mScaling * (1 - Math.cos(time))) + MINIMUM; 
     Matrix matrix = t.getMatrix(); 
     matrix.preScale(currentScale, currentScale); 
     matrix.postTranslate(mHorizontal * interpolatedTime, 0); 
    } 
} 
+0

피터, 내 질문에 대답 해 주셔서 감사합니다! –

+0

@ SomeoneSomewhere - 재미있었습니다. 희망이 도움이됩니다! –

0

Easing 속도를 제어하는 ​​데 도움이됩니다.

관련 문제