最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ViewPager實現(xiàn)動畫切換效果

 更新時間:2021年08月27日 10:40:36   作者:yuminfeng728  
這篇文章主要為大家詳細介紹了Android ViewPager實現(xiàn)動畫切換效果的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

概述

ViewPager是Android開發(fā)中使用場景非常頻繁的控件,單一的動畫效果切換已經(jīng)越來越不能滿足追求個性化的應用中。而ViewPager自身也帶有一個接口來處理頁面間的動畫切換,那就是setPageTransformer。下面我們通過代碼來學習動畫效果的切換。

實現(xiàn)簡單動畫切換

代碼如下:

1.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/view_pager_box"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal" >

  <android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_margin="10dp"
    android:layout_width="wrap_content"
    android:layout_height="120dp" />

</LinearLayout>

MainActivity 中相關 java 代碼

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class MainActivity extends Activity {

  private ViewPager viewPager;
  private int[] imageIds = new int[]{R.drawable.pic1,R.drawable.pic2,R.drawable.pic3,R.drawable.pic4,R.drawable.pic5,};
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    viewPager = (ViewPager) findViewById(R.id.viewpager);

    viewPager.setOffscreenPageLimit(3); //設置內(nèi)存中預加載頁面數(shù)

    viewPager.setPageTransformer(true, new DepthPageTransformer()); //設置頁面切換過渡動畫

    viewPager.setAdapter(new PagerAdapter() {

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

      @Override
      public int getCount() {
        return imageIds.length;
      }

      @Override
      public Object instantiateItem(ViewGroup container, int position) {
        ImageView imageView = new ImageView(MainActivity.this);
        imageView.setScaleType(ScaleType.CENTER_CROP);
        imageView.setImageResource(imageIds[position]);
        imageView.setTag(position); //設置標記
        container.addView(imageView);
        return imageView;
      }

      @Override
      public void destroyItem(ViewGroup container, int position,
          Object object) {
        container.removeView((View)object);
      }
    });
  }
}

3.控制切換動畫的類DepthPageTransformer的代碼

import android.support.v4.view.ViewPager;
import android.view.View;

public class DepthPageTransformer implements ViewPager.PageTransformer {

  private static final float MIN_SCALE = 0.75f;

  @Override
  public void transformPage(View view, float position) {

    android.util.Log.i("yuminfeng", "====view:" + view.getTag()  + ",position:" + position);

    int pageWidth = view.getWidth();

    if (position < -1) { // [-Infinity,-1) 
      // This page is way off-screen to the left.
      view.setAlpha(0);

    } else if (position <= 0) { // [-1,0]
      // Use the default slide transition when moving to the left page
      view.setAlpha(1);
      view.setTranslationX(0);
      view.setScaleX(1);
      view.setScaleY(1);

    } else if (position <= 1) { // (0,1]
      // Fade the page out.
      view.setAlpha(1 - position);

      // Counteract the default slide transition
      view.setTranslationX(pageWidth * -position);

      // Scale the page down (between MIN_SCALE and 1)
      float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
      view.setScaleX(scaleFactor);
      view.setScaleY(scaleFactor);

    } else { // (1,+Infinity]
      // This page is way off-screen to the right.
      view.setAlpha(0);
    }
  }

}

上面的代碼十分簡單,僅僅只是ViewPager的初始化配置,然后通過setPageTransformer設置頁面切換動畫。有一個細節(jié)還需要注意,設置setOffscreenPageLimit(3),表示內(nèi)存中預加載頁面為3,這三個頁面是不可見的。如果加上當前顯示的頁面,總共初始化了4個頁面。不設置的話,系統(tǒng)使用默認的預加載的頁數(shù)為1。
第一次啟動應用后,我們通過在DepthPageTransformer類中記錄的日志可以看到,如下:

總共初始化了4個view,其中當前對用戶可見view的位置為0,其余都是不可見。所以當position=0時,表示當前的頁面。

我們繼續(xù)操作并向左滑動一頁,日志如下:

由此可以看到,之前的view的位置變?yōu)?1,它的右邊的view位置為0,變成可見。
繼續(xù)滑動至最后一頁后:

我們看到最后一頁的view已經(jīng)展現(xiàn)在用戶面前,位置為0,而其他頁面位置都是為負,表示所有頁面都滑至左邊。這時我們注意的話,可以發(fā)現(xiàn)view:0,不在日志信息中,難道它沒有被初始化?其實它已經(jīng)被系統(tǒng)回收了,通過Adapter中destroyItem方法。因為我們之前設置ViewPager中預加載的頁數(shù)限制為3,系統(tǒng)中最多的存在4個view,所以view:0被回收。

從上面的分析我們可以知道,當view的position處于[-1,1]時,該view能夠被用戶所見,其他位置便不可見。而PageTransformer的接口中,真是利用了這個特點,根據(jù)view的position來對它進行縮放,旋轉(zhuǎn)等動畫操作。我們繼續(xù)分析DepthPageTransformer類:
當 position < -1,即[-Infinity,-1) 時:
view處于左邊不可見中,這里view.setAlpha(0); 表示完全透明。
當-1 <= position <= 0 時,該view處于可見區(qū)域,:
1.如果view向左滑動,表示當前view逐漸滑出可見區(qū)域
2.如果view向右滑動,表示左邊的view逐漸劃入當前可見區(qū)域。
view.setAlpha(1),設置透明度,表示完全不透明。
view.setTranslationX(0),表示設置view相對于左側(cè)位置的水平位置,距離左邊的距離。
view.setScaleX(1)和view.setScaleY(1),表示view的x,y軸不進行縮放。
當0 < position <= 1 時,該view處于可見區(qū)域:
1.如果view向右滑動,表示當前view逐漸滑出可見區(qū)域。
2.如果view向左滑動,表示右邊的view逐漸滑入可見區(qū)域。
view.setAlpha(1 - position),根據(jù)view滑動的位置,設置view的透明度。position 越接近于0,表明view面對用戶顯示的越多,所以就越不透明。
view.setTranslationX(pageWidth * -position),根據(jù)view滑動的位置,設置view相對于左側(cè)位置的水平位置,當position = 0 時,view完全顯示,這時相對左邊為0,當 position = 1 時,view完全不可見,這時相對左邊為view的寬度。
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
根據(jù)view的position,設置view的縮放大小。當 position,越大時,越遠離用戶界面,于是越不可見。
當1< position 時,即(1,+Infinity]時:
view.setAlpha(0),設置完全透明不可見。

上述代碼執(zhí)行效果如下:

我們還可以定制其他的動畫效果,實現(xiàn)原理和上面一樣,這里就不一一列出來了。

實現(xiàn)廣告輪播效果圖

如圖:

實現(xiàn)上面的效果圖,只需要對上面的代碼進行一些修改即可:

想要在屏幕上出現(xiàn)多個頁面,我們需要設置屬性:android:clipChildren=”false”,該屬性的意思是在View進行繪制的時候,不去裁切它們的顯示范圍,即不限制view的顯示范圍。
我們修改布局文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/view_pager_box"
  android:layout_width="match_parent"
  android:layout_height="160dp"
  android:gravity="center"
  android:clipChildren="false"
  android:orientation="horizontal" >

  <android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_margin="30dp"
    android:layout_height="120dp" />

</LinearLayout>

在ViewPager的外面控件中設置了android:clipChildren=”false”,然后設置viewpager中android:layout_margin屬性,留出間距,方便顯示左右兩邊的圖片。后面我們還要java代碼設置viewpager的屬性,如:
viewPager.setPageMargin(40); //設置頁面間間距
這樣可以讓頁面之間存在一定的間隔。最后,我們通過setPageTransformer方法設置自己定義的動畫即可,與上面一致。
該效果的動畫類代碼:

import android.support.v4.view.ViewPager;
import android.view.View;

public class AlphaScaleTransformer implements ViewPager.PageTransformer {

  private static final float DEFAULT_MIN_ALPHA = 0.5f;
  private float mMinAlpha = DEFAULT_MIN_ALPHA;
  private static final float DEFAULT_MIN_SCALE = 0.85f;
  private float mMinScale = DEFAULT_MIN_SCALE;
  public static final float DEFAULT_CENTER = 0.5f;

  @Override
  public void transformPage(View view, float position) {
    int pageWidth = view.getWidth();
    int pageHeight = view.getHeight();

    view.setScaleX(0.999f);// hack
    view.setPivotY(pageHeight / 2);
    view.setPivotX(pageWidth / 2);

    if (position < -1) { // [-Infinity,-1)
      view.setAlpha(mMinAlpha);
      view.setScaleX(mMinScale);
      view.setScaleY(mMinScale);
      view.setPivotX(pageWidth);

    } else if (position <= 1) { // [-1,1]

      if (position < 0) // [0,-1]
      { // [1,min]
        float factor = mMinAlpha + (1 - mMinAlpha) * (1 + position);
        float scaleFactor = (1 + position) * (1 - mMinScale) + mMinScale;

        view.setAlpha(factor);
        view.setScaleX(scaleFactor);
        view.setScaleY(scaleFactor);
        view.setPivotX(pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position)));

      } else// [1,0]
      {
        // [min,1]
        float factor = mMinAlpha + (1 - mMinAlpha) * (1 - position);
        float scaleFactor = (1 - position) * (1 - mMinScale) + mMinScale;

        view.setAlpha(factor);
        view.setScaleX(scaleFactor);
        view.setScaleY(scaleFactor);
        view.setPivotX(pageWidth * ((1 - position) * DEFAULT_CENTER));

      }
    } else { // (1,+Infinity]
      view.setAlpha(mMinAlpha);
      view.setPivotX(0);
      view.setScaleX(mMinScale);
      view.setScaleY(mMinScale);
    }
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android系統(tǒng)添加自定義鼠標樣式通過按鍵切換實例詳解

    Android系統(tǒng)添加自定義鼠標樣式通過按鍵切換實例詳解

    在本篇文章里小編給大家整理的是關于Android系統(tǒng)添加自定義鼠標樣式通過按鍵切換實例詳解內(nèi)容,有需要的朋友們可以學習下。
    2019-11-11
  • Android中對RecyclerView Adapter封裝解析

    Android中對RecyclerView Adapter封裝解析

    本篇文章主要介紹了Android中對RecyclerView Adapter封裝解析。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 常見的8個Android內(nèi)存泄漏問題及解決方法

    常見的8個Android內(nèi)存泄漏問題及解決方法

    在Android開發(fā)中,內(nèi)存泄漏是一個常見的問題,這個問題可能會導致應用程序變慢、崩潰或者消耗大量的內(nèi)存,最終導致設備性能下降,本文就給大家總結(jié)一下最常見的8個Android內(nèi)存泄漏問題及解決方法,需要的朋友可以參考下
    2023-07-07
  • Android自定義ToolBar并實現(xiàn)沉浸式的方法

    Android自定義ToolBar并實現(xiàn)沉浸式的方法

    這篇文章主要給大家介紹了關于Android自定義ToolBar并實現(xiàn)沉浸式的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-05-05
  • android使用service和activity獲取屏幕尺寸的方法

    android使用service和activity獲取屏幕尺寸的方法

    這篇文章主要介紹了android使用service和activity獲取屏幕尺寸的方法,實例分析了基于service和activity兩種方法獲取屏幕尺寸的相關技巧,非常簡單實用,需要的朋友可以參考下
    2015-08-08
  • Android RecycleView添加head配置封裝的實例

    Android RecycleView添加head配置封裝的實例

    這篇文章主要介紹了Android RecycleView添加head配置封裝的實例的相關資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • Android使用SharedPreferences存儲數(shù)據(jù)的實現(xiàn)方法

    Android使用SharedPreferences存儲數(shù)據(jù)的實現(xiàn)方法

    這篇文章主要介紹了Android使用SharedPreferences存儲數(shù)據(jù)的實現(xiàn)方法,可實現(xiàn)針對短信的臨時保存功能,非常簡單實用,需要的朋友可以參考下
    2016-06-06
  • android之camera用法實例詳解

    android之camera用法實例詳解

    這篇文章主要介紹了android之camera用法,以實例形式較為詳細的分析了Android使用camera拍照的相關技巧與注意事項,需要的朋友可以參考下
    2015-09-09
  • Kotlin Thread線程與UI更新詳解

    Kotlin Thread線程與UI更新詳解

    本篇主要介紹Kotlin中Thread線程與UI更新,注意不是協(xié)程而是線程。Kotlin本身是支持線程的。同時協(xié)程也是運行在線程中的
    2022-12-12
  • Android中一種效果奇好的混音方法詳解

    Android中一種效果奇好的混音方法詳解

    這篇文章主要給大家介紹了關于在Android中一種效果奇好的混音方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03

最新評論

九龙县| 巴中市| 钟祥市| 虞城县| 德钦县| 武平县| 宁陵县| 南丹县| 黄龙县| 潼关县| 星子县| 大英县| 芮城县| 鄂温| 嘉黎县| 玛纳斯县| 射洪县| 建瓯市| 宜宾市| 九龙城区| 汨罗市| 蕲春县| 万源市| 万宁市| 乐业县| 若尔盖县| 巴楚县| 江阴市| 治多县| 临澧县| 临沧市| 咸丰县| 鹤岗市| 商水县| 额济纳旗| 鄂伦春自治旗| 杭锦后旗| 牙克石市| 蒙自县| 平武县| 大宁县|