2016-07-04 11 views
0

私は水平にスクロールするビューを持つ3つのフラグメントを作った。各フラグメントビューでは、画面よりも大きな画像を表示し、画面がスクロールされると、画像は親ビュー内の視差効果で同じ方向にわずかに移動します。Android Horizo​​ntal Parallax

私は多くの研究を行いました。私が見つけた視差効果の唯一の作業バージョンは、垂直方向のリストビューでした。私は同じプリンシパルを適用しようとしましたが、動作しません。このv.getLocalVisibleRect(r)には、イメージの戻り値0,0,0,0として何か問題があるようです。私はこのイメージを動かす方法を知る必要があります。

メイン

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レイアウト

<?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レイアウト - その他の断片は異なる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

画像を追加せずに膨らませたため、画像が階層にないため、表示されません。あなたが効果を適用するときに表示される画像への参照を取得する必要があります。 – njzk2

+0

@ njzk2 - ありがとうございました。私は正しい軌道に乗りました。表示された画像をどのように参照できますか? – JP4

答えて

0

なぜ3つのフラグメントで画像を表示したいですか?それは大きいか、ちょうどスタイル目的なのですから?

あなたの画像が大きすぎる場合は、hereと記載されているように画像のズームイン/ズームアウトを作成できます。

特定の理由がなくても、3つの異なる部分に画像を表示したい場合、TabLayout hereをチェックすることができます。

+0

各フラグメントは、独自のイメージを持つ別個のビューです。この質問の目的のために、私は最初のフラグメントで視差効果を働かせようとしています。そして、それを他のフラグメントに適用します。ありがとう。 – JP4

+0

タブのレイアウトを確認しましたか?画像を同じサイズの3つの部分でトリミングし、3つのフラグメント(1つ目のフラグメント、2つ目のフラグメント、2つのフラグメントなど)に割り当ててから、3つのフラグメントをTabLayoutに追加できます。 – Alberto

関連する問題