Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)

学习内容来自“慕课网”

一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果

先看布局文件

activity_main.layout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/frameLayout1"
    android:orientation="vertical">
    
</FrameLayout>

 然后是java文件

mainactivity.java

 1 package com.example.viewpage;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import android.os.Bundle;
 7 import android.app.Activity;
 8 import android.graphics.DashPathEffect;
 9 import android.support.v4.view.PagerAdapter;
10 import android.support.v4.view.ViewPager;
11 import android.text.style.SuperscriptSpan;
12 import android.view.Menu;
13 import android.view.View;
14 import android.view.ViewGroup;
15 import android.view.Window;
16 import android.widget.ArrayAdapter;
17 import android.widget.ImageView;
18 import android.widget.ImageView.ScaleType;
19 
20 public class MainActivity extends Activity {
21 
22     private ViewPager mviewpager; //控件
23     private int[] mImgIds = new int[]{R.drawable.guide_image1,R.drawable.guide_image2,R.drawable.guide_image3};//初始化图片
24     private List<ImageView> mImages = new ArrayList<ImageView>();
25     
26     
27     
28     @Override
29     protected void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         requestWindowFeature(Window.FEATURE_NO_TITLE);
32         setContentView(R.layout.activity_main);
33         
34         mviewpager = (ViewPager) findViewById(R.id.id_viewpager);
35         //为ViewPage切换添加动画效果(3.0以上版本才可以有效果)
36         mviewpager.setPageTransformer(true, new ZoomOutPageTransformer());
37         
38         mviewpager.setAdapter(new PagerAdapter() {
39             
40             @Override
41             public Object instantiateItem(View container, int position) {
42                 ImageView imageview = new ImageView(MainActivity.this);
43                 imageview.setImageResource(mImgIds[position]);
44                 imageview.setScaleType(ScaleType.CENTER_CROP); //设置图片不变形
45                 ((ViewGroup) container).addView(imageview);
46                 mImages.add(imageview);
47                 return imageview;
48             };
49             @Override
50             public void destroyItem(View container, int position, Object object) {
51                 // TODO Auto-generated method stub
52                 
53                 ((ViewPager) container).removeView(mImages.get(position));
54             }
55             public boolean isViewFromObject(View view, Object object) {
56                 // TODO Auto-generated method stub
57                 return view == object;
58             }
59             
60             @Override
61             public int getCount() {                   //返回图片个数
62                 // TODO Auto-generated method stub
63                 return mImgIds.length;
64             }
65         });
66     }
67 
68 
69     
70 }

这里代码很简单,主要就是一行代码控制切换效果 第36行mviewpager.setPageTransformer(true, new ZoomOutPageTransformer());

第二个参数就是切换效果,当然不是随便的参数

这些参数可以在http://wear.techbrood.com/training/animation/screen-slide.html网上查阅到

代码是给定的,只要复制代码,点击包粘贴就生成了相应的java文件

这里展示下几种效果:

1、ZoomOutPageTransformer()

 1 public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
 2     private static final float MIN_SCALE = 0.85f;
 3     private static final float MIN_ALPHA = 0.5f;
 4 
 5     public void transformPage(View view, float position) {
 6         int pageWidth = view.getWidth();
 7         int pageHeight = view.getHeight();
 8 
 9         if (position < -1) { // [-Infinity,-1)
10             // This page is way off-screen to the left.
11             view.setAlpha(0);
12 
13         } else if (position <= 1) { // [-1,1]
14             // Modify the default slide transition to shrink the page as well
15             float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
16             float vertMargin = pageHeight * (1 - scaleFactor) / 2;
17             float horzMargin = pageWidth * (1 - scaleFactor) / 2;
18             if (position < 0) {
19                 view.setTranslationX(horzMargin - vertMargin / 2);
20             } else {
21                 view.setTranslationX(-horzMargin + vertMargin / 2);
22             }
23 
24             // Scale the page down (between MIN_SCALE and 1)
25             view.setScaleX(scaleFactor);
26             view.setScaleY(scaleFactor);
27 
28             // Fade the page relative to its size.
29             view.setAlpha(MIN_ALPHA +
30                     (scaleFactor - MIN_SCALE) /
31                     (1 - MIN_SCALE) * (1 - MIN_ALPHA));
32 
33         } else { // (1,+Infinity]
34             // This page is way off-screen to the right.
35             view.setAlpha(0);
36         }
37     }
38 }

效果图:

红色的为第一张,蓝色的为第二张,向左滑动显示蓝色。效果为两张图并行缩小滑动

2、DepthPageTransformer()

 1 public class DepthPageTransformer implements ViewPager.PageTransformer {
 2     private static final float MIN_SCALE = 0.75f;
 3 
 4     public void transformPage(View view, float position) {
 5         int pageWidth = view.getWidth();
 6 
 7         if (position < -1) { // [-Infinity,-1)
 8             // This page is way off-screen to the left.
 9             view.setAlpha(0);
10 
11         } else if (position <= 0) { // [-1,0]
12             // Use the default slide transition when moving to the left page
13             view.setAlpha(1);
14             view.setTranslationX(0);
15             view.setScaleX(1);
16             view.setScaleY(1);
17 
18         } else if (position <= 1) { // (0,1]
19             // Fade the page out.
20             view.setAlpha(1 - position);
21 
22             // Counteract the default slide transition
23             view.setTranslationX(pageWidth * -position);
24 
25             // Scale the page down (between MIN_SCALE and 1)
26             float scaleFactor = MIN_SCALE
27                     + (1 - MIN_SCALE) * (1 - Math.abs(position));
28             view.setScaleX(scaleFactor);
29             view.setScaleY(scaleFactor);
30 
31         } else { // (1,+Infinity]
32             // This page is way off-screen to the right.
33             view.setAlpha(0);
34         }
35     }
36 }

效果图:

红色的为第一张,蓝色的为第二张,向左滑动显示蓝色。效果为红色无变化向左滑动,蓝色由淡到深,由小到大占据屏幕

注意:添加DepthPageTransformer()和ZoomOutPageTransformer()java文件的时候 有两个错误 很容易 ctrl+1都能解决

更多动画类:

下载地址:

http://yunpan.cn/cFyjVgaeIFZ4e (提取码:ff5f)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android小菜鸡

巧妙运用补间动画,自定义广告轮播CarouselView 2.0

  这是前一篇文章绘制的CarouselView的升级版,有兴趣的同学,可以去关注一下笔者前一篇文章。自定义广告图片轮播View——CarouselView

1142
来自专栏緣來來來

安卓基础干货(十):安卓多媒体编程的学习

应用程序在启动时系统为它创建一个进程,系统为每个进程创建dalvik虚拟机(模拟器设置的VM Heap),当图片的大小大于虚拟机的堆内存空间时,就内存溢出(内存...

1301
来自专栏移动开发

利用 CollapsingToolbarLayout 完成联动的动画效果

最初的想法是自己去利用 Android 的嵌套滚动机制,去实现上面的嵌套滚动效果.但最后为了开发效率直接利用了 CollapsingToolbarLayout...

1101
来自专栏Android知识点总结

2--安卓多媒体之Bitmap操作全解析

892
来自专栏Android相关

Android遇到的一些小问题

UE希望调整文本行间距,原来只记得有lineSpacing的属性,而且只能调整行间距的倍数。

832
来自专栏Android Note

Android - ViewDragHelper实现京东、淘宝拖拽详情

1524
来自专栏郭霖

Android中轴旋转特效实现,制作别样的图片浏览器

Android API Demos中有很多非常Nice的例子,这些例子的代码都写的很出色,如果大家把API Demos中的每个例子研究透了,那么恭喜你已经成为一...

2506
来自专栏向治洪

教你自己写Android第三方库

其实Android studio的出现很大程度上方便了我们Android开发人员,今天我们说说怎么构建我们自己的库。 依次按File->New Moudle->...

3776
来自专栏程序员叨叨叨

【Android】手把手教你上滑解锁的效果

最近,公司开发的APP中要实现类似上滑解锁效果的推荐页,捣腾了两天,基本实现了效果,附效果图如上。接下来和大家聊聊如何实现这样的效果。

4842
来自专栏水击三千

android自定义控件

Android为开发者提供了大量的控件,这些控件只能满足一般性的需求,有时候需要开发者重新定制控件。控件的定制有三种形式:对原有控件的重写;对原有控件进行组合;...

3215

扫码关注云+社区

领取腾讯云代金券