Intereting Posts
Что такое идентификационный номер GCM? В Google Analytics V4, какое имя экрана я должен отправить? Как изменить имя приложения в Launcher в android в соответствии с языком, выбранным в «Настройки телефона»? Настроить разделитель / разделитель в раскрывающемся списке AutocompleteTextview Не удалось загрузить libGL.so на Android Android Animation: Подождите, пока не закончите? Как обернуть кнопки изображения в горизонтальной линейной компоновке? Android Realm copyToRealmOrUpdate создает дубликаты вложенных объектов Android: получить снимок изображения на SD-карте, учитывая Uri оригинального изображения Можно ли запустить эмулятор устройств Android (через Android Studio 2) на VMWare? Как добавить разделители и пробелы между элементами в RecyclerView? Использование телефона Android в качестве USB-хоста для подключения внешних дисков к телефону и доступа к памяти внешнего накопителя через телефон Как добавить и подписать запись jabber на мою учетную запись XMPP? Переключение между сетью и провайдером GPS Socket EADDRINUSE (адрес уже используется)

Запустить анимацию onstart CustomViewPager

Мне удалось создать анимацию в начале моего CustomViewPager, который действует как карусель. Так вот, мои предметы пришли слева и идут вправо через 3 секунды. Дело в том, что это просто перевод, о котором мне было интересно, можно ли просто заставить мой просмотрщик прокручиваться издалека до его последней позиции.

Вы видите способ сделать это? С уважением.

Edit: Итак, я попробую что-то еще, и я создал свой собственный 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); } } 

Редактировать2:

Вот скриншот, который поможет вам понять, чего я хочу. На самом деле у меня есть пользовательский просмотрщик:

Введите описание изображения здесь

Мне нужна анимация:

  • Когда я запускаю анимацию, элемент находится далеко.
  • После этого они идут слева направо (или наоборот) и останавливаются на выбранном элементе, но я хочу иметь эффект масштаба, когда элементы прокручиваются.
  • Мне удалось создать эффект масштабирования благодаря пользовательскому адаптеру

Моя проблема, вот когда я устанавливаю текущий элемент, это негласно, есть ли у вас какие-либо идеи? Вот код-адаптер

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

Более простым способом было бы изменить текущую позицию текущего элемента без обновления всего, возможно ли это? Я имею в виду без какого-либо перехода, потому что, как вы видите, у меня уже есть перевод, и когда я устанавливаю текущий элемент, это результат с конфликтом с моим scrollto со смещением.

Solutions Collecting From Web of "Запустить анимацию onstart CustomViewPager"

Я думаю, вам нужно сделать один из imageSlider с прокруткой прокрутки и сменой изображения с анимацией.

Библиотека Android Image Slider, доступная в github, теперь увидит ниже шаг, чтобы использовать ее.

  • Шаг 1: Gradle в компиляции ниже 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' } 
  • Шаг 2: добавьте разрешения (если необходимо) в ваш 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" /> 
  • Шаг 3: добавьте ползунок в ваш макет:

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

    Теперь сделайте код в своей Activity здесь SlideShow.class в управлении кодом.

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

И дополнительная информация ссылается на это

Попробуйте использовать плавный просмотр пейджера, вы можете настроить его скорость. Все, что вам нужно, – установить его в положение 0, затем сделать его видимым, а затем переместить его в целевую позицию, он будет плавно прокручиваться до цели, вы можете применить любую анимацию, как в общем пейджере просмотра, если хотите. Также вы можете setPagingEnable в false и пользователь не будет прокручивать его прикосновением

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

Мне удалось добиться прогресса благодаря некоторой интроспекции. Я вызвал метод pageScrolled класса ViewPager.