Android视差效果和视图翻页器

8
我想在我的应用程序中实现视差效果。 我有一个FragmentActivity,它实现了OnPageChangeListener接口,并监听我的ViewPager滚动事件。
为了在我的XML中实现此效果,我在所有其他视图的后面使用了一个带有背景的LinearLayout,并在onPageScrolled回调中移动它。 如果我简单地滑动,一切都很好,效果起作用,并且背景位置会改变。但是当我的手指离开屏幕时,即使我在新页面上,背景也会重新绘制到原始位置。 我不明白为什么会发生这种情况。 以下是我的FragmentActivity代码:
public class MainActivity extends FragmentActivity implements OnPageChangeListener {

// DEFINE THE PAGEADAPTER
private ViewPager viewPager;
private com.angtrim.ecomilano.PagerAdapter pagerAdapter;
private int oldPosition = 0;
private int offSet = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // CREATE VIEWPAGER
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    pagerAdapter = new PagerAdapter(getApplicationContext(),getSupportFragmentManager());
    // SET THE ADAPTER
    viewPager.setAdapter(pagerAdapter);        
    // SET FIRST ITEM
    viewPager.setCurrentItem(0);   
    // SET CHANGE PAGE LISTENER
    viewPager.setOnPageChangeListener(this);        
}    

@Override
public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub      
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

    // RIGHT SWIPE
    if((oldPosition < arg2))
    {       
        offSet = (int)((arg2 - oldPosition)*0.5);               
        oldPosition = arg2;
    }
    // LEFT SWIPE
    else if( (oldPosition > arg2))
    {   
        offSet = (int) (-(oldPosition - arg2)*0.5);         
        oldPosition = arg2;
    }

    findViewById(R.id.backi).offsetLeftAndRight(offSet);        
}

@Override
public void onPageSelected(int arg0) {
    // TODO Auto-generated method stub

}
}

谢谢。

可以使用这个来实现背景和视差效果,取决于屏幕的运动。 - Prasad
5个回答

9

我知道这可能有点旧了,但是看一下这个:https://github.com/xgc1986/ParallaxPagerLibrary

它不覆盖onDraw方法,而且效果不仅限于图像,它可以用于任何类型的视图。

mPager.setPageTransformer(false, new ParallaxTransformer(R.id.parallaxContent));

R.id.paraallaxContent是你想具有这种效果的视图的ID。

与其他解决方案不同,它不需要任何具体的结构即可工作,并且还与布局无关。

演示:youtube


垂直视图页面中是否可能实现视差效果? - user1076881

2
这个库在x和y方向上是完全可定制的,并且包括alpha效果:

https://github.com/prolificinteractive/ParallaxPager

安装(截至v0.7,有更新请查看README):
  1. 使用Gradle将其添加为Maven Central依赖项

  2. 在布局XML中使用自定义的ParallaxContainer而不是ViewPager

  3. 为每个页面创建一个布局XML文件(可以分别为每个移入/移出页面的对象设置x/y/alpha属性)

  4. 在Activity的onCreate方法中添加几行复制/粘贴的代码(具体代码请参阅README)

parallax planet animation


很棒的库,我用它来制作视差屏幕,效果完美。 - Shirane85

2

我知道这个问题很老了,而且我无法真正回答你的问题。但是,一个叫Matthieu的人创建了一个非常好的ViewPager视差效果示例,可以在以下链接找到。

https://github.com/MatthieuLJ/ViewPagerParallax


2

1

看看我创建的小型库 - 它是一个ViewPager子类,不需要额外的配置即可实现视差效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接