为 ViewPager 的特定页面设置动画
animating specific pages of the ViewPager
我用下面的代码给ViewPager
一个淡入淡出的效果:
//define view pager and set adapter:
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_startup_preference);
//we're not using the layout natively, but using Fragment's layout
//but setContentView is required -> it is accessed by : R.id.startPref_pager
StartPrefPagerAdapter prefPagerAdapter =
new StartPrefPagerAdapter(getSupportFragmentManager());
final ViewPager StartPref_Viewpager = findViewById(R.id.startPref_pager);
StartPref_Viewpager.setAdapter(prefPagerAdapter);
...
...
//set the animation with:
StartPref_Viewpager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
page.setScaleX(0.5f);
page.setScaleY(0.5f);
page.setAlpha(0f);
page.setVisibility(View.VISIBLE);
page.animate().alpha(1f).setDuration(1000);
page.animate().scaleX(1f).setDuration(500);
page.animate().scaleY(1f).setDuration(500);
}
});
...
但是,我希望从 ViewPager
的第二页开始应用动画,而不是从第一页开始应用。我怎样才能做到这一点?
我还没有实际做过,但从你的代码看来,在 position 的基础上应用条件应该是可能的,如下所示。
StartPref_Viewpager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
//this is the viewpager page position
if(position!=0)
{
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
page.setScaleX(0.5f);
page.setScaleY(0.5f);
page.setAlpha(0f);
page.setVisibility(View.VISIBLE);
page.animate().alpha(1f).setDuration(1000);
page.animate().scaleX(1f).setDuration(500);
page.animate().scaleY(1f).setDuration(500);
}
}
});
您可以在滚动时使用 OnPageChangeListener
检查页码,第 0 页使用默认值 PageTransformer
,其他页面使用自定义 PageTransformer
[=14] =]
StartPref_Viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (position == 0)
StartPref_Viewpager.setPageTransformer(false, mDefaultPageTransformer);
else
StartPref_Viewpager.setPageTransformer(false, mPageTransformer);
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
ViewPager.PageTransformer mPageTransformer = new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
page.setScaleX(0.5f);
page.setScaleY(0.5f);
page.setAlpha(0f);
page.setVisibility(View.VISIBLE);
page.animate().alpha(1f).setDuration(1000);
page.animate().scaleX(1f).setDuration(500);
page.animate().scaleY(1f).setDuration(500);
}
};
ViewPager.PageTransformer mDefaultPageTransformer = new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
}
};
我用下面的代码给ViewPager
一个淡入淡出的效果:
//define view pager and set adapter:
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_startup_preference);
//we're not using the layout natively, but using Fragment's layout
//but setContentView is required -> it is accessed by : R.id.startPref_pager
StartPrefPagerAdapter prefPagerAdapter =
new StartPrefPagerAdapter(getSupportFragmentManager());
final ViewPager StartPref_Viewpager = findViewById(R.id.startPref_pager);
StartPref_Viewpager.setAdapter(prefPagerAdapter);
...
...
//set the animation with:
StartPref_Viewpager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
page.setScaleX(0.5f);
page.setScaleY(0.5f);
page.setAlpha(0f);
page.setVisibility(View.VISIBLE);
page.animate().alpha(1f).setDuration(1000);
page.animate().scaleX(1f).setDuration(500);
page.animate().scaleY(1f).setDuration(500);
}
});
...
但是,我希望从 ViewPager
的第二页开始应用动画,而不是从第一页开始应用。我怎样才能做到这一点?
我还没有实际做过,但从你的代码看来,在 position 的基础上应用条件应该是可能的,如下所示。
StartPref_Viewpager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
//this is the viewpager page position
if(position!=0)
{
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
page.setScaleX(0.5f);
page.setScaleY(0.5f);
page.setAlpha(0f);
page.setVisibility(View.VISIBLE);
page.animate().alpha(1f).setDuration(1000);
page.animate().scaleX(1f).setDuration(500);
page.animate().scaleY(1f).setDuration(500);
}
}
});
您可以在滚动时使用 OnPageChangeListener
检查页码,第 0 页使用默认值 PageTransformer
,其他页面使用自定义 PageTransformer
[=14] =]
StartPref_Viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (position == 0)
StartPref_Viewpager.setPageTransformer(false, mDefaultPageTransformer);
else
StartPref_Viewpager.setPageTransformer(false, mPageTransformer);
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
ViewPager.PageTransformer mPageTransformer = new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
page.setScaleX(0.5f);
page.setScaleY(0.5f);
page.setAlpha(0f);
page.setVisibility(View.VISIBLE);
page.animate().alpha(1f).setDuration(1000);
page.animate().scaleX(1f).setDuration(500);
page.animate().scaleY(1f).setDuration(500);
}
};
ViewPager.PageTransformer mDefaultPageTransformer = new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
}
};