CustomViewPager'ımın başında bir Atlıkarınca gibi davranan bir animasyon oluşturmayı başarabilirim. İşte burada, eşyalarım soldan geldi ve 3 saniyede sağa gider. Mesele şu ki sadece görüntüleyici görüşümü son noktadan uzaklaştırabiliyor mu diye merak ettiğim bir çeviri.Başlangıçta bir animasyon başlatma CustomViewPager
Bunu yapmak için bir yol görüyor musunuz? Saygılar.
Düzenleme: Başka bir şey deniyorum ve özel ScrollToAnimation'ı oluşturdum. İstediğimi yaratmayı başarabiliyorum ama hareket pürüzsüz değil bana yardım edebilirsin. Benim yeni kodu:
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: Burada
bir ekran görüntüsü ne istediğimi anlamaya yardımcı olur. Aslında böyle bir özel viewpager vardır:
- Ben animasyonu öğesini başlatmak uzakta şunlardır:
istediğim animasyon takip olduğunu.
- Ardından, soldan sağa (veya tersine) gelirler ve seçili öğeye dururlar, ancak öğeler kaydırıldığında ölçek etkisine sahip olmak isterim. Ben Düz değil Geçerli öğeyi ayarladığınızda
- Burada, bir özel adaptör
Sorunum ölçeklendirme etkisi sayesinde yaratmak olduğunu başarılı bir fikriniz var mı? İşte kod adaptör
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class CarouselAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
private float scale;
private MainActivity context;
private FragmentManager fragmentManager;
private ArrayList<Entity> entities = new ArrayList<>();
private ScaledFrameLayout cur = null, next = null;
public CarouselAdapter(MainActivity context, FragmentManager fragmentManager, ArrayList<Entity> mData) {
super(fragmentManager);
this.fragmentManager = fragmentManager;
this.context = context;
this.entities = mData;
}
@Override
public Fragment getItem(int position) {
if (position == MainActivity.FIRST_PAGE) {
scale = MainActivity.BIG_SCALE;
} else {
scale = MainActivity.SMALL_SCALE;
}
Fragment fragment = CarouselFragment.newInstance(context, entities.get(position), position, scale);
return fragment;
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public int getCount() {
return entities.size();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (positionOffset >= 0f && positionOffset <= 1f) {
cur = getRootView(position);
cur.setScaleBoth(MainActivity.BIG_SCALE - MainActivity.DIFF_SCALE * positionOffset);
if (position < entities.size()-1) {
next = getRootView(position + 1);
next.setScaleBoth(MainActivity.SMALL_SCALE + MainActivity.DIFF_SCALE * positionOffset);
}
}
}
@Override
public void onPageSelected(int position) { }
@Override
public void onPageScrollStateChanged(int state) {}
private ScaledFrameLayout getRootView(int position) {
return (ScaledFrameLayout) fragmentManager.findFragmentByTag(this.getFragmentTag(position)).getView().findViewById(R.id.rootItem);
}
private String getFragmentTag(int position) {
return "android:switcher:" + context.carousel.getId() + ":" + position;
}
}
daha basit yoludur, şimdiki öğenin geçerli konumunu değiştirmek olmadan her şeyi yenilemek olacaktır, bu mümkün mü? Herhangi bir geçiş yapmadan demek istiyorum çünkü gördüğünüz gibi çeviriye zaten sahip oldum ve mevcut öğeyi belirlediğimde, kaydırma ile kaydırmayla bir sonuç çıkıyor.
Lütfen sorunuz hakkında ayrıntılı bilgi veriniz. Gerçekte nerede olduğumu anlamak zor. –
Güncel animasyonumu geliştirmek istiyorum. İşte benim animasyonum, sağdan sola doğru bir çeviri. Parmağım sayesinde viewpager'ı kaydırıyormuş gibi pürüzsüz bir kaydırma yapmak istiyorum. Örneğin, aynı sonucu, ViewPager sınıfından scollTo yöntemini kullanıyor olsaydım, hala belirsizse özür dilerim. – zed13
@ zed13: "Görüntüleyici görüşümün kaydırılmasını son noktaya kadar yapmanın mümkün olup olmadığını merak ediyordum." Bu da bir çeviri gibi geliyor. scrollTo sadece çeviri yapar. Ancak, elde etmeye çalıştığınız şeyin videosunu yayınlayabiliyorsanız, daha kolay olacaktır (ViewPager'ın sadece çeviri animasyonunu yaptığım kadarıyla). –