Refine animation to remove strange reshuffling animation

The issue happens mainly because two animations(move + change) running
on the same view interrupt with each other. When ItemAnimator runs the
move animation, it will change the translationX&Y in a time period.
When the change animation occurs in this period, it gets this translation
value and calculates a non-zero deta, then it would run an unnecessary
move animation, which causes the strange reshuffling.

In this cl, I skip the translation value only for the tile view when
there is pending animation.

I also add scroll operation for conditions view to make it scroll to
top after condition change.

Bug: 33839777
Bug: 33839780
Test: make -j40 RunSettingsRoboTests

Change-Id: I2152f93f756ae20cf754d6fca3525119cb4ceb1f
This commit is contained in:
jackqdyulei
2016-12-28 14:15:03 -08:00
parent d5afb5a60c
commit 0fd7190fdd
3 changed files with 24 additions and 5 deletions

View File

@@ -21,6 +21,7 @@ import android.widget.TextView;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.SupportItemAdapter.ViewHolder;
import com.android.settingslib.drawer.Tile;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -41,20 +42,30 @@ public class DashboardItemAnimatorTest {
final Context context = ShadowApplication.getInstance().getApplicationContext();
mDashboardItemAnimator = new DashboardItemAnimator();
mViewHolder = new ViewHolder(new TextView(context));
mViewHolder.itemView.setTag(new Tile());
}
@Test
public void testAnimateChange_NoOffset_NoPendingAnimation() {
public void testAnimateChange_NoPositionChange_NoPendingAnimation() {
final boolean hasPendingAnimation = mDashboardItemAnimator
.animateChange(mViewHolder, mViewHolder, 0, 1, 0, 1);
assertThat(hasPendingAnimation).isFalse();
}
@Test
public void testAnimateChange_HasOffset_HasPendingAnimation() {
public void testAnimateChange_HasPositionChange_HasPendingAnimation() {
final boolean hasPendingAnimation = mDashboardItemAnimator
.animateChange(mViewHolder, mViewHolder, 0, 0, 1, 1);
assertThat(hasPendingAnimation).isTrue();
}
@Test
public void testAnimateChange_HasRunningAnimationWhileNoPositionChange_NoPendingAnimation() {
// Set pending move animations
mDashboardItemAnimator.animateMove(mViewHolder, 0, 0, 1, 1);
final boolean hasPendingAnimation = mDashboardItemAnimator
.animateChange(mViewHolder, mViewHolder, 0, 1, 0, 1);
assertThat(hasPendingAnimation).isFalse();
}
}