Iniciar una animación onstart CustomViewPager

Tengo éxito para crear una animación en el inicio de mi CustomViewPager que actúan como un carrusel. Así que aquí, mis artículos vinieron de la izquierda y va a la derecha en 3 segundos. La cosa es que es sólo una traducción me preguntaba si es posible hacer que mi viewpager desplazarse de lejos a su posición final.

¿Ves una manera de hacer esto? Saludos.

Edit: Así que intento otra cosa y he creado mi ScrollToAnimation personalizado. Tengo éxito en crear lo que quiero, pero el movimiento no es suave, ¿puedes ayudarme? Mi nuevo código:

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); } } } 

El 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:

Aquí una captura de pantalla para ayudarte a entender lo que quiero. En realidad, tengo un viewpager personalizado como este:

Introduzca aquí la descripción de la imagen

La animación que quiero es la siguiente:

  • Cuando lanzo la animación el artículo está lejos.
  • Después, vienen de la izquierda a la derecha (o lo contrario) y se detienen en el elemento seleccionado, pero quiero tener el efecto de escala cuando los elementos se desplazan.
  • Tengo éxito para crear el efecto de escala gracias a un adaptador personalizado

Mi problema, aquí es cuando establezco el elemento actual no es suave, ¿tiene alguna idea? Aquí está el adaptador de código

 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; } } 

Una manera más sencilla, sería cambiar la posición actual del elemento actual sin actualizar todo, ¿es posible? Quiero decir, sin hacer ninguna transición, porque como se puede ver que ya tengo la traducción y cuando se establece el elemento actual es el resultado con un conflicto con mi scrollto con el desplazamiento.

Creo que tienes que hacer uno de imageSlider con sooth desplazamiento y cambio de imagen con animación.

Android Image Slider librería disponible en github ahora vea abajo paso para usarlo.

  • Paso 1: gradle en compilar debajo de lib.

     dependencies { compile "com.android.support:support-v4:+" compile 'com.squareup.picasso:picasso:2.3.2' compile 'com.nineoldandroids:library:2.4.0' compile 'com.daimajia.slider:library:1.1.5@aar' } 
  • Paso 2: Agregue permisos (si es necesario) a su AndroidManifest.xml

      <!-- if you want to load images from the internet --> <uses-permission android:name="android.permission.INTERNET" /> <!-- if you want to load images from a file OR from the internet --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
  • Paso 3: agregue el control deslizante a su diseño:

     <com.daimajia.slider.library.SliderLayout android:id="@+id/slider" android:layout_width="match_parent" android:layout_height="200dp" /> 

    Ahora haga el código en su Activity Aquí SlideShow.class en la gerencia Código.

      public class SlideShow extends Activity { ImageView mIVmenu; SliderLayout sliderLayout; ListView menu_list; ArrayList<String> imgList = new ArrayList<String>(); int position; Button btnBack; static int adapter_position = 0; String animation_name; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.slideshow); sliderLayout = (SliderLayout) findViewById(R.id.sliderlayout); menu_list = (ListView) findViewById(R.id.menu_list); btnBack = (Button) findViewById(R.id.btn_back_slideshow); menu_list.setAdapter(adapter); // get Data from Intent array list and set on array list imgList = getIntent().getStringArrayListExtra("arrayList"); position = getIntent().getExtras().getInt("position"); animation_name = SliderLayout.Transformer.Default.toString(); } // call method for set images in slideshow and configure slideshow.. addImagesToSlider(); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(SlideShow.this, MainActivity.class); startActivity(i); finish(); } }); } private void addImagesToSlider() { for (int i = 0; i < imgList.size(); i++) { TextSliderView textSliderView = new TextSliderView(this); textSliderView.description("").image(new File(imgList.get(i))).setScaleType(BaseSliderView.ScaleType.CenterInside).setOnSliderClickListener(new BaseSliderView.OnSliderClickListener() { @Override public void onSliderClick(BaseSliderView slider) { } }); sliderLayout.addSlider(textSliderView); } sliderLayout.setPresetTransformer(animation_name); sliderLayout.setCustomAnimation(new DescriptionAnimation()); sliderLayout.stopAutoCycle(); sliderLayout.setCurrentPosition(position); } BaseAdapter adapter = new BaseAdapter() { @Override public int getCount() { return SliderLayout.Transformer.values().length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view; view = LayoutInflater.from(parent.getContext()).inflate(R.layout.slidemenu_item, parent, false); TextView tv = (TextView) view.findViewById(R.id.txtslideTitle); final String str = SliderLayout.Transformer.values()[position].toString(); tv.setText(str); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sliderLayout.setPresetTransformer(str); animation_name = str; notifyDataSetChanged(); } }); if (str.equals(animation_name)) { adapter_position = position; tv.setBackgroundColor(getResources().getColor(R.color.colorAccent)); } else { tv.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); } return view; } }; } 

Y más información

Trate de usar suave View Pager, puede configurar su velocidad. Todo lo que necesitas es ponerlo en la posición 0, luego hacerlo visible, y luego moverlo a la posición de destino, se desplazará sin problemas al objetivo, puede aplicar cualquier animación como en el paginador de vista común si lo desea. También puede setPagingEnable a false y el usuario no lo desplaza al tocar

 public class SmoothScrollViewPager extends ViewPager { private boolean enabled = true; public SmoothScrollViewPager(Context context, AttributeSet attrs) { super( context, attrs ); setMyScroller(); } private void setMyScroller() { try { Class<?> viewpager = ViewPager.class; Field scroller = viewpager.getDeclaredField("mScroller"); scroller.setAccessible(true); scroller.set(this, new MyScroller(getContext())); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onTouchEvent(MotionEvent event) { if (this.enabled) { return super.onTouchEvent(event); } return false; } public class MyScroller extends Scroller { public MyScroller(Context context) { super(context, new DecelerateInterpolator()); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/); } } public void setPagingEnabled(boolean enabled) { this.enabled = enabled; } } 

Logro progresar gracias a alguna introspección. Llamé al método pageScrolled de la clase ViewPager.

  • ¿Cómo hacer que el desplazamiento de Listview sea más lento?
  • Entrada de desplazamiento salvaje android
  • ¿Cómo detener el desplazamiento en un Widget de Galería?
  • Desplazamiento en Horizontal ScrollView pierde el foco del elemento enfocado,
  • Desplazamiento de imagen enriquecido y zoom en android
  • ¿Cómo desplazarse a la parte inferior de un RecyclerView? ScrollToPosition no funciona
  • Android smoothScrollBy se comporta mal
  • Agregar nuevo elemento a la parte superior del RecyclerView
  • Emulador Android no Desplácese hacia abajo
  • La visualización de listas personalizadas está muy retrasada mientras se desplaza el android
  • Detener el desplazamiento en una vista de lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.