夢を見ながら ImageView レイヤーをスクロールするアニメーションがあり、画面の薄い側 (つまり、1280 x 720 画面で 720) をスクロールしたい ディスプレイが横向きに回転しているかどうかを示すディスプレイ変数を取得します. 場合によっては、これが正しく反応せず、間違った軸でスクロールすることがあります。私は多くの方法でこの問題を解決しようとしました。ImageView がオンになっているフレームの寸法のプルを含みます。これでもランダムに幅と高さを間違えます。画面が適切にレイアウトされていても、軸の位置が入れ替わっているように感じます (横向きでは、x が最も短い側で y が最も長い)。これはランダムに発生し、その理由はわかりません。
private void initializeAlbumArtScroll() {
albumArtwork.setX(0);
albumArtwork.setY(0);
mAnimator = albumArtwork.animate().x(0)
.y(0)
.setDuration(1)
.setStartDelay(0)
.setInterpolator(sInterpolator)
.withEndAction(new Runnable() {
@Override
public void run() {
if (inPortrait) {
Log.i(TAG, "Scroll Portrait");
startAlbumArtLeftScroll();
} else {
Log.i(TAG, "Scroll Landscape");
startAlbumArtUpScroll();
}
}
});
// Start the animation
mAnimator.start();
}
/**
* Album art scroll from the right of the screen to the left
*/
private void startAlbumArtLeftScroll() {
albumArtwork.setX(0);
albumArtwork.setY(0);
mAnimator = albumArtwork.animate().x(-albumArtwork.getWidth() + screenWidth)
.y(0)
.setDuration(animationDuration)
.setStartDelay(500)
.setInterpolator(sInterpolator)
.withEndAction(new Runnable() {
@Override
public void run() {
startAlbumArtRightScroll();
}
});
// Start the animation
mAnimator.start();
}
daydreamFrame.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if ((display.getRotation() == Surface.ROTATION_0 || display.getRotation() == Surface.ROTATION_180) && !inPortrait) {
Log.i(TAG, "Now in portrait");
if (mAnimator != null) {
mAnimator.cancel();
}
inPortrait = true;
initializeAlbumArtScroll();
} else if ((display.getRotation() == Surface.ROTATION_270 || display.getRotation() == Surface.ROTATION_90) && inPortrait) {
Log.i(TAG, "Now in landscape");
if (mAnimator != null) {
mAnimator.cancel();
}
inPortrait = false;
initializeAlbumArtScroll();
}
}
});