Vamos dizer que queremos uma animação que horizontalmente "shakes" uma visão.
Fazemos algo parecido com isto:
Java:
private void shakeView(final View v) {
v.clearAnimation();
Animation animShake = AnimationUtils.loadAnimation(this, R.anim.shake);
v.startAnimation(animShake);
}
xml:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="60"
android:fromXDelta="-20"
android:toXDelta="20"
android:repeatCount="14"
android:repeatMode="reverse"
android:interpolator="@android:anim/linear_interpolator" />
</set>
No entanto, devido ao fato de que estamos rigidamente meticuloso, percebemos que a "distância agitação" que é definido no xml é uma distância estática interpretado no dp / pixels e, portanto, será diferente em diferentes dispositivos - em dispositivos de alta resolução, o movimento será sutil ... como uma escova de dentes elétrica, mas em dispositivos de baixa resolução, o movimento será drástica como um daqueles batendo bonecas blowup para um monte de carros usados.
Seria muito melhor para expressar o "x-delta" como uma proporção da largura da vista:
float ratio = 14f/392f;
float valueOfXTranslation = ratio*v.getWidth();
Mas ..., a fim de fazer isso, teríamos de ser capaz de definir o "x-delta" no código ... e não vejo nenhuma maneira de fazer isso.
Tentei digitar "animShake." - "dot" - e olhando para as opções disponíveis ... e, embora existam algumas setters, nenhum deles parecem permitir definir o "x-delta." Acho que eu deveria simplesmente desistir e tentar abordagem completamente diferente usando alguma outra técnica de animação, mas eu simplesmente não posso acreditar que isso não seria possível.
É possível alterar programaticamente o "x-delta" de uma instância de animação?
É possível utilizar opcional% p em XML para controlar a quantidade de movimento em relação ao tamanho de pai. Gostar:
android:fromXDelta="-5%p"
android:toXDelta="5%p"