zoukankan      html  css  js  c++  java
  • viewpager切换的动画效果

    实现ViewPager的切换的动画效果

    http://blog.csdn.net/lmj623565791/article/details/40411921/

    http://blog.csdn.net/lmj623565791/article/details/38026503 

    目录 

    1. 用官方给的两个切换动画效果,看看效果
    2. 分析为为什么android 3.0的版本不能使用
    3. 详细的分析ViewPager的实现动画,然后自己定义

    1.ViewPager的动画的效果,应用Google提供的两个例子实现

       ①在XML中添加ViewPager的控件

       

    1 <android.support.v4.view.ViewPager
    2         android:id="@+id/id_viewpager"
    3         android:layout_width="match_parent"
    4         android:layout_height="match_parent" >
    5     </android.support.v4.view.ViewPager>

      ②在java代码中调用设置动画的方法

    1         //第一个参数true child倒叙 false child顺序
    2         //第二个参数就是实现ViewPager.PageTransformer的接口的类
    3         mViewPager.setPageTransformer(arg0, arg1);

      两种实现pagertransformer接口的类

     <1>DepthPageTransformer

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

    <2>ZoomOutPageTransformer

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

    2.但是只能在android3.0或者以前才有效,具体的ViewPager的源码,中的方法

     1 /**
     2      * Set a {@link PageTransformer} that will be called for each attached page whenever
     3      * the scroll position is changed. This allows the application to apply custom property
     4      * transformations to each page, overriding the default sliding look and feel.
     5      *
     6      * <p><em>Note:</em> Prior to Android 3.0 the property animation APIs did not exist.
     7      * As a result, setting a PageTransformer prior to Android 3.0 (API 11) will have no effect.</p>
     8      *
     9      * @param reverseDrawingOrder true if the supplied PageTransformer requires page views
    10      *                            to be drawn from last to first instead of first to last.
    11      * @param transformer PageTransformer that will modify each page's animation properties
    12      */
    13     public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
    14         if (Build.VERSION.SDK_INT >= 11) {
    15             final boolean hasTransformer = transformer != null;
    16             final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
    17             mPageTransformer = transformer;
    18             setChildrenDrawingOrderEnabledCompat(hasTransformer);
    19             if (hasTransformer) {
    20                 mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
    21             } else {
    22                 mDrawingOrder = DRAW_ORDER_DEFAULT;
    23             }
    24             if (needsPopulate) populate();
    25         }
    26     }

    主要是由于android3.0上采用的属性动画,所以这里进行了判断,通过上面的代码可以看见在实现ViewPager.setPagerTransformer()方法的时候,先进行判断,当前的Api的版本。如果<11执行这个方法就没有效,

     3.实现自己的ViewPager的切换动画

      

     1 /**
     2  * 实现自定义切换动画
     3  * @author kc
     4  *
     5  */
     6 public class MyPageTransformer implements ViewPager.PageTransformer {
     7 
     8     public void transformPage(View view, float position) {
     9         // 通过打印log的方式
    10         // 当A页切换到B页的时候
    11         // A页的position是从0 ~ -1的变化
    12         // B页的position是从1 ~ 0.0的变化
    13         if (position < -1) { // [-Infinity,-1) 这时的view是看不见的
    14             // TODO
    15         } else if (position <= 0) { // [-1,0] A页
    16             // TODO
    17         } else if (position <= 1) { // (0,1]  B页
    18             // TODO
    19         } else { // (1,+Infinity] 这时的view是看不见的
    20             // TODO
    21         }
    22     }
    23 
    24 }
  • 相关阅读:
    Redis 服务端程序实现原理
    Redis 中的客户端
    Redis 中的数据持久化策略(AOF)
    Redis 中的数据持久化策略(RDB)
    Redis 中的数据库
    Redis 的底层数据结构(对象)
    Redis 的底层数据结构(压缩列表)
    Redis 的底层数据结构(整数集合)
    又离职了~
    如何救活被屏蔽的主机,继续开发工作
  • 原文地址:https://www.cnblogs.com/dukc/p/5109968.html
Copyright © 2011-2022 走看看