Android中使用ViewPager實現屏幕頁面切換和頁面輪播效果

来源:http://www.cnblogs.com/panhouye/archive/2016/12/01/6123950.html
-Advertisement-
Play Games

之前關於如何實現屏幕頁面切換,寫過一篇博文《Android中使用ViewFlipper實現屏幕切換》,相比ViewFlipper,ViewPager更適用複雜的視圖切換,而且Viewpager有自己的adapter,這也讓其適應複雜對象,實現數據的動態載入。 ViewPager是谷歌官方給我們提供的 ...


之前關於如何實現屏幕頁面切換,寫過一篇博文《Android中使用ViewFlipper實現屏幕切換》,相比ViewFlipper,ViewPager更適用複雜的視圖切換,而且Viewpager有自己的adapter,這也讓其適應複雜對象,實現數據的動態載入。

ViewPager是谷歌官方給我們提供的一個相容低版本安卓設備的軟體包,裡面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一,利用它,我們可以做很多事情,從最簡單的導航,到頁面菜單等等。

下麵我們就展示下ViewPager可以實現的兩種簡單效果:

第一種:屏幕的頁面的切換(與ViewFlipper的實現效果類似)

實現效果如下(4張視圖(layout)):

第一步:在layout佈局文件裡加入主佈局文件viewpager_layout.xml

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5     <android.support.v4.view.ViewPager
 6         android:layout_width="match_parent"
 7         android:layout_height="match_parent"
 8         android:layout_gravity="center"
 9         android:gravity="center"
10         android:id="@+id/vp">
11         <android.support.v4.view.PagerTabStrip
12             android:layout_width="match_parent"
13             android:layout_height="wrap_content"
14             android:id="@+id/tap">
15         </android.support.v4.view.PagerTabStrip>
16     </android.support.v4.view.ViewPager>
17 </LinearLayout>

 

註意事項:    

<1、這裡ViewPager和PagerTabStrip都要把包名寫全了,不然會ClassNotFound

<2、API中說:在佈局xml把PagerTabStrip當做ViewPager的一個子標簽來用,不能拿出來,不然還是會報錯   

<3、在PagerTabStrip標簽中可以用屬性android:layout_gravity=TOP|BOTTOM來指定title的位置

<4、如果要顯示出PagerTabStrip某一頁的title,需要在ViewPager的adapter中實現getPageTitle(int)

第二步:在layout中建立要展示切換的視圖文件(示例中共四個layout1/2/3/4.xml,這裡寫一個典型):

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     android:orientation="vertical" android:layout_width="match_parent"
 5     android:layout_height="match_parent">
 6     <ImageView
 7         android:layout_width="match_parent"
 8         android:layout_height="match_parent"
 9         android:src="@mipmap/a1"
10         android:scaleType="centerCrop"
11         android:id="@+id/iv1" />
12 </LinearLayout>

第三步:Java中Activity的實現代碼ViewPagerDemo.java(這裡未設置pagerTabStrip的屬性):

在Activity里實例化ViewPager組件,並設置它的Adapter(就是PagerAdapter,方法與ListView一樣的)

實現一個PagerAdapter,覆蓋以下方法:

instantiateItem(ViewGroup, int)//用來實例化頁卡

destroyItem(ViewGroup, int, Object)//刪除頁卡

getCount() //返回頁卡的數量

isViewFromObject(View, Object)//判斷兩個對象是否相等

getPageTitle(int position)//設置標簽顯示的標題

設置指示標簽的屬性

pagerTabStrip.setTabIndicatorColor();//指示器的顏色

pagerTabStrip.setBackgroundColor();//背影色

pagerTabStrip.setTextColor(Color.WHITE);//字體顏色

 1 import android.os.Bundle;
 2 import android.support.annotation.Nullable;
 3 import android.support.v4.view.PagerAdapter;
 4 import android.support.v4.view.ViewPager;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 import java.util.ArrayList;
 9 /**
10  * Created by panchengjia on 2016/12/1.
11  */
12 public class ViewPagerDemo extends AppCompatActivity {
13     private ViewPager vp;
14     //聲明存儲ViewPager下子視圖的集合
15     ArrayList<View> views = new ArrayList<>();
16     //顯示效果中每個視圖的標題
17     String[] titles={"一號美女","二號美女","三號美女","四號美女"};
18     @Override
19     protected void onCreate(@Nullable Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.viewpager_layout);
22         vp= (ViewPager) findViewById(R.id.vp);
23         initView();//調用初始化視圖方法
24         vp.setAdapter(new MyAdapter());//設置適配器
25 }
26 //初始化視圖的方法(通過佈局填充器獲取用於滑動的視圖並存入對應的的集合)
27     private void initView() {
28         View v1 = getLayoutInflater().inflate(R.layout.layout1,null);
29         View v2 = getLayoutInflater().inflate(R.layout.layout2,null);
30         View v3 = getLayoutInflater().inflate(R.layout.layout3,null);
31         View v4 = getLayoutInflater().inflate(R.layout.layout4,null);
32         views.add(v1);
33         views.add(v2);
34         views.add(v3);
35         views.add(v4);
36     }
37     class MyAdapter extends PagerAdapter{
38         @Override
39         public int getCount() {
40             return views.size();
41         }
42         @Override
43         public boolean isViewFromObject(View view, Object object) {
44             return view==object;
45         }
46         //重寫銷毀滑動視圖佈局(將子視圖移出視圖存儲集合(ViewGroup))
47         @Override
48         public void destroyItem(ViewGroup container, int position, Object object) {
49             container.removeView(views.get(position));
50         }
51         //重寫初始化滑動視圖佈局(從視圖集合中取出對應視圖,添加到ViewGroup)
52         @Override
53         public Object instantiateItem(ViewGroup container, int position) {
54             View v =views.get(position);
55             container.addView(v);
56             return v;
57         }
58         @Override
59         public CharSequence getPageTitle(int position) {
60             return titles[position];
61         }
62     }
63 }

第二種:頁面輪播效果視圖(程式首次啟動的引導頁實現)

實現效果如下(3張視圖滑動引導):

開始代碼前註釋:1、本次未實現迴圈輪播效果;2、導航原點資源圖片註解:default_holo為未選中狀態,touched_holo為選中後實心狀態。(也可自己用Shape繪製)

 

第一步:在layout佈局文件裡加入主佈局文件viewpager_layout.xml

 

主佈局為FrameLayout,在ViewPager(這裡因為存在導航原點,不設置PagerTabStrip)上嵌套包含3個導航原點(由滑動視圖數量決定)的linearLayout佈局(本次設置該佈局位於底部):

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <FrameLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:id="@+id/activity_main"
 6     android:layout_width="match_parent"
 7     android:layout_height="match_parent"
 8     tools:context="com.example.administrator.myapplication11.MainActivity">
 9     <android.support.v4.view.ViewPager
10         android:layout_width="match_parent"
11         android:layout_height="match_parent"
12         android:id="@+id/vp">
13     </android.support.v4.view.ViewPager>
14     <LinearLayout
15         android:id="@+id/point_layout"
16         android:layout_width="match_parent"
17         android:layout_height="wrap_content"
18         android:layout_gravity="bottom"
19         android:orientation="horizontal">
20         <ImageView
21             android:layout_width="0dp"
22             android:layout_height="wrap_content"
23             android:layout_weight="1"
24             android:src="@mipmap/default_holo"/>
25         <ImageView
26             android:layout_width="0dp"
27             android:layout_height="wrap_content"
28             android:layout_weight="1"
29             android:src="@mipmap/default_holo" />
30         <ImageView
31             android:layout_width="0dp"
32             android:layout_height="wrap_content"
33             android:layout_weight="1"
34             android:src="@mipmap/default_holo"
35             android:id="@+id/imageView" />
36     </LinearLayout>
37 </FrameLayout>

 

第二步:Layout中用於滑動切換的視圖(示例中共三個layout1/2/3.xml,這裡寫一個典型)與第一種相同

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5     <ImageView
 6         android:layout_width="match_parent"
 7         android:layout_height="match_parent"
 8         android:scaleType="centerCrop"
 9         android:src="@mipmap/genie"/>
10 </LinearLayout>

 

第三步:Java中Activity的實現代碼MainActivity.java

 

通過實現OnPageChangeListener介面實現在視圖切換時導航原點狀態的變化),其中關於OnPageChangeListener中方法的詳細解釋,請參考博文

 

ViewPager的setOnPageChangeListener方法詳解這裡不做贅述:

 

 1 import android.support.v4.view.PagerAdapter;
 2 import android.support.v4.view.ViewPager;
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.ImageView;
 8 import android.widget.LinearLayout;
 9 import java.util.ArrayList;
10 /**
11  * Created by panchengjia on 2016/11/30.
12  */
13 public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{
14     private ViewPager vp;
15     private LinearLayout point_layout;
16     ArrayList<View> views =new ArrayList<>();
17     //實例化存儲imageView(導航原點)的集合
18     ArrayList<ImageView> imageViews = new ArrayList<>();
19     int currImage;//記錄當前頁(導航原點)
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24         vp= (ViewPager) findViewById(R.id.vp);
25         initView();//調用初始化視圖方法
26         initPoint();//調用初始化導航原點的方法
27         vp.addOnPageChangeListener(this);
28         vp.setAdapter(new MyAdapter());
29     }
30     /*將point_layout中包含的imageView(導航原點)添加到imageViewS集合中
31      *並設置layout1(第一視圖)的導航原點(對應集合0下標)的圖片
32      * 為touched_holo(觸摸狀態的圖片)
33      */
34     private void initPoint() {
35         point_layout= (LinearLayout) findViewById(R.id.point_layout);
36         int counnt = point_layout.getChildCount();//獲取point數量
37         for (int i=0;i<counnt;i++){
38             imageViews.add((ImageView) point_layout.getChildAt(i));
39         }
40         imageViews.get(0).setImageResource(R.mipmap.touched_holo);
41     }
42     private void initView() {
43         View v1=getLayoutInflater().inflate(R.layout.layout1,null);
44         View v2=getLayoutInflater().inflate(R.layout.layout2,null);
45         View v3=getLayoutInflater().inflate(R.layout.layout3,null);
46         views.add(v1);
47         views.add(v2);
48         views.add(v3);
49     }
50     //OnPageChangeListener的方法,這裡不做具體實現
51     @Override
52     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
53 
54     }
55     //設置滑動到對應位置的視圖後,導航原點的不同狀態(圖片)
56     @Override
57 public void onPageSelected(int position) {
58         ImageView preView = imageViews.get(currImage);
59         preView.setImageResource(R.mipmap.default_holo);
60         ImageView currView = imageViews.get(position);
61         currView.setImageResource(R.mipmap.touched_holo);
62         currImage = position;
63     }
64     //OnPageChangeListener的方法,這裡不做具體實現
65     @Override
66     public void onPageScrollStateChanged(int state) {
67 
68     }
69     class MyAdapter extends PagerAdapter {
70         @Override
71         public int getCount() {
72             return views.size();
73         }
74         @Override
75         public boolean isViewFromObject(View view, Object object) {
76             return view==object;
77         }
78         @Override
79         public void destroyItem(ViewGroup container, int position, Object object) {
80             container.removeView(views.get(position));
81         }
82         @Override
83         public Object instantiateItem(ViewGroup container, int position) {
84             View v = views.get(position);
85             container.addView(v);
86             return v;
87         }
88     }
89 }

 

至此,本次的ViewPager實現示例所需代碼已完成,當然這隻是ViewPager最簡單的功能,後續還會更新一些ViewPager的高級用法,歡迎小伙伴們繼續支持。

當然篇幅所限,這隻是ViewPager最最簡單的功能,
作者: 去吧皮卡丘
鏈接:http://www.imooc.com/article/2580
來源:慕課網 當然篇幅所限,這隻是ViewPager最最簡單的功能,
作者: 去吧皮卡丘
鏈接:http://www.imooc.com/article/2580
來源:慕課網當然這隻是ViewPager最簡單的功能,後續還會更新一些ViewPager的高級用法,歡迎小伙伴們繼續支持。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、BFC與IFC 1.1、BFC與IFC概要 BFC(Block Formatting Context)即“塊級格式化上下文”, IFC(Inline Formatting Context)即行內格式化上下文。常規流(也稱標準流、普通流)是一個文檔在被顯示時最常見的佈局形態。一個框在常規流中必須屬 ...
  • 一、條紋背景 利用background為linear-gradient函數實現,linear-gradient取值如下: <angle>:角度,漸變的方向 to left right top bottom color:指定顏色 color-stop:指定漸變的起止顏色 length:用長度值指定起止 ...
  • 開篇語 作為一個前端的菜鳥,總是在面試的時候被問及一些優化的問題,說實話,回答的時候總是心虛,因為確實沒有真真正正做過優化對比,也不知道從何說起,今天在網上收集一些例子加以總結,日後若是開發用到,也能一一對照,把自己開發的網站做到最優化! 網站優化 一個網站的優化,前端只是很小的一部分。大到系統架構 ...
  • // <![CDATA[ function init() { var $$ = go.GraphObject.make; myDiagram = $$(go.Diagram, "myDiagramDiv", { grid: $$(go.Panel, "Grid", $$(go.Shape, "Lin ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #box { border: 2px solid deeppink; width: 1000px; margin: ...
  • /*socket.io是一個基於 node.js 的項目,其主要作用是將WebScoket 協議應用到所有的瀏覽器。該模塊主要應用於實時的長連接 多請求的項目中,例如線上聯網游戲中、實時聊天、實施股票查看、二維碼掃描登錄等。 安裝配置和 npm 一樣: npm intall scoket.io 安裝 ...
  • 正常情況下直接寫這段代碼不寫!important,如果項目不能生效,需要加!important。 ...
  • 這是一段用jquery實現全選的代碼,主要思路如下: 1.所有的覆選框都有單擊事件,所有效果都是在單擊事件下實現的 2.全選覆選框所實現的功能與其他覆選選項實現的功能不同,所有在單擊事件內做一個判斷,是否是全選覆選框的單擊事件 3.如果是,則執行判斷全選覆選框是否選中,如果當前狀態為選中,那麼點擊後 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...