私は、カルーセルのように動作する私のCustomViewPagerの開始時にアニメーションを作成するのに成功しました。そこでここでは、私のアイテムは左から来て、3秒で右に行く。私のビューページを遠くから最終的な位置にスクロールさせることが可能かどうか疑問に思っていただけの翻訳です。起動時にアニメーションを起動するCustomViewPager
これを行う方法がありますか?よろしくです。 よろしくお願いします。
編集:私は別のものを試してみました。自分のカスタムScrollToAnimationを作成しました。私は自分が望むものを作り出すことに成功しますが、動きがスムーズではないので、私を助けてくれます。私の新しいコード:
import android.support.v4.view.ViewPager;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import java.util.Calendar;
public class ScrollToAnimation extends Animation {
private int currentIndex = 0, nbChilds = -1, deltaT = 0;
private float fromX, toX;
private long animationStart;
private ViewPager viewpager;
public ScrollToAnimation(ViewPager viewpager, float fromX, float toX, int duration) {
this.viewpager = viewpager;
this.fromX = fromX;
this.toX = toX;
nbChilds = viewpager.getChildCount();
deltaT = duration/nbChilds;
setDuration(duration);
animationStart = Calendar.getInstance().getTimeInMillis();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
int offset = (int) (-fromX * interpolatedTime + fromX);
viewpager.scrollTo(offset, 0);
long animationProgression = Calendar.getInstance().getTimeInMillis() - animationStart;
currentIndex = (int) (animationProgression/deltaT);
if(viewpager.getCurrentItem() != currentIndex) {
viewpager.setCurrentItem(nbChilds-currentIndex, false);
}
}
}
ViewPager:
import android.content.Context;
import android.graphics.Canvas;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.Interpolator;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CarouselViewPager extends ViewPager {
private DisplayMetrics metrics;
private Animation animation;
private SpeedScroller mScroller = null;
private boolean animationNotStarted = true, leftToRight;
public CarouselViewPager(Context context) {
super(context);
postInitViewPager();
metrics = getContext().getResources().getDisplayMetrics();
}
public CarouselViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
postInitViewPager();
metrics = getContext().getResources().getDisplayMetrics();
}
private void postInitViewPager() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
Field interpolator = viewpager.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
mScroller = new SpeedScroller(getContext(), (Interpolator) interpolator.get(null));
scroller.set(this, mScroller);
} catch (Exception e) {
Log.e("postInitViewPager", e.getMessage());
}
}
public void setScrollDurationFactor(double scrollFactor) {
mScroller.setScrollDurationFactor(scrollFactor);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
try {
Method method = ViewPager.class.getDeclaredMethod("setCurrentItemInternal", int.class, boolean.class, boolean.class, int.class);
method.setAccessible(true);
method.invoke(this, item, true, false, 1500);
} catch (Exception e) {
e.printStackTrace();
super.setCurrentItem(item, smoothScroll);
}
}
public void startAnimation(boolean leftToRight) {
animation = new ScrollToAnimation(this, ((metrics.widthPixels/2)+200)*2, 0, 2000);
animationNotStarted = false;
this.leftToRight = leftToRight;
}
private Canvas enterAnimation(final Canvas c) {
animationNotStarted = true;
startAnimation(animation);
scrollTo(0, 0);
return c;
}
@Override
protected void onDraw(Canvas canvas) {
if (!animationNotStarted) {
canvas = enterAnimation(canvas);
}
super.onDraw(canvas);
}
}
EDIT2:ここ
のスクリーンショットは、あなたは私が欲しいものを理解するのに役立ちます。実は私はこのようなカスタムviewpagerを持っている:
私が欲しいアニメーションがフォローです:
- 私はアニメーションにアイテムを起動すると遠く離れています。
- その後、左から右(またはその反対)から来て選択したアイテムに止まりますが、アイテムがスクロールしているときにスケール効果を持たせたいとします。私は感謝私の問題
さらに簡単な方法として、現在のアイテムの現在の位置をすべて更新せずに変更することは可能でしょうか?あなたが見ることができるように私は既に翻訳を持っているので、私は現在のアイテムを設定するとオフセットとスクロールの間に矛盾が生じてしまいますので、
質問を詳しくお書きください。あなたが本当に立ち往生した場所を理解することは難しい –
私は私の現在のアニメーションを改善したい。ここで私のアニメーションは右から左への翻訳です。あたかも指でスクロールしているかのように滑らかなスクロールをしたい。たとえば、私がViewPagerクラスからscollToメソッドを使用していた場合、それがまだ不明な場合はごめんなさいと同じ結果を使用できるようにしたいと考えています。 – zed13
@ zed13:「私のビューページをスクロールして遠くから最終的な位置にスクロールさせることが可能かどうか疑問に思っていました。これは翻訳のようにも聞こえます。通常scrollToは翻訳のみを行います。しかし、あなたが達成しようとしているもののビデオを投稿することができれば、それはより簡単になります(ViewPagerが翻訳アニメーションのみを作成することを見た限り)。 –