2013-08-16 2 views
0

저는 Android에서 두 가지 활동간에 페이드 인/페이드 아웃 애니메이션을 사용하고 있습니다. 두 활동 모두 흰색 배경 (Holo light 테마)을 가지고 있습니다. 페이드 인하는 활동에서 alpha을 0에서 1로 변경하고 페이드 아웃하는 활동에서 1에서 0으로 변경합니다.애니메이션 전체에서 일정한 배경색으로 페이드 인/페이드 아웃

내 문제는 인식 된 배경색이 애니메이션에서 일정하지 않다는 것입니다., 나는 성가심을 느낍니다. 즉, 배경이 어두워지며 애니메이션 기간 동안 밝아집니다. 따라서 애니메이션의 중간에는 배경이 흰색이 아니라 중간 회색이됩니다.

두 보간을 사용하여 둘 다 결합 된 효과가 일정한 배경색을 제공하도록하고 싶습니다. 나는 linear 인터폴 레이터가 두 가지 alphas의 합을 일정하게 유지하기 때문에 트릭을 수행 할 것이라고 생각했습니다. 그러나 작동하지 않습니다. 배경 색상이 애니메이션 중에 변경됩니다. accelerate 표준 및 decelerate에는 원하는 동작이 없습니다.

는 그래서, 내 질문은 : 알려진 인터폴 레이터 (아마도 특정 속도로 accelerate, decelerate)가 페이드 인/페이드 아웃 애니메이션에 일정한 배경 색상을 제공?

+0

설명하는 것은 단순히 애니메이션이 작동하는 방식입니다. 원하는 것은 애니메이션을 만든 다음 애니메이션이 완료된 후에 다른 애니메이션을 표시하는 것입니다. 이 권한을 얻으려면 사용자 정의 애니메이션 ('XML')을 작성해야 할 수도 있습니다. – Phil

+0

필자가 하나의 애니메이션 (페이드 아웃)하면 배경색이 흰색 (알파 1)에서 검은 색 (알파 0)으로 불가피하게 이동합니다. 내가 원하는 건 아니야. –

+0

그래서 내가 이해한다면 - 당신은 일정한 배경색을 원한다. 그런데 왜 애니메이션을하고 있니? 원하는 시간 간격으로 원하는 색상으로 오버레이를 표시해야하는 것처럼 보입니다. – Phil

답변

0

0 알파에서 애니메이션있어!

짧은 대답 : 두 개의 애니메이션 중 하나를 제거. 주 활동에서 보조 활동으로 갈 때는 페이드 인 만 사용하십시오. 2 차 활동에서 주요 활동으로 이동할 때는 페이드 아웃 만 사용하십시오. 세부 사항 및 설명은 다음과 같습니다.

두 가지 색상을 알파 값과 결합하는 방법에는 여러 가지가 있습니다. 이 과정을 "alpha compositing"이라고합니다. 일반적으로 사용되는 하나 하지 인 조합을 수행하는 하나 개의 순 방향은이다

(a) C = C1 * 알파 1 + C2 * 알파 2

그 조합 방법이 적용된다면 alpha1alpha2에 대해 두 개의 선형 인터폴 레이터를 사용하면 C1C2이 모두 "배경색"인 Cbg과 같을 때마다 일정한 색상이됩니다. 특히, alpha1 = t (t은 시간을 나타냄), alpha2 = 1-tC1 = C2 = Cbg 인 경우, (a)의 조합은 C = Cbg*t + Cbg*(1-t) = Cbg이됩니다. 즉, 합성 색상 C은 희망에 따라 t에 관계없이 Cbg과 동일합니다.

(b) C = C1 * 알파 1 + C2 * 알파 2의 * (1- 알파 1)

:

그러나 안드로이드가 적용되는 조합은 소위 "위에"연산자 것 같습니다 이 색 C1와 화소 C2와 그 위에 것으로 생각된다

. 조합 방법 (b)의 경우 C1 = C2 = Cbg의 픽셀에 대해 일정한 색 C을 얻으려면 C = Cbg*alpha1 + Cbg*1*(1-alpha1) = Cbg이므로 alpha2 = 1이면 충분합니다.

따라서 보간 아래 인 활동1 (아니오 애니메이션) 위에 인 활동 임의 (선형 또는 기타)이어야한다. 나는 안드로이드 활동이 끝난 인 이하 인 결정 방법을 잘 이었기 때문에

, 나는 몇 가지 실험을했고, 발견 : 주요 활동 보조 활동을 만들 때

  • 는 적절한 절차는 보조 활동을 위해 페이드 인 보간기를 사용합니다.

  • 보조 활동이 주 ​​활동으로 돌아갈 때 적절한 절차는 보조 활동을위한 페이드 아웃 보간을 설정하는 것입니다. 안드로이드 보조 활동이 주요 하나 넘는 것을 고려하고있다처럼

그래서 그것은 본다. 보조는 주된 것에 의해 만들어 졌기 때문에 이것은 의미가 있습니다. 이 0에 해당 애니메이션을 설정하기에 충분한다 documentation 따른

  • 주요 활동이 어떤 애니메이션을 사용하지 않기 때문에

    , 즉 overridePendingTransition(R.anim.fadein, 0)를 사용한다. 그러나, 나는 이것이 때때로 만 작동한다는 것을 발견했습니다. 작동 시키려면 알파 1.0에서 알파 1.0으로가는 "가짜"페이드를 정의해야합니다 (실제로 아무 것도하지 않도록). overridePendingTransition(R.anim.fadein, R.anim.fakefade)을 사용하십시오.

0 애니메이션 대신 가짜 애니메이션이 필요하다는 이유로 설명하지 않습니다.

안드로이드 문서가 더 분명해지기를 바랍니다. 그것은 나를 꽤 오랫동안 구했을 것입니다.

1

의견에서 활동 자체가 아니라 활동의보기를 움직이기를 원하는 것처럼 들립니다. droidQuery 라이브러리를 사용하여이 작업을 수행 할 수 있습니다.

@Override 
public void onPause() { 
    //here, substitute mainView with the id of your background 
    $.with(this, R.id.mainView).selectChildren().selectAll().animate("{ alpha : 0.0f }", 400, $.Easing.LINEAR, $.noop()); 
    super.onPause(); 
} 

이 당신의 배경의 아이들이있는 모든보기를 선택하고 ObjectAnimator, 선형 보간 및 400ms 일 기간을 사용하여 0으로 자신의 알파 값을 애니메이션 것입니다 만하면 onPause() 방법으로이 설정합니다.

는 또한 onResume()를 오버라이드 (override) 할 것입니다 :

@Override 
public void onResume() { 
    //here, substitute mainView with the id of your background 
    $.with(this, R.id.mainView).selectChildren().selectAll().animate("{ alpha : 1.0f }", 400, $.Easing.LINEAR, $.noop()); 
    super.onResume(); 
} 

이 반대 않습니다 - 내가 1.

+0

답변 해 주셔서 감사합니다.이 접근 방식을 사용하면 두 가지 활동에서 페이드 인과 페이드 아웃이 동시에 발생합니까? –

+0

@LuisMendo 이것들은 뷰 애니메이션이고 액티비티 애니메이션이 아니기 때문에 정확하게는 모르겠지만 액티비티 애니메이션 ('overridePendingTransition')과 함께하면 원하는 것에 거의 가까운 효과를 낼 수 있습니다. – Phil

+0

나는 그것을 얻었다. 관심이 있다면 내 대답을 참조하십시오. 원하는 효과는 두 가지가 아닌 알파 애니메이션을 사용하여 얻을 수 있습니다. –

관련 문제