Sto provando a utilizzare il nuovo CardView
di Android in un'animazione di rotazione. Tuttavia, quando la proprietà rotationY
di CardView
è impostata su abbastanza alta, alcune cose veramente brutte si verificano sui dispositivi Lollipop. Ecco qualche esempio di codice che è abbastanza facile da compilare:CardView visualizza gli artefatti quando RotazioneY> 60
MainActivity.java:
public class MainActivity extends Activity {
private CardView mTestView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTestView = (CardView) findViewById(R.id.test_view);
mTestView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mTestView.animate()
.rotationY(360)
.setDuration(3000);
}
});
}
}
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.CardView
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/test_view">
</android.support.v7.widget.CardView>
</RelativeLayout>
Dopo aver cliccato sulla vista, vedrete una rotazione ordinata animazione completa con le ombre di Material Design e tutto. Ma una volta che l'angolo di rotazione della carta diventa superiore a circa 60, interromperà il rendering, o renderà diversi fotogrammi senza cancellare il fotogramma precedente o una combinazione dei due. Questo continua fino a quando l'angolo della carta è tornato sotto questa soglia.
Ora, questa animazione è impostata in 3 secondi, il che è ridicolo. A una velocità di animazione più realistica (ad esempio, durata dell'animazione 300 ms) questo è ancora visibile, ma in realtà sembra solo un microstutter temporaneo.
Sembra un possibile errore nel framework - ma potrebbe anche essere che ho bisogno di chiamare qualche metodo aggiuntivo per consentire alla rotazione di partire senza problemi. Idee?
Nota: l'impostazione della distanza della telecamera chiamando View.setCameraDistance() non risolve il problema; infatti se si compila il codice sopra con una distanza follemente alta (~ 100.000), il problema si verifica ancora, ma con una soglia di angolo più alta (da qualche parte intorno 80-85, se dovessi indovinare.)
Hai risolto questo errore? Attualmente soffre dello stesso bug. – jehna1
Non ho mai provato la correzione suggerita di seguito. Sembra corretto, però. Posso dare un colpo in circa 12 ore e farti sapere se ha funzionato o no. – sigmabeta