140_自定义ViewPager

来源:互联网 发布:朝鲜奢侈生活知乎 编辑:程序博客网 时间:2024/06/06 15:02


自定义ViewPager


官方给的东西当然还不够

我们自己来搞个自定义ViewPager

 

public class CustomViewPager extends ViewPager{

//构造函数

    public CustomViewPager(Context context) {

        super(context);

    }

 

    public CustomViewPager(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

 

}

 

我们来个两个成员变量

表示第一个页面和第二个页面

private View left;

private View right;

 

再来个HashMap存放ViewPager的页面

Map<Integer, ImageView> images = new HashMap<>();

 

来写两个方法控制页面增删

    public void addChildView(ImageView iv, int position) {

        images.put(position, iv);

    }

 

    public void removeChildView(int position) {

        images.remove(position);

    }

 

 

我们要在adapter中添加这两个方法

    @Override

    public Object instantiateItem(ViewGroup container, int position) {

        ImageView imageView = new ImageView(container.getContext());

        imageView.setBackgroundResource(pages[position]);

        container.addView(imageView);

 

        mVp.addChildView(imageView,position);

 

        return imageView;

    }

 

    @Override

    public void destroyItem(ViewGroup container, int position, Object object) {

        container.removeView((View)object);

 

        mVp.removeChildView(position);

 

    }

 

 


 

现在我们要监听页面的动态

那么就要给mVp设置listener

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override

            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

 

            }

 

            @Override

            public void onPageSelected(int position) {

 

            }

 

            @Override

            public void onPageScrollStateChanged(int state) {

 

            }

        });

 

 

我们在CustomViewPager中重写一下方法

    @Override

    protected void onPageScrolled(int position, float offset, int offsetPixels) {

        super.onPageScrolled(position, offset, offsetPixels);

        

    }

 

这里解释一下3个参数

1.position 当前页面的索引值

2.offset   手指划过去的比例值,占屏幕的宽

3.offsetPixels 手指滑动的像素值

 

 

给页面设置动画

    @Override

    protected void onPageScrolled(int position, float offset, int offsetPixels) {

        super.onPageScrolled(position, offset, offsetPixels);

 

        left = images.get(position);

        right = images.get(position + 1);

        startAnimation(left, right, position, offset, offsetPixels);

    }

 

 

写一个startAnimation方法

    private void startAnimation(View left, View right, int position, float offset, int offsetPixels) {

        if (right != null) {

            float translationX = -(getWidth() - offsetPixels);

            right.setTranslationX(translationX);

 

            float min_scale = 0.75f;

            float scaleFactor = min_scale + (1 - min_scale) * Math.abs(offset);

            right.setScaleX(scaleFactor);

            right.setScaleY(scaleFactor);

        }

    }

 

 

然后我们要让A页面在B页面上面,还是在方法内

        if (left != null) {

            left.bringToFront();

        }

 

 

好了搞定

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击