Android图库之间的图像转换

时间:2012-01-19 22:59:02

标签: android image animation gallery transition

我有一个画廊,显示一些扑克牌的图像。每张卡分开20分钟。

当我从一个图像移动到下一个图像时,图库会稍微滚动到下一个图像,然后将自身更正回图像。

另一个问题,几乎肯定是相关的,是图像不会干净地滚过视线。这些图像似乎试图捕捉到完整视图,或者完全捕捉视图,导致手动滚动在我滚动时左右抖动图像。

知道可能导致这种情况的原因吗?

以下是它的屏幕录制:http://www.youtube.com/watch?v=Mvj4_48AW5Q&feature=youtu.be

以下是图库的xml:

<Gallery
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="200dp" 
android:scrollbars="none" 
android:layout_below="@+id/button1" 
android:layout_marginTop="60dp"
android:spacing="20dp" 
android:animationDuration="3000"
/>

2 个答案:

答案 0 :(得分:2)

我认为这是由Gallery在幻灯片动画上设置的动画插值器引起的。过冲插补器将导致该行为。

如果你想覆盖它,我不确定它会有多容易。我做了一个快速搜索,但我找不到任何可以让你轻松覆盖Gallery的默认插值器的东西。我唯一能找到的是this post with someone,他似乎通过创建一个扩展Android Gallery类的新Gallery类来取得成功,以覆盖默认插值器。

答案 1 :(得分:2)

不得不扩展画廊,我认为这个问题与我在屏幕上的计时器有关。这里将进一步讨论这个问题:http://www.unwesen.de/2011/04/17/android-jittery-scrolling-gallery/

import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Gallery;


public class CustomGallery extends Gallery {

private long mLastScrollEvent;
private float mFlingMultiplier;

public CustomGallery(Context context) {
    super(context);
}
public CustomGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
}
public CustomGallery(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
  long now = SystemClock.uptimeMillis();
  if (Math.abs(now - mLastScrollEvent) > 500 * mFlingMultiplier) {      
      super.onLayout(changed, l, t, r, b);    
  }
}


@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
    float distanceY)
{
  mLastScrollEvent = SystemClock.uptimeMillis();
  mFlingMultiplier = 1;
  return super.onScroll(e1, e2, distanceX, distanceY);
}



@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    mFlingMultiplier = Math.abs(velocityX/100);
    return super.onFling(e1, e2, velocityX, velocityY);
}

}