0

Ich habe eine vertikale ViewPager erstellt, mit ViewPage.PageTransformer und X-und Y-Koordinaten vertauschen. (Ich benutze this approach10)Vertikaler ViewPager. Stoppen Scrollen vorbei an bestimmten Punkt

Nun, was ich will, ist zu stoppen Scrollen an einem bestimmten Punkt (Ich möchte die letzte Ansicht nur 65% der Bildschirmhöhe zu nehmen, aber die volle Breite). Normalerweise würde ich getPageWidth() in diesem Fall überschreiben, aber da meine Breite und Höhe derzeit irgendwie durcheinander sind, wenn ich das tue, nimmt meine Ansicht 65% sowohl der Höhe als auch der Breite des Bildschirms.

Also, wie soll ich das beheben?

Vielen Dank!

MyViewPager.java

public class MyViewPager extends ViewPager { 

    public MyViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    private void init() { 
     setPageTransformer(true, new VerticalPageTransformer()); 
     setOverScrollMode(OVER_SCROLL_NEVER); 
    } 

    private class VerticalPageTransformer implements ViewPager.PageTransformer { 

     @Override 
     public void transformPage(View view, float position) { 

      if (position < -1) { 
       view.setAlpha(0); 

      } else if (position <= 1) { 
       view.setAlpha(1); 

       view.setTranslationX(view.getWidth() * -position); 

       float yPosition = position * view.getHeight(); 
       view.setTranslationY(yPosition); 

      } else { 
       view.setAlpha(0); 
      } 
     } 
    } 

    private MotionEvent swapXY(MotionEvent ev) { 
     float width = getWidth(); 
     float height = getHeight(); 

     float newX = (ev.getY()/height) * width; 
     float newY = (ev.getX()/width) * height; 

     ev.setLocation(newX, newY); 

     return ev; 
    } 

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

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

MyPagerAdapter.java

public class MyPagerAdapter extends PagerAdapter { 

    private Context context; 
    private LayoutInflater layoutInflater; 

    public MyPagerAdapter(Context context) { 
     this.context = context; 
     layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 

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

     if (position == 0) { 
      View view = layoutInflater.inflate(R.layout.item_profile_picture, container, false); 

      container.addView(view); 
      return view; 
     } 

     else { 
      View view = layoutInflater.inflate(R.layout.item_profile_info, container, false); 

      container.addView(view); 
      return view; 
     } 

    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((FrameLayout) object); 
    } 

    @Override 
    public float getPageWidth(int position) { 
     if (position == 1) return (0.65f); 
     return super.getPageWidth(position); 
    } 

} 

Antwort

0

Dieses Problem wurde behoben, indem this library verwendet wurde.

0

Hallo, soweit ich verstehe Sie versuchen, ohne die Überroll an einem bestimmten Punkt zu stoppen. Fügen Sie dem gewünschten Viewpager eine Overscroll-Methode (nie) hinzu. Und verwalten Sie Ihre Ränder auf den Objekten. Wrap Inhalt so viel wie möglich.

+0

können Sie Beispiel dafür, wie ich das tun würde? –

+0

setOverScrollMode (OVER_SCROLL_NEVER); fügen Sie dieses ein und verwalten Sie Ihre Artikel in der XML Ich bin nicht auf PC – Izvorski

+0

Ich habe das Overscroll nie, aber ändern Xml funktioniert nicht, weil überschreiben 'getPageWidth' ändert sowohl die Breite und Höhe der Ansicht @Izvorski –

Verwandte Themen