封裝一個ViewPager真正的實現圖片無限循環滾動帶導航點

效果圖:


大家在寫項目的過程中常常會碰到須要實現Viewpager里面載入幾張圖片來循環自己主動輪播的效果,假設不封裝一下的話代碼分散在activity里面會顯得非常亂。并且也不利于我們下次復用,所以這里我把viewpager的相關代碼抽取出來放在了一個類里面,使用的時候僅僅須要new 這個對象就可以。

直接看代碼:

MyViewPager.java類:在activity中僅僅須要在初始化數據的時候增加MyViewPager myViewPager=new MyViewPager(this)這段代碼就ok。

package com.duora.bobge.duoradeliverly_version2.custom_view;import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;import com.duora.bobge.duoradeliverly_version2.R;
import com.duora.bobge.duoradeliverly_version2.adapter.EventPageAdapter;
import com.duora.bobge.duoradeliverly_version2.base.BaseConfig;
import com.duora.bobge.duoradeliverly_version2.listener.NavigationPageChangeListener;import java.util.ArrayList;/*** Created by bobge on 15/8/10.*/
public class MyViewPager {private Activity activity;private ViewPager viewPager;private LinearLayout mViewPoints;private ArrayList<View> pageViews;private ImageView imageView;/** 將小圓點的圖片用數組表示 */private ImageView[] imageViews;private Handler mHandler = new Handler() {@Overridepublic void dispatchMessage(Message msg) {switch (msg.what) {case BaseConfig.MSG_CHANGE_PHOTO:int index = viewPager.getCurrentItem();viewPager.setCurrentItem(index + 1);mHandler.sendEmptyMessageDelayed(BaseConfig.MSG_CHANGE_PHOTO,BaseConfig.PHOTO_CHANGE_TIME);break;}super.dispatchMessage(msg);}};public MyViewPager(Activity activity) {this.activity = activity;findViewById(activity);addData();initPoint();}private void addData() {pageViews = new ArrayList<View>();for (int i = 0; i < 5; i++) {ImageView imageView = new ImageView(activity);imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);//picasso載入圖片switch (i){case 0:imageView.setBackgroundResource(R.mipmap.a);break;case 1:imageView.setBackgroundResource(R.mipmap.b);break;case 2:imageView.setBackgroundResource(R.mipmap.c);break;case 3:imageView.setBackgroundResource(R.mipmap.e);break;case 4:imageView.setBackgroundResource(R.mipmap.f);break;}pageViews.add(imageView);}}private void findViewById(Activity activity) {this.viewPager= (ViewPager)activity.findViewById(R.id.viewPager_main);this.mViewPoints= (LinearLayout)activity.findViewById(R.id.viewGroup);}//創建viewpager的那幾個滑動的點private void initPoint() {// 創建imageviews數組,大小是要顯示的圖片的數量imageViews = new ImageView[pageViews.size()];// 加入小圓點的圖片for (int i = 0; i < pageViews.size(); i++) {imageView = new ImageView(activity);// 設置小圓點imageview的參數LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(20, 20);layoutParams.setMargins(5, 0, 5, 0);imageView.setLayoutParams(layoutParams);// 創建一個寬高均為20 的布局// 將小圓點layout加入到數組中imageViews[i] = imageView;// 默認選中的是第一張圖片,此時第一個小圓點是選中狀態,其它不是if (i == 0) {imageViews[i].setBackgroundResource(R.mipmap.face_float_icon_on);} else {imageViews[i].setBackgroundResource(R.mipmap.face_float_icon);}// 將imageviews加入到小圓點視圖組mViewPoints.addView(imageViews[i]);}// 設置viewpager的適配器和監聽事件Log.i("test", pageViews.size() + "====");viewPager.setAdapter(new EventPageAdapter(pageViews));viewPager.setOnPageChangeListener(new NavigationPageChangeListener(pageViews, imageViews));viewPager.setCurrentItem((pageViews.size()) * 50);if(pageViews.size()>1){mHandler.sendEmptyMessageDelayed(BaseConfig.MSG_CHANGE_PHOTO, BaseConfig.PHOTO_CHANGE_TIME);}}
}


它的滑動監聽和適配器:

NavigationPageChangeListener.java看命名應該就能知道這個類的作用了,不多說。

package com.duora.bobge.duoradeliverly_version2.listener;import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageView;import com.duora.bobge.duoradeliverly_version2.R;import java.util.ArrayList;/*** Created by bobge on 15/8/5.*/
//viewpager滑動監聽
public class NavigationPageChangeListener implements ViewPager.OnPageChangeListener {private ArrayList<View> pageViews;/** 將小圓點的圖片用數組表示 */private ImageView[] imageViews;public NavigationPageChangeListener(ArrayList<View> pageViews, ImageView[] imageViews) {this.pageViews=pageViews;this.imageViews=imageViews;}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int position) {//當頁面切換時設置導航點的狀態setPointStatus(position);}//設置導航點的狀態private void setPointStatus(int position) {position=position%pageViews.size();for (int i = 0; i < imageViews.length; i++) {imageViews[position].setBackgroundResource(R.mipmap.face_float_icon_on);// 不是當前選中的page。其小圓點設置為未選中的狀態if (position != i) {imageViews[i].setBackgroundResource(R.mipmap.face_float_icon);}}}}
EventPagerAdapter.java類是viewpager的適配器。instantiateItem方法做了一些處理。使事實上現無限循環。

package com.duora.bobge.duoradeliverly_version2.adapter;import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;import java.util.ArrayList;/*** Created by bobge on 15/7/30.*/
public class EventPageAdapter extends PagerAdapter {private ArrayList<View> pageViews;public EventPageAdapter(ArrayList<View> pageViews) {this.pageViews=pageViews;}// 銷毀position位置的界面@Overridepublic void destroyItem(View container, int position, Object object) {((ViewPager) container).removeView(pageViews.get(position%pageViews.size()));}// 獲取當前窗口界面數@Overridepublic int getCount() {return Integer.MAX_VALUE;}// 初始化position位置的界面@Overridepublic Object instantiateItem(View v, int position) {try{//((ViewPager) arg0).addView(list.get(arg1),0);((ViewPager) v).addView((View)pageViews.get(position%pageViews.size()),0);}catch (Exception e) {// TODO: handle exception}return pageViews.get(position%pageViews.size());}@Overridepublic boolean isViewFromObject(View v, Object arg1) {return v == arg1;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic int getItemPosition(Object object) {return super.getItemPosition(object);}}


布局:custom_viewpager.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!--帶導航點的viewpager布局--><android.support.v4.view.ViewPagerandroid:id="@+id/viewPager_main"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:id="@+id/viewGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="20dp"android:gravity="center_horizontal"android:orientation="horizontal" ></LinearLayout>
</RelativeLayout>

在activity的布局中僅僅須要導入上面那個布局就可以:

<include
    layout="@layout/custom_viewpager"
    android:id="@+id/myViewPager"
    android:layout_width="match_parent"
    android:layout_height="@dimen/viewpager_height"
    />

轉載于:https://www.cnblogs.com/blfbuaa/p/7053141.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252473.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252473.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252473.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

畢業論文頁眉頁腳頁碼插入

用word這么多年&#xff0c;第一次完整的操作了一遍頁眉頁腳頁碼的插入過程&#xff0c;其實三者都要要求奇偶頁不同 1.頁面布局-》右下角箭頭-》版式-》奇偶頁不同 因為文章不同的部分需要插入不同的頁眉頁腳頁碼&#xff0c;所以要在不同的部分插入分解符斷開它們的連接 2、…

巴黎市中心降下2019年第一場雪

當地時間1月22日&#xff0c;法國巴黎市中心降下2019年第一場雪&#xff0c;氣溫也隨之下降&#xff0c;街上的行人和車輛均有所減少。中新社記者 李洋 攝一對情侶在埃菲爾鐵塔前合影留念。無家可歸者在長椅上睡覺。游客在盧浮宮前拍照。

Echarts實現隱藏x軸,y軸,刻度線,網格

"yAxis": [{//就是一月份這個顯示為一個線段&#xff0c;而不是數軸那種一個點點"show" : true,"boundaryGap": true,"type": "category","name": "時間","data": ["1月", "2…

Ubuntu16.04 + Matlab2018+ desktop creation

https://blog.csdn.net/m0_37601622/article/details/82731879 https://blog.csdn.net/l18092482025/article/details/78906436 The second blog teaches you how to download a matlab.png when there is no matlab.png in /usr/share/applications/.

Atom插件主題推薦

注意事項 主題和插件這方面,比 Sublime Text 人性化多了..一些比較用心的作者增加了二度設置功能。 何為二度設置,就是不用手寫代碼修改配置文件&#xff0c;點點鼠標&#xff0c;填填輸入框就能生效&#xff0c;主題以 isotope-ui 這個做例子介紹,看圖&#xff1a; 進入二度設…

印尼發生洪災和山體滑坡 致多人死亡數千人撤離

當地時間1月23日&#xff0c;印尼南蘇拉威西省望加錫居民受洪水影像&#xff0c;用竹筏運送摩托車。近日&#xff0c;印尼南蘇拉威西省暴雨連連&#xff0c;造成洪災和山體滑坡。目前&#xff0c;暴雨引發的洪災和山體滑坡至少已造成8人死亡&#xff0c;數千人被迫撤離家園。。…

Django學習筆記第三篇--關于響應返回

一、返回簡單類型&#xff1a; 1 #1、返回簡單字符串 2 #from django.http import HttpResponse 3 return HttpResponse("return string") 4 #2、返回json 5 return HttpResponse(json.dumps(response_data),content_type"application/json") 二、返回文…

HTTP響應狀態碼

1XX:代表提示信息 2XX:代表成功信息 3XX:代表重定向 4XX:代表客戶端錯誤信息 5XX:代表服務器錯誤 信息 500:500 錯誤是服務器內部錯誤 ,而且是程序上錯誤 為多,可能是你的用戶權限的問題導致,或者是數據庫連接出現了錯誤. 501:服務器501服務器501錯誤是服務器是否具有請求功能.…

pycharm中無法import已經安裝的ros中的庫

使用pycharm寫python程序&#xff0c;無法import 已經安裝的ros包&#xff0c;并提示ImportError: No module named sensor_msgs.msg 解決方法如下 1. pycharm->file->settings->project:csvfile->project interpreter-> 點擊右側下三角選擇 show all 2. 在彈…

tcp/ip知識點的總結

知識點搜集于網絡&#xff0c;在加上自己的總結&#xff0c;還有很多不全&#xff0c;希望大家多提意見&#xff0c;共享學習&#xff01; 一、TCP/IP是什么&#xff1f; TCP/IP是一個協議族&#xff0c;而不是單獨的協議。包括arp、ip、icmp、tcp、udp、http、ftp等協議 二、T…

搜索引擎ElasticSearchV5.4.2系列一之ES介紹

相關博文&#xff1a; 搜索引擎ElasticSearchV5.4.2系列一之ES介紹 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2kibanaV5.4.2x-packV5.4.2安裝 搜索引擎ElasticSearchV5.4.2系列三之ES使用 Elasticsearch 是一個開源的搜索引擎&#xff0c;建立在一個全文搜索引擎…

[譯] 前端組件設計原則

原文地址&#xff1a;Front end component design principles 原文作者&#xff1a;Andrew Dinihan 文中示例代碼&#xff1a;傳送門 限于個人能力&#xff0c;如有錯漏之處&#xff0c;煩請不吝賜教。 前言 我在最近的工作中開始使用 Vue 進行開發&#xff0c;但是我在上一家公…

imu_utils標定imu問題解決

在編譯過程中遇到的一些問題可以參照這個女生的文章 https://blog.csdn.net/fang794735225/article/details/92804030 下面是imu_utils的主頁&#xff0c;可以下載代碼&#xff0c;也有使用步驟 https://github.com/gaowenliang/imu_utils 我下載了imu_utils主頁最后面提供…

術語-服務:PaaS

ylbtech-術語-服務&#xff1a;PaaSPaaS是Platform-as-a-Service的縮寫&#xff0c;意思是平臺即服務。 把服務器平臺作為一種服務提供的商業模式。通過網絡進行程序提供的服務稱之為SaaS(Software as a Service)&#xff0c;而云計算時代相應的服務器平臺或者開發環境作為服務…

PostgreSQL安裝和簡單配置

PostgreSQL安裝與使用 目錄 依賴包的安裝源碼編譯和安裝初始化數據庫集簇簡單配置依賴包安裝 PostgreSQL源碼安裝依賴以下四個軟件包 readline zlib flex bison 在Ubuntu中可是應用以下命令直接進行安裝&#xff1a; sudo apt-get install libreadline6 libreadline6-dev zlib1…

1.App瘦身經驗總結

為什么apk越來越大&#xff1f; 1.項目不斷發展&#xff0c;功能越多&#xff0c;代碼量增加的同時&#xff0c;資源文件也在不斷的增多2.app支持的主流dpi越來越多&#xff0c;如ldpi、mdpi、hdpi、xh xxh xxxh等等&#xff0c;間接導致資源增多3.引入的第三方sdk或開源庫越來…

研究相機和IMU坐標系變換

剛開始錄制的數據時沒有考慮相機和IMU之間的坐標變換&#xff0c;但是后來發現跟蹤效果不好&#xff0c;去查驗imu數據時&#xff0c;發現&#xff0c;我采集保存的imu數據格式沒有和euroc數據集中的imu數據保存格式統一&#xff0c;所以需要研究的是在euroc用于數據采集的設備…

第五天:Swift拖動 item 重排 CollectionView

參考鏈接:https://www.jianshu.com/p/96f956f1479e 1 import UIKit2 3 enum VC: String {4 case ViewController5 case CollectionViewController6 7 func segueIdentifier() -> String {8 switch self {9 case .ViewController:10 …

MIT Kimera閱讀筆記

這兩天在調研SLAM的最新算法&#xff0c;找到了2019CVPR上的一篇文章&#xff0c;出自于MIT&#xff0c;因為要給其他同事講解&#xff0c;所以就把文章的重點內容在我個人理解的情況下翻譯了出來&#xff0c;有理解不到位的還請各位大佬多多批評指正。 最后附上了Delaunay Tri…

C#中的ForEach

public void ForEach(Action<T> action) 針對List<T>集合中的每個元素執行操作Action<T> action,Action<T>是只接受一個類型為T的傳入參數返回值為void的委托,對于泛型List<T>來說,Action<T>中的類型與List<T>中的類型是相同的.acti…