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>
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
@ njzk2 - Danke Kumpel, das hat mich auf den richtigen Weg gebracht, wie kann ich das angezeigte Bild referenzieren? – JP4