ViewPager實現動畫切換效果

今天在群里看見一個引導頁的效果,感覺好不錯,于是就擼了下,先看看效果圖



我們可以看到,當我們滑動頁面的時候,會有一個動畫的過渡效果,妹子是不是挺不錯的,哈哈哈,我特意找的,好了,我們看看怎么實現這種效果


思路:

1,首先需要一個viewPager
2,需要一個透明度變化的動畫
3,viewPager滑動后,啟動動畫,達到過渡的效果

那么,我們知道我們需要的這些東西以及大概的邏輯處理后,我們想想怎么去寫,首先我們來看看我們的透明度動畫文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="2000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

看到這個動畫文件,有些可能猜到是怎么做的了,沒錯,我們可以用兩個imageView來重疊,當我們滑動viewPager的時候,我們讓imageView1做透明度動畫效果,其實在做動畫效果之前,我們的imageView2已經是加載了一張圖片,那么,就會出現這種過渡的現象,我們來看看我們的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.administrator.myviewpager.MainActivity">

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@mipmap/image2" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@mipmap/image1" />

    <com.example.administrator.myviewpager.MyViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

當activity啟動的時候,我們imageView1和imageView2默認都加載了圖片,可以看到,imageView1疊加在imageView2上面,然后就是我們的viewPager,這里為什么是自定義的viewPager,等等在說明

現在我們來看看activity的代碼

package com.example.administrator.myviewpager;

import android.graphics.Color;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MyViewPager viewPager;
    private ImageView imageView1, imageView2;
    private String[] title = {"第一頁", "第二頁", "第三頁"};
    private List<View> viewList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (MyViewPager) findViewById(R.id.viewPager);
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        imageView2 = (ImageView) findViewById(R.id.imageView2);

        viewPager.setScroll(false);

        viewList = new ArrayList<>();
        for (int i = 0; i < title.length; i++) {
            TextView textView = new TextView(this);
            textView.setText(title[i]);
            textView.setGravity(Gravity.CENTER);
            textView.setTextColor(Color.BLACK);
            textView.setTextSize(16);
            viewList.add(textView);
        }

        viewPager.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return viewList.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

            @Override
            public void destroyItem(ViewGroup container, int position,
                                    Object object) {
                // TODO Auto-generated method stub
                container.removeView(viewList.get(position));
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                // TODO Auto-generated method stub
                container.addView(viewList.get(position));
                return viewList.get(position);
            }
        });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(final int position) {
                Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
                animation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        if (position == 0) {
                            imageView2.setImageResource(R.mipmap.image1);
                        } else if (position == 1) {
                            imageView2.setImageResource(R.mipmap.image2);
                        } else if (position == 2) {
                            imageView2.setImageResource(R.mipmap.image3);
                        }
                        viewPager.setScroll(true);
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        if (position == 0) {
                            imageView1.setImageResource(R.mipmap.image1);
                        } else if (position == 1) {
                            imageView1.setImageResource(R.mipmap.image2);
                        } else if (position == 2) {
                            imageView1.setImageResource(R.mipmap.image3);
                        }
                        imageView1.clearAnimation();
                        viewPager.setScroll(false);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });
                imageView1.setAnimation(animation);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }
}

為了可以更好的看出頁面的變化,我這里用textView來表示頁面,然后就是viewPager的adapter,相信這沒什么難度,我們來重點看看addOnPageChangeListener方法

這個方法相信大家都知道,就是viewPager的滑動監聽方法,關于這個方法的使用這里不做過多的介紹,不懂的可以去網上看看,我們在onPageSelected方法中引用我們剛剛的動畫,并且對它進行監聽,不難理解這里的代碼,我們在動畫之前,根據不同的頁面來設置imageView2的背景圖片,然后再動畫結束之后,設置了imageView1的圖片,那么,當我們滑動之后,我們imageView1進行動畫過渡,當透明度變化了,就可以達到了一種從有到無的假像效果,然后動畫結束了,我們就把它清除掉

細心的你可能已經看到了,我們在動開始和結束都有一個viewPager.setScroll()的方法,從方法名字我們不難看出,它決定了viewPager是否可以滑動,想想為什么需要它?因為,如果我們設置了動畫過渡時間是比較長,動畫沒有完成的時候,我們再去切換viewPager,那么就問題來了,動畫效果就沒有了,所以,我們需要在動畫開始的時候,禁止viewPager的滑動,結束了再設置它可以滑動,下面我們就來看看viewPager的代碼

package com.example.administrator.myviewpager;


import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class MyViewPager extends ViewPager {
    private boolean scroll = true;

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScroll(boolean scroll) {
        this.scroll = scroll;
    }

    @Override
    public void scrollTo(int x, int y) {
        super.scrollTo(x, y);
    }

    @Override
    public boolean onTouchEvent(MotionEvent arg0) {
        /*return false;//super.onTouchEvent(arg0);*/
        if (scroll)
            return false;
        else
            return super.onTouchEvent(arg0);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if (scroll)
            return false;
        else
            return super.onInterceptTouchEvent(arg0);
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, smoothScroll);
    }

    @Override
    public void setCurrentItem(int item) {
        super.setCurrentItem(item);
    }
}

代碼很簡單,我們繼承viewPager來重新設置它的事件分發,如果是true,我們就返回false,否則就讓它滑動

代碼已經上傳到GitHub,有興趣的可以下載來看看
https://github.com/ReturnYhh/MyViewPager

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,582評論 25 707
  • 一 從我記事起,后院就一直有一棵棗樹。 直到我上大一時,父親想將后院整頓下,后門口去后院的兩米內的范圍內鋪上水泥。...
    老更阿閱讀 629評論 1 8
  • 這幾天繪畫群里有個原畫小伙伴頻繁曬他的寵物們,有蜘蛛、蜥蜴、蛇。看著那藍色的蜘蛛巨大的身形,長長的毛茸茸的腿;還...
    彎彎一尾魚閱讀 224評論 0 3
  • 在熊毅老師的專欄里有一期講《蠅王》 我聽后很有感觸,不禁把電影也看了。在我看完電影后,它給了我另一個角度看世界。這...
    在路上_01fd閱讀 527評論 0 0
  • 能沉默就不要說話,能說話就不要識字,能識字就不要作書,能作書就不要從政,能從政就不要經商,能經商就不要成家,能成家...
    坐令鼻息吹虹霓閱讀 145評論 0 1