私は水平にスクロールするビューを持つ3つのフラグメントを作った。各フラグメントビューでは、画面よりも大きな画像を表示し、画面がスクロールされると、画像は親ビュー内の視差効果で同じ方向にわずかに移動します。Android Horizontal 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>
画像を追加せずに膨らませたため、画像が階層にないため、表示されません。あなたが効果を適用するときに表示される画像への参照を取得する必要があります。 – njzk2
@ njzk2 - ありがとうございました。私は正しい軌道に乗りました。表示された画像をどのように参照できますか? – JP4