1. 程式人生 > >【Android實戰】用ViewPager偏移看到下一頁部分內容

【Android實戰】用ViewPager偏移看到下一頁部分內容

機頂盒專案有個需求,在TV選項下,要求第一頁顯示節目時,能看到第二頁部分內容(也就是圖中最右邊有黑色遮罩層的那些是第二頁的內容):

這裡寫圖片描述

當向右翻頁時,第二頁的內容滑到最左邊,且第三頁的部分內容顯示在最右邊。

這裡寫圖片描述

這個專案我是用ViewPager實現滑頁的,現在來針對上面的需求進行講解如何實現。

1.準備工作

為此我新建了個簡單的專案,用一個ViewPager包裹4個View,每個View給它一個不一樣的背景色,並給ViewPager加上介面卡(Adapter)。

準備工作就做好了(以下基礎程式碼可跳過)

public void init() {
        ViewPager viewPager = (ViewPager) findViewById(R.id
.viewpager); View v1 = new View(this); View v2 = new View(this); View v3 = new View(this); View v4 = new View(this); v1.setBackgroundColor(Color.parseColor("#aaabcdef")); v2.setBackgroundColor(Color.parseColor("#aa000a00")); v3.setBackgroundColor(Color.parseColor
("#aaabc000")); v4.setBackgroundColor(Color.parseColor("#aa000000")); List<View> views = new ArrayList<View>(); views.add(v1); views.add(v2); views.add(v3); views.add(v4); viewPager.setAdapter(new AZPagerAdapter(views)); }

AZPagerAdapter的實現是比較常規的優化方法:“顯示”就把View載入到父控制元件,“不顯示”就從父控制元件中移除。

注:這裡用“顯示”和“不顯示”表述不太確切,因為ViewPager預設會多載入前一頁(-1頁)和後一頁(1頁)作為快取頁,快取頁沒有顯示時也會載入到父控制元件且不會被移除,當快取頁移到-2頁或2頁時才會被移除。

public class AZPagerAdapter extends PagerAdapter {

    protected List<View> views;

    public AZPagerAdapter(List<View> viewList) {
        views = viewList;
    }
    @Override
    public int getCount() {
        return views.size();
    }

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

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(views.get(position));
        return views.get(position);
    }
}

現在的效果:

這裡寫圖片描述

2.用PageTransformer來改變ViewPager的切換動畫

ViewPager有個方法叫做:

setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) 用於設定ViewPager切換時的動畫效果。

官方實現圖例:

這裡寫圖片描述

這裡我們只要自定義一個PageTransformer來實現我們需要的動畫偏移效果就好了!

public class ScrollOffsetTransformer implements PageTransformer {
    /**
     * position引數指明給定頁面相對於螢幕中心的位置。它是一個動態屬性,會隨著頁面的滾動而改變。
     * 當一個頁面(page)填充整個螢幕時,positoin值為0;
     * 當一個頁面(page)剛剛離開螢幕右(左)側時,position值為1(-1);
     * 當兩個頁面分別滾動到一半時,其中一個頁面是-0.5,另一個頁面是0.5。
     * 基於螢幕上頁面的位置,通過諸如setAlpha()、setTranslationX()或setScaleY()方法來設定頁面的屬性,建立自定義的滑動動畫。
     */
    @Override
    public void transformPage(View page, float position) {
        if (position > 0) {
            //右側的快取頁往左偏移100
            page.setTranslationX(-100 * position);
        }
    }
}

然後在init()方法中最後加上

    viewPager.setPageTransformer(true, new ScrollOffsetTransformer());

看下效果:

這裡寫圖片描述

已經可以看到後面一頁內容的會偏移到前面一頁來(背景色都用了半透明可以看到有疊加部分)!

不過有個問題,就是翻頁(1頁到0位置)過程中,原本處於2頁的view要等到1頁完全到0位置後才會突然顯示(載入)出來(不是逐漸增加偏移量出來的)。這個原因其實就是剛剛講Adapter的時候說的,ViewPager預設快取3頁(前頁【-1頁】,當前頁【0頁】,後頁【1頁】),而2頁要等到1頁到0位置後才會開始載入,(1頁到0位置後變為0頁,原來的0頁變為-1頁,原來的-1頁被銷燬)。

3.通過setOffscreenPageLimit(int limit)來改變快取頁數

解決上面遺留的問題也非常簡單,就是改變ViewPager的預設快取頁數,使得它多快取一頁(2頁)。

ViewPager有個方法叫做:

setOffscreenPageLimit(int limit) 用於設定ViewPager兩邊(左邊和右邊)各快取的頁數,預設是1,即左邊和右邊各快取1頁。

init()方法最後再加上一句:

    //左右各多載入2頁(預設1頁)
    viewPager.setOffscreenPageLimit(2);

看下最後效果:

這裡寫圖片描述
大功告成!現在就平滑多了!

4.彩蛋

把ScrollOffsetTransformer裡面稍微改一下,去掉條件判斷後

public class ScrollOffsetTransformer implements PageTransformer {
    @Override
    public void transformPage(View page, float position) {
       // if (position > 0) {
            page.setTranslationX(-100 * position);
       // }
    }
}

前後都偏移啦!可以開發腦洞想一下用在有趣的地方!


這裡寫圖片描述

如果你有任何問題,歡迎留言告訴我!~

相關推薦

Android實戰ViewPager偏移看到部分內容

機頂盒專案有個需求,在TV選項下,要求第一頁顯示節目時,能看到第二頁部分內容(也就是圖中最右邊有黑色遮罩層的那些是第二頁的內容): 當向右翻頁時,第二頁的內容滑到最左邊,且第三頁的部分內容顯示在最右邊。 這個專案我是用ViewPager實現滑頁的

Python實戰Scrapyd把Scrapy爬蟲步部署到騰訊雲

將我們的爬蟲部署到騰訊雲伺服器上面。廢話不多說,我們就來實戰操作吧。 這裡選擇什麼雲服務都是可以的,阿里雲,AWS,騰訊雲,其他雲都是沒有問題的。部署方法基本一樣,這裡為了方便,所以筆者選擇了騰訊雲來做講解。 既然我們選擇了騰訊雲,首先去騰訊雲的官網,註冊登入一下。 點選複製https:

keras實戰Inceptionv3實現五種花的分類

一、資料集準備 訓練資料花朵圖片下載:地址 圖片下載好後劃分資料集,分為訓練集和驗證集,訓練集每類圖片500張,驗證集每類圖片100張。 這是我資料集的樹圖: 二、訓練模型 環境:Ubuntu,Anaconda2,python2.7,tensorflow

TensorFlow實戰TensorFlow實現簡單的卷積神經網路

#本次將練習實現一個簡單的卷積神經網路,使用的資料集依然是MNIST, #預期可以達到99.2%左右的準確性 #使用兩個卷積層加上一個全連線蹭構建一個簡單但是非常具有代表性的卷積神經網路 #載入MNIST資料集,並且建立預設的Interactive Sessio

Android實戰播放assets或者raw資料夾的視訊檔案

(1)assets資料夾下 AssetFileDescriptor afd = getAssets().openFd("guide_video.mp4");              mediaPlayer.setDataSource(afd.getFileDescript

Android實戰圖片選取、拍攝、裁剪、上傳

圖片上傳 效果圖展示 圖片上傳前的準備 帶圓角的方形圖片 使用的第三方控制元件,主要關注如下一些檔案 RoundedDrawable RoundedImageView RoundedTrans

Android實戰json檔案讀取並將資料寫入檔案

package com.json.ss; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStrea

Android實戰RecyclerView實現水平可滾動gridview

先看一下實現的效果圖(CSDN上傳gif圖限制在2M,所以只能通過壓縮圖片寬高和幀數來降低圖片大小,結果導致圖片解析度變低),不過還好可以看清 如果有朋友想知道如何錄製手機螢幕,然後將錄製的video再轉換成gif動圖,請參考下面這篇部落格(Android手機螢幕錄製並轉換

Android實戰----Android Retrofit2.1.0設定編碼格式GBK

設定介面如下: public interface IHttpService { /** * 獲取userId * @param params * @return

Android實戰Android中處理崩潰異常

public class MainActivity extends ActionBarActivity { public CrashApplication application; @Override protected void onCreate(Bundle

Android實戰----開篇(附Android開發常用的開源框架)

終於還是要進行Android實戰開篇系列了,年初就說過要進行這個系列專題。Android是一個很大的話題,作為非資深Android開發工程師(只是兩年的Android系統開發及兩年app開發經驗而已),這裡只是將Android開發所需的基本只是及開發中所遇到的問題進行陳述,

Android實戰----Android Retrofit2.1.0直接傳送Json字串到伺服器

可以用@body註解(將資料新增到requestbody中)、設定retrofit requestbody的編碼格式為json一、介面類public interface IHttpService { /** * * @param params

Android體驗從使用者角度Android手機/應用應該要這樣:

  入手HTC HERO已經半年,雖然自己也是計算機專業的,但是對這個手機,我還是儘量的希望能夠以一個普通的使用者角度來體驗的,所以一直都沒有去了解android開發方面的知識。不過,在使用的過程中,還是免不了麻煩不得不瞭解了很多本來就不應該是一個普通手機使用者要了解的知識。本文是Google 暑期大學生部

TensorFlow實戰Python實現自編碼器

程式碼: import numpy as np import sklearn.preprocessing as prep import tensorflow as tf from tensorflow.examples.tutorials.mnist impor

Android實戰HorizontalScrollView實現可滑動GridView

首先申明一下:該種方法存在問題,但是不要灰心,因為這個問題才催生了接下來的更優方案,請往下看 先說一下之前的解決方案吧 佈局檔案 <HorizontalScrollView android:id="@+id/talent_label_view"

Android實戰沉浸式狀態列實現(上)

傳統的手機狀態列是呈現出黑色條狀的,有的和手機主介面有很明顯的區別。這樣就在一定程度上犧牲了視覺寬度,介面面積變小。 沉浸模式的狀態列和主介面完全融為了一體,在設計上有不同的視覺感受。 我們先上兩張圖,很容易看出區別:        Android在4.4的時候增加了透

Android實戰----從Retrofit原始碼分析到Java網路程式設計以及HTTP權威指南想到的

一、簡介        接上一篇【Android實戰】----基於Retrofit實現多圖片/檔案、圖文上傳 中曾說非常想搞明白為什麼Retrofit那麼屌。最近也看了一些其原始碼分析的文章以及親自查看了原始碼,發現其對Java網路程式設計及HTTP權威指南有了一個很好的詮釋

Android筆記Intent在多個Activity之間傳遞引數

一、向下一個活動傳遞資料 前面我們在介紹Intent的時候有說過,我們可以利用Intent在不同元件之間傳遞資料,接下來這篇文章就是記錄如何利用Intent在不同Activity之間傳遞簡單資料、傳遞資料包、傳遞值物件以及返回資料給上一個活動的

Android 動畫View Animation詳解(

安卓平臺目前提供了兩大類動畫,在Android 3.0之前,一大類是View Animation,包括Tween animation(補間動畫),Frame animation(幀動畫),在android3.0中又引入了一個新的動畫系統:property ani

Android-PullToRefresh 上拉重新整理、拉載入 使用詳解

轉載自:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:【張鴻洋的部落格】 1、ListView下拉重新整理快速入門 pull-to-refresh對ListView進行了