用開源項目JazzyViewPager實現ViewPager切換動畫

  JazzyViewPager這個項目可讓viewpager有各類絢麗的動畫,並且還能夠自由擴展。但從官網下載的lib導入時會出現找不到視圖的問題,不知道是否是我人品不行,因此我就本身寫了lib。總之,本篇就是來說這些能夠有華麗動畫的viewpager。java

JazzyViewPager項目地址:https://github.com/jfeinstein10/JazzyViewPagerandroid

  

1、佈局文件git

像viewpager同樣,直接寫一個控件便可。github

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="#00ff00">

    <com.jfeinstein.jazzyviewpager.JazzyViewPager
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/jazzyViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.jfeinstein.jazzyviewpager.JazzyViewPager>

</LinearLayout>

 

它裏面還有不少屬性能夠定義的,像上面的能夠用app這個命名空間來定義屬性。下面是各類屬性,基本就是各類動畫,和淡入淡出效果app

fadeEnable:是否有淡入淡出效果ide

outLineEnable:viewpager一個視圖周邊是否有邊框佈局

outLineColor:邊框顏色動畫

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="JazzyViewPager">
        <attr name="style">
            <enum name="standard" value="0" />
            <enum name="tablet" value="1" />
            <enum name="cubein" value="2" />
            <enum name="cubeout" value="3" />
            <enum name="flipvertical" value="4" />
            <enum name="fliphorizontal" value="5" />
            <enum name="stack" value="6" />
            <enum name="zoomin" value="7" />
            <enum name="zoomout" value="8" />
            <enum name="rotateup" value="9" />
            <enum name="rotatedown" value="10" />
            <enum name="accordion" value="11" />
        </attr>
        <attr name="fadeEnabled" format="boolean" />
        <attr name="outlineEnabled" format="boolean" />
        <attr name="outlineColor" format="color|reference" />
    </declare-styleable>

</resources> 

 

2、java代碼實現ui

2.1首先看看它有什麼動畫效果,至於各類動畫是什麼樣的,本身去試試吧~spa


* Standard
* Tablet
* CubeIn
* CubeOut
* FlipVertical
* FlipHorizontal
* Stack
* ZoomIn
* ZoomOut
* RotateUp
* RotateDown
* Accordion

 

2.2設置動畫的方法

viewPager.setTransitionEffect(TransitionEffect.Tablet);

or

TransitionEffect effect = TransitionEffect.valueOf("Tablet");
setupJazziness(effect);

 

2.3簡單設置

viewPager.setPageMargin(100);//兩個頁面之間的間距
viewPager.setFadeEnabled(true);//有淡入淡出效果
viewPager.setOutlineEnabled(true);//有邊框
viewPager.setOutlineColor(0xff0000ff);//邊框顏色

 

2.4適配器的寫法

這裏已經寫的很簡單了,之後照貓畫虎就行。主要就是裏面須要用這個viewpager作一些事情。

官方文檔中說:Due to the limitations of the ViewPager class (which JazzyViewPager is built upon) in order to get the animations to work correctly for more than 3 Views, you'll have to add the following to theinstantiateItem method of your PagerAdapter.

private JazzyViewPager mJazzy;
/* ... */
@Override
public Object instantiateItem(ViewGroup container, final int position) {
    Object obj = super.instantiateItem(container, position);
    mJazzy.setObjectForPosition(obj, position);
    return obj;
}

 

大概意思就是若是viewpager中的view超過3個了,就須要添加上面這個方法。這裏面的obj就是一個view對象,具體參照下面的例子。

例子:

    /**
     * @author:Jack Tony
     * @tips  :下面的方法須要注意,儘可能按照這種寫法。
     * @date  :2014-10-22
     */
    class MyAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            // TODO 自動生成的方法存根
            return 10;
        }

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            if (view instanceof OutlineContainer) {
                return ((OutlineContainer) view).getChildAt(0) == obj;
            } else {
                return view == obj;
            }
        }
        
        /* 若是viewpager中的view超過3個就須要重寫這個方法*/  
        @Override  
        public Object instantiateItem(ViewGroup container, final int position) {  
            TextView tv = new TextView(getApplicationContext());
            tv.setText("Page " + (position + 1));
            tv.setTextColor(Color.parseColor("#000000"));
            tv.setTextSize(30);
            tv.setGravity(Gravity.CENTER);
            tv.setBackground(getWallpaper());
            container.addView(tv, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            
            //這句話必需要寫,按不一樣的位置添加視圖
            viewPager.setObjectForPosition(tv, position);
            return tv;  
        }
        
        @Override
        public void destroyItem(ViewGroup container, int position, Object obj) {
            container.removeView(viewPager.findViewFromObject(position));
        }


    }

 

ok,這樣就基本搞定了。貼上所有代碼:

MainActivity.java

package com.kale.jazzviewpagertest;

import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.jfeinstein.jazzyviewpager.JazzyViewPager;
import com.jfeinstein.jazzyviewpager.JazzyViewPager.TransitionEffect;
import com.jfeinstein.jazzyviewpager.OutlineContainer;

public class MainActivity extends Activity {

    private JazzyViewPager viewPager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        viewPager = (JazzyViewPager)findViewById(R.id.jazzyViewPager);
        /**
         * 添加動畫效果,能夠設置不少動畫效果。如:
         * Standard
         * Tablet
         * CubeIn
         * CubeOut
         * FlipVertical
         * FlipHorizontal
         * Stack
         * ZoomIn
         * ZoomOut
         * RotateUp
         * RotateDown
         * Accordion
         * 
         * 下面是能夠經過字符串來產生動畫對象的例子:
         * TransitionEffect effect = TransitionEffect.valueOf("Tablet");
         * setupJazziness(effect);
         */
        viewPager.setTransitionEffect(TransitionEffect.Tablet);
        viewPager.setPageMargin(100);//兩個頁面之間的間距
        viewPager.setFadeEnabled(true);//有淡入淡出效果
        viewPager.setOutlineEnabled(true);//有邊框
        viewPager.setOutlineColor(0xff0000ff);//邊框顏色
        /**
         * 設置適配器
         * 但當ViewPager中的子View超過三個的時候,咱們須要對PagerAdapter修改,
         * 重寫InstantiateItem()方法
         */
        viewPager.setAdapter(new MyAdapter());
        
        viewPager.setOnPageChangeListener(null);//能夠監聽page的改變
    }
    
    /**
     * @author:Jack Tony
     * @tips  :下面的方法須要注意,儘可能按照這種寫法。
     * @date  :2014-10-22
     */
    class MyAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            // TODO 自動生成的方法存根
            return 10;
        }

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            if (view instanceof OutlineContainer) {
                return ((OutlineContainer) view).getChildAt(0) == obj;
            } else {
                return view == obj;
            }
        }
        
        /* 若是viewpager中的view超過3個就須要重寫這個方法*/  
        @Override  
        public Object instantiateItem(ViewGroup container, final int position) {  
            TextView tv = new TextView(getApplicationContext());
            tv.setText("Page " + (position + 1));
            tv.setTextColor(Color.parseColor("#000000"));
            tv.setTextSize(30);
            tv.setGravity(Gravity.CENTER);
            tv.setBackground(getWallpaper());
            container.addView(tv, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            
            //這句話必需要寫,按不一樣的位置添加視圖
            viewPager.setObjectForPosition(tv, position);
            return tv;  
        }
        
        @Override
        public void destroyItem(ViewGroup container, int position, Object obj) {
            container.removeView(viewPager.findViewFromObject(position));
        }


    }
}

 

最終效果:

 

擴展:

 

咱們固然能夠繼續擴展動畫,下面就擴展一個動畫。

1、先定義一個動畫名字,這裏叫test

public enum TransitionEffect {
        Standard,
        Tablet,
        CubeIn,
        CubeOut,
        FlipVertical,
        FlipHorizontal,
        Stack,
        ZoomIn,
        ZoomOut,
        RotateUp,
        RotateDown,
        Accordion,
        Test;}

 

2、寫實現方式

protected void animateTest(View left, View right, float positionOffset) {    
 if (mState != State.IDLE) {
  if (left != null) {
   //此處增長具體動畫
 }
  if (right != null) {
   //此處增長具體動畫實現 
 }
 }
}

 

這裏舉一個源碼中table的例子

    protected void animateTablet(View left, View right, float positionOffset) {        
        if (mState != State.IDLE) {
            if (left != null) {
                manageLayer(left, true);
                mRot = 30.0f * positionOffset;
                mTrans = getOffsetXForRotation(mRot, left.getMeasuredWidth(),
                        left.getMeasuredHeight());
                ViewHelper.setPivotX(left, left.getMeasuredWidth()/2);
                ViewHelper.setPivotY(left, left.getMeasuredHeight()/2);
                ViewHelper.setTranslationX(left, mTrans);
                ViewHelper.setRotationY(left, mRot);
                logState(left, "Left");
            }
            if (right != null) {
                manageLayer(right, true);
                mRot = -30.0f * (1-positionOffset);
                mTrans = getOffsetXForRotation(mRot, right.getMeasuredWidth(), 
                        right.getMeasuredHeight());
                ViewHelper.setPivotX(right, right.getMeasuredWidth()*0.5f);
                ViewHelper.setPivotY(right, right.getMeasuredHeight()*0.5f);
                ViewHelper.setTranslationX(right, mTrans);
                ViewHelper.setRotationY(right, mRot);
                logState(right, "Right");
            }
        }
    }

 

3、添加實現代碼到設置項中

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  if (mState == State.IDLE && positionOffset > 0) {
  oldPage = getCurrentItem();
  mState = position == oldPage ? State.GOING_RIGHT : State.GOING_LEFT;
}
boolean goingRight = position == oldPage;    
if (mState == State.GOING_RIGHT && !goingRight)
  mState = State.GOING_LEFT;
  else if (mState == State.GOING_LEFT && goingRight)
  mState = State.GOING_RIGHT;

  float effectOffset = isSmall(positionOffset) ? 0 : positionOffset;

  // mLeft = getChildAt(position);
  // mRight = getChildAt(position+1);
  mLeft = findViewFromObject(position);
  mRight = findViewFromObject(position+1);

  if (mFadeEnabled)
  animateFade(mLeft, mRight, effectOffset);
  if (mOutlineEnabled)
  animateOutline(mLeft, mRight);

  switch (mEffect) {
  case Standard:
  break;
  case Tablet:
  animateTablet(mLeft, mRight, effectOffset);
  break;
  case CubeIn:
  animateCube(mLeft, mRight, effectOffset, true);
  break;
  case CubeOut:
  animateCube(mLeft, mRight, effectOffset, false);
  break;
  case FlipVertical:
  animateFlipVertical(mLeft, mRight, positionOffset, positionOffsetPixels);
  break;
  case FlipHorizontal:
  animateFlipHorizontal(mLeft, mRight, effectOffset, positionOffsetPixels);
  case Stack:
  animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);
  break;
  case ZoomIn:
  animateZoom(mLeft, mRight, effectOffset, true);
  break;
  case ZoomOut:
  animateZoom(mLeft, mRight, effectOffset, false);
  break;
  case RotateUp:
  animateRotate(mLeft, mRight, effectOffset, true);
  break;
  case RotateDown:
  animateRotate(mLeft, mRight, effectOffset, false);
  break;
  case Accordion:
  animateAccordion(mLeft, mRight, effectOffset);
  break;
  case Test: 
  animateTest(mLeft, mRight, effectOffset);
break; } super.onPageScrolled(position, positionOffset, positionOffsetPixels); if (effectOffset == 0) { disableHardwareLayer(); mState = State.IDLE; } }

 

原理和思路講解:http://blog.csdn.net/lmj623565791/article/details/38026503

 

源碼下載:http://download.csdn.net/detail/shark0017/8070139

 

參考自:http://blog.csdn.net/t12x3456/article/details/13290349

相關文章
相關標籤/搜索