2016-07-04 35 views
0

Ich habe 3 Fragmente mit Ansichten gemacht, die ich horizontal durchblättern. In jeder Fragmentansicht werde ich ein Bild haben, das größer als der Bildschirm ist, und wenn der Bildschirm gescrollt wird, bewegt sich das Bild leicht in dieselbe Richtung mit einem Parallaxeffekt innerhalb seiner Elternansicht.Android Horizontal Parallax

Ich habe viel Forschung gemacht und die einzige funktionierende Version eines Parallax-Effekts, den ich gefunden habe, war für eine vertikale Listenansicht. Ich habe versucht, die gleichen Prinzipien anzuwenden, aber es funktioniert nicht. Es scheint, dass etwas mit diesem v.getLocalVisibleRect (r) falsch ist, da es 0,0,0,0 für das Bild zurückgibt. Ich muss wissen, wie ich dieses Bild in Bewegung bringen kann.

Haupt

public class MainActivity extends FragmentActivity { 
ViewPager viewpager; 
ImageView image; 
private int lastTop = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    viewpager = (ViewPager) findViewById(R.id.pager); 
    PagerAdapter padapter = new PagerAdapter(getSupportFragmentManager()); 
    viewpager.setAdapter(padapter); 

    //Parallax attempt 
    View view = LayoutInflater.from(getApplication()).inflate(R.layout.fragment_one_layout, null); 
    image = (ImageView) view.findViewById(R.id.image1); 


    viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      parallax(image); 

     } 

     @Override 
     public void onPageSelected(int position) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); // End of attempt 
} 

    //Parallax method 
public void parallax(final View v) { 
    final Rect r = new Rect(); 
    v.getLocalVisibleRect(r); 
    if (lastTop != r.top) { 
     lastTop = r.top; 
     v.post(new Runnable() { 
      @Override 
      public void run() { 
       v.setX((float) (r.top/2.0)); 
      } 
     }); 
    } 
} 
} 

Pageadapter

public class PagerAdapter extends FragmentPagerAdapter { 

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    // TODO Auto-generated constructor stub 

} 

@Override 
public Fragment getItem(int arg0) { 
    // TODO Auto-generated method stub 
    switch (arg0) { 
     case 0: 

      return new FragmentOne(); 
     case 1: 
      return new FragmentTwo(); 
     case 2: 
      return new FragmentThree(); 

     default: 
      break; 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return 3; 
} 
} 

Activity_main Layout

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</android.support.v4.view.ViewPager> 
</FrameLayout> 

FragmentOne-Layout - andere Fragmente sind gleich mit verschiedenen ImageViews.

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:tools="http://schemas.android.com/tools" 
tools:context=".Activity.MainActivity" 
android:id="@+id/fone"> 

<ImageView 
    android:layout_width="427dp" 
    android:layout_height="568dp" 
    android:id="@+id/image1" 
    android:src="@drawable/city" 
    android:adjustViewBounds="true" 
    android:scaleType="centerCrop"/> 
</FrameLayout> 
+0

Ihr Bild ist nicht in der Hierarchie, weil Sie es aufgeblasen haben, ohne es hinzuzufügen, daher ist es nicht sichtbar. Sie müssen einen Verweis auf das angezeigte Bild erhalten, wenn Sie den Effekt anwenden. – njzk2

+0

@ njzk2 - Danke Kumpel, das hat mich auf den richtigen Weg gebracht, wie kann ich das angezeigte Bild referenzieren? – JP4

Antwort

0

Warum möchten Sie ein Bild in 3 Fragmenten anzeigen? Es ist, weil es groß oder nur ein Stil Zweck ist?

Wenn Ihr Bild zu groß ist, können Sie für Ihr Bild ein Zoom-In/-Out erstellen, wie beschrieben here.

Wenn das ist, weil Sie nur ein Bild in 3 verschiedenen Fragmenten ohne besonderen Grund zeigen möchten, können Sie TabLayout here überprüfen.

+0

Jedes Fragment ist eine separate Ansicht mit einem einzigartigen Bild, für den Zweck dieser Frage versuche ich nur, den Parallaxe-Effekt auf mein erstes Fragment zu bekommen, und dann werde ich es auf die anderen Fragmente anwenden. Vielen Dank. – JP4

+0

Haben Sie das Layout der Registerkarte überprüft? Sie können Ihr Bild in 3 Teile derselben Größe zuschneiden und sie dann den 3 Fragmenten zuweisen, die Sie haben (1. Teil zu Fragment 1, 2. Teil zu Fragment 2, usw.) und dann Ihre 3 Fragmente zu einem TabLayout hinzufügen. – Alberto