1. 程式人生 > >Android項目實戰(四):ViewPager切換動畫(3.0版本以上有效果)

Android項目實戰(四):ViewPager切換動畫(3.0版本以上有效果)

技術 code info utf-8 play draw pos support addview

原文: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 }
View Code

效果圖:

技術分享圖片 技術分享圖片

紅色的為第一張,藍色的為第二張,向左滑動顯示藍色。效果為兩張圖並行縮小滑動

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 }
View Code

效果圖:

技術分享圖片 技術分享圖片 技術分享圖片

紅色的為第一張,藍色的為第二張,向左滑動顯示藍色。效果為紅色無變化向左滑動,藍色由淡到深,由小到大占據屏幕

註意:添加DepthPageTransformer()和ZoomOutPageTransformer()java文件的時候 有兩個錯誤 很容易 ctrl+1都能解決

更多動畫類:

下載地址:

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

Android項目實戰(四):ViewPager切換動畫(3.0版本以上有效果)