这里记录下viewpager中的切换之间的渐变以及间距的动画
1、设置间距并展示多个页面边缘
主要是这个属性android:clipChildren=”false”表示的意思是: clipChild用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true。 也就是不允许进行扩展绘制。那么我们设置这个ViewPager的父布局的android:clipChildren=”false”,然后设置一个左右间距,那么其他页面的边缘部分就能显示出来了。
1.1、xml代码中设置
<?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"
android:background="@android:color/holo_blue_dark"
android:fitsSystemWindows="true"
android:clipChildren="false"
>
<android.support.v4.view.ViewPager
android:id="@+id/vp_vip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="35dp"
android:layout_marginRight="35dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="30dp"
/>
</LinearLayout>
1.2、当然也可以在java代码中设置直接让父布局parent.setClipChildren(false);就可以了
2、使用PageTransformer设置ViewPager的切换宽高渐变以及透明度的渐变
private float MAX_SCALE = 1.0f;
private float MIN_SCALE = 0.9f;
private float MIN_Alpha = 0.5f;
/**
* 实现的原理是,在当前显示页面放大至原来的MAX_SCALE
* 其他页面才是正常的的大小MIN_SCALE
*/
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
//setScaleY只支持api11以上
if (position < -1) {
view.setScaleX(MIN_SCALE);
view.setScaleY(MIN_SCALE);
} else if (position <= 1) //a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0
{ // [-1,1]
// Log.e("TAG", view + " , " + position + "");
float scaleFactor = MIN_SCALE + (1 - Math.abs(position)) * (MAX_SCALE - MIN_SCALE);
float alpha = MIN_Alpha + ((1 - Math.abs(position)) * (MAX_SCALE - MIN_Alpha));
//每次滑动后进行微小的移动目的是为了防止在三星的某些手机上出现两边的页面为显示的情况
if (position > 0) {
view.setTranslationX(-scaleFactor * 2);
} else if (position < 0) {
view.setTranslationX(scaleFactor * 2);
}
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
view.setAlpha(alpha);
} else { // (1,+Infinity]
view.setScaleX(MIN_SCALE);
view.setScaleY(MIN_SCALE);
view.setAlpha(MIN_Alpha);
}
}
}
2.1、使用方式
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), titles);
ViewPager viewPager = findViewById(R.id.vp_vip);
viewPager.setOffscreenPageLimit(3);//设置限制数量
// //clipChild用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true。 也就是不允许进行扩展绘制。
// vp_vip.clipChildren = false
// //父容器一定要设置这个,否则看不出效果
// vp_vip.clipChildren = false
//设置ViewPager切换效果,即实现画廊效果
viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
viewPager.setAdapter(adapter);
3、fragment中的写法使用newInstance传参
3.1、MyFragment.java中的写法
package com.demo.viewpageradvertise;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* Created by zsj on 2018/6/28.
*/
public class MyFragment extends Fragment{
public static MyFragment newInstance(int postion) {
Bundle args = new Bundle();
MyFragment fragment = new MyFragment();
fragment.setArguments(args);
args.putInt("position",postion);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_my, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
int mPos=getArguments().getInt("position");
TextView tv=view.findViewById(R.id.tv_index);
tv.setText(mPos+"");
}
}
3.2、adapter.java
package com.demo.viewpageradvertise;
/**
* Created by zsj on 2018/6/28.
*/
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* Created by zsj on 2017/8/7.
*/
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private String[] titles;
public MyFragmentPagerAdapter(FragmentManager fm, String[] titles) {
super(fm);
this.titles = titles;
}
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(position);
}
@Override
public int getCount() {
return titles.length;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
这样的写法的好处是:给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),这样就完成了Fragment和Activity间的解耦,而且数据横竖屏切换的时候不容易造成数据丢失。
4、总结
主要是PageTransformer中切换的时候拿到滑动参数比例设置宽高和透明度。好记性不如烂笔头~
demo下载地址
github地址