ParallaxViewPager从右到左

时间:2014-06-02 21:20:28

标签: android android-viewpager parallax right-to-left wallpaper

我正在ParallaxViewPager上工作。我有3页。一切正常工作和背景是应该的视差。但是当我添加parallaxViewPager.setCurrentItem(2)时;背景不会出现,它会获得默认的android背景。这是完整的代码:

MainActivity:

package com.example.myapplication3.app;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.widget.RelativeLayout;

import com.andraskindler.parallaxviewpager.ParallaxViewPager;

import java.io.FileNotFoundException;
import java.io.InputStream;


public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ParallaxViewPager parallaxViewPager = ((ParallaxViewPager) findViewById(R.id.parallaxviewpager));
        parallaxViewPager.setOverlapPercentage(0.25f);
        parallaxViewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
        parallaxViewPager.setCurrentItem(2);

        }
    }

PagerAdapter:

package com.example.myapplication3.app;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import java.util.ArrayList;
import java.util.List;




public class MyPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragments = new ArrayList<Fragment>();

        fragments.add(new view1());
        fragments.add(new view2());
        fragments.add(new view3());
    }



    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}

查看1,2,3:

package com.example.myapplication3.app;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class view1 extends Fragment { //view2, view3 on the others

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.view1, container, false); //same here view 2,3

        return rootView;
    }
}

,布局为:

MainActivitys&#39;布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="MergeRootFrame" >

    <com.andraskindler.parallaxviewpager.ParallaxViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/parallaxviewpager"
        android:layout_width="match_parent"
        android:background="@drawable/sanfran"
        android:layout_height="match_parent"/>

    </RelativeLayout>

查看1,2,3&#39;布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

</LinearLayout>

提前感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:0)

我遇到了与此组件相同的问题。它类似于画布和目标rect之间的冲突,所以在应该完成的任何地方绘制任何东西。

我创建了原始源存储库的fork来更新它。当调用setCurrentItem时,我检查位置并存储我稍后在onDraw方法中使用的调整值。

您可以在https://github.com/yuraksisa/parallaxviewpager

查看

答案 1 :(得分:-1)

以下是ParallaxViewPager的修改:

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.*;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;

@SuppressLint("NewApi")
public class ParallaxViewPager extends ViewPager {

    public static final int FIT_WIDTH = 0;
    public static final int FIT_HEIGHT = 1;
    public static final float OVERLAP_FULL = 1f;
    public static final float OVERLAP_HALF = 0.5f;
    public static final float OVERLAP_QUARTER = 0.25f;
    public Bitmap bitmap;
    private Rect source, destination;
    private int scaleType;
    private Paint paint;
    private OnPageChangeListener secondOnPageChangeListener;

    public ParallaxViewPager(Context context) {
        super(context);
        init();
    }

    public ParallaxViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        source = new Rect();
        destination = new Rect();
        scaleType = FIT_HEIGHT;
        setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset,
                                       int positionOffsetPixels) {
                if (bitmap != null) {
                    if (position == 0) {
                        source.left = (int) ((getWidth() / 8) * positionOffset);
                        source.right = getWidth() + source.left;
                        destination.left = (int) ((getWidth() * positionOffset) - getWidth());
                        destination.right = (int) (0 + (getWidth() * positionOffset));

                    } else {
                        source.left = (int) ((getWidth() / 8) - (getWidth() / 8)
                                * positionOffset);
                        source.right = getWidth() + source.left;
                        destination.left = (int) ((0 - getWidth()
                                * positionOffset));
                        destination.right = (int) (getWidth() - (getWidth() * positionOffset));
                    }

                    postInvalidate();
                }

                if (secondOnPageChangeListener != null) {
                    secondOnPageChangeListener.onPageScrolled(position,
                            positionOffset, positionOffsetPixels);
                }
            }

            @Override
            public void onPageSelected(int position) {
                if (secondOnPageChangeListener != null) {
                    secondOnPageChangeListener.onPageSelected(position);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if (secondOnPageChangeListener != null) {
                    secondOnPageChangeListener.onPageScrollStateChanged(state);
                }
            }
        });
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        destination.top = 0;
        destination.bottom = h;
        if (getAdapter() != null && bitmap != null)
            calculateParallaxParameters();
    }

    private void calculateParallaxParameters() {
        if (bitmap.getWidth() < getWidth()
                && bitmap.getWidth() < bitmap.getHeight()
                && scaleType == FIT_HEIGHT) {
            Log.w(ParallaxViewPager.class.getName(),
                    "Invalid bitmap bounds for the current device, parallax effect will not work.");
        }
        source.top = 0;
        source.bottom = bitmap.getHeight();

    }

    /**
     * Sets the background from a resource file.
     *
     * @param resid
     */
    @Override
    public void setBackgroundResource(int resid) {
        bitmap = BitmapFactory.decodeResource(getResources(), resid);
    }

    /**
     * Sets the background from a Drawable.
     *
     * @param background
     */
    @Override
    public void setBackground(Drawable background) {
        bitmap = ((BitmapDrawable) background).getBitmap();
    }

    /**
     * Deprecated. Sets the background from a Drawable.
     *
     * @param background
     */
    @Override
    public void setBackgroundDrawable(Drawable background) {
        bitmap = ((BitmapDrawable) background).getBitmap();
    }

    /**
     * Sets the background from a bitmap.
     *
     * @param bitmap
     * @return The ParallaxViewPager object itself.
     */
    public ParallaxViewPager setBackground(Bitmap bitmap) {
        this.bitmap = bitmap;
        return this;
    }

    public ParallaxViewPager setScaleType(final int scaleType) {
        if (scaleType != FIT_WIDTH && scaleType != FIT_HEIGHT)
            throw new IllegalArgumentException(
                    "Illegal argument: scaleType must be FIT_WIDTH or FIT_HEIGHT");
        this.scaleType = scaleType;
        return this;
    }

    /**
     * Sets the amount of overlapping with the setOverlapPercentage(final float
     * percentage) method. This is a number between 0 and 1, the smaller it is,
     * the slower is the background scrolling.
     *
     * @param percentage
     * @return The ParallaxViewPager object itself.
     */
    public ParallaxViewPager setOverlapPercentage(final float percentage) {
        if (percentage <= 0 || percentage >= 1)
            throw new IllegalArgumentException(
                    "Illegal argument: percentage must be between 0 and 1");
        return this;
    }

    /**
     * Recalculates the parameters of the parallax effect, useful after changes
     * in runtime.
     *
     * @return The ParallaxViewPager object itself.
     */
    public ParallaxViewPager invalidateParallaxParameters() {
        calculateParallaxParameters();
        return this;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, source, destination, paint);
        }
    }

    public void addOnPageChangeListener(OnPageChangeListener listener) {
        secondOnPageChangeListener = listener;
    }
}

以下是如何使用:

viewPager = (ParallaxViewPager)findViewById(R.id.lock_viewpager);
viewPager.setBackgroundDrawable(new BitmapDrawable());
viewPager.setAdapter(new MyViewPagerAdapter());
viewPager.addOnPageChangeListener(this);
viewPager.setCurrentItem(mList.size());