2017-02-24 2 views
1

Mon but est de créer ceci.Android - Utilisation de pageradapter je veux faire la PREMIÈRE image montrer 1/4 de l'écran, puis laissez-le défiler naturellement

https://i.imgur.com/73fvHaF.gif

Le principal problème est que je ne peux pas obtenir l'image à la première position de rester à 1/4 (ou toute taille) quand je défiler cette image, il prendra toute la largeur de l'écran et Ensuite, agissez comme un pageradapter normal.

J'ai essayé ce qui suit

  • Objectanimator.ofFloat
  • Jouez avec margin, padding etc
  • Trouver un moyen de fixer la limite pour la première image
  • Set imageview vide pour pousser la vue sur le côté, cela semble plus viable bien que je dois appeler notifyDataSetChanged();

Lorsque je change des données dans l'adaptateur, j'appelle notifyDataSetChanged(); dont nous savons tous les mises à jour la vue sans transition en douceur.

Il me semble que cela devrait être une solution facile et propre, tant que je sais comment définir une limite pour la première image. Peut-être im mal

Voici le code que je utilise J'ai créé une galerie personnalisée widget de


public class ImageGalleryViewPager extends ViewPager { 

    public ImageGalleryViewPager(Context context) { 
     super(context); 
     setMyScroller(); 
    } 

    public ImageGalleryViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setMyScroller(); 
    } 

    //down one is added for smooth scrolling 
    private void setMyScroller() { 
     try { 
      Class<?> viewpager = ViewPager.class; 
      Field scroller = viewpager.getDeclaredField("mScroller"); 
      scroller.setAccessible(true); 
      scroller.set(this, new ImageGalleryViewPager.MyScroller(getContext())); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void setAdapter(PagerAdapter adapter) { 
     super.setAdapter(adapter); 
     setCurrentItem(adapter.getCount()); 
    } 

    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, 350 /*1 secs*/); 
     } 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return super.onInterceptTouchEvent(ev); 
    } 

} 

J'utilise cela dans un Vignettes

<com.apirix.inspection.views.viewpagers.ImageGalleryViewPager 
     android:id="@+id/image_gallery_vp" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</android.support.v7.widget.CardView></RelativeLayout> 

Voici mon Pageradapter

public AssignmentListGalleryAdapter(Context context, List<Media> medias, ViewPager horizontalView) { 
    mContext = context; 
    mMedias = medias; 
    mHorizontalView = horizontalView; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 

    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mItemView = inflater.inflate(R.layout.row_image_gallery_viewpager, container, false); 
    ButterKnife.bind(this, mItemView); 


    mUri = mMedias.get(position).getUrl(); 
    closeAllImagesButton.add(mCloseButton); 
    mContainer = container; 

    container.setClipToPadding(false); 
    container.setPadding(30, 0, 60, 0); 

    if (!mUri.isEmpty()) { 
     Picasso.with(mContext) 
       .load(mUri) 
       .fit() 
       .into(mFullScreenImageView); 
    } 

    mCloseButton.setOnClickListener(this); 
    container.addView(mItemView); 
    return mItemView; 

} 

public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

Répondre

0

Je pense que vous pouvez réaliser ce que vous voulez avec un rembourrage à l'intérieur de votre carte, mais seulement pour le premier élément de votre carte.

Vous aurez deux vues de cartes:

row_image_gallery_viewpager_first.xml

<com.apirix.inspection.views.viewpagers.ImageGalleryViewPager 
    android:id="@+id/image_gallery_vp" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingEnd="100dp"/> 

et

row_image_gallery_viewpager.xml

<com.apirix.inspection.views.viewpagers.ImageGalleryViewPager 
     android:id="@+id/image_gallery_vp" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</android.support.v7.widget.CardView></RelativeLayout> 

Ensuite, vous devrez spécifier dans votre adaptateur Wich utilisation xml pour le premier élément:

LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      if (position == 0){ 
       mItemView = inflater.inflate(R.layout.row_image_gallery_viewpager_first, container, false); 
      } else { 
       mItemView = inflater.inflate(R.layout.row_image_gallery_viewpager, container, false); 
      } 
      ButterKnife.bind(this, mItemView); 

espère que cela fonctionne.

+0

Génial! Maintenant, quand je balaye la première fois, je veux que l'image corresponde au pageradapter, jetez un coup d'œil au Gif fourni à nouveau https://i.imgur.com/73fvHaF.gif –

+0

Mhh vous voulez dire que votre deuxième objet ne correspond pas à l'écran? –

+0

Lors du balayage initial, le pageradapter doit étendre la première image aux conteneurs pleine largeur. Donc je balaye une fois à gauche, l'image se dilate, je balaye à gauche je reçois l'image numéro deux. Petit 1 -> Grand 1 -> Image 2 J'espère me rendre clair. –