Android App圖片輪播效果的組件化

簡介

一個通用的圖片輪播效果的通用組件,方便開發者快速集成。

初學者,其實應該實現一個自定義控件的,改天有空,在學習下吧,學習能力一般,以前也沒寫過java,這個組件都寫了好久,慚愧啊。

背景

筆者參考http://blog.csdn.net/allen315410/article/details/39294343 學習了圖片輪播效果的實現。在瀏覽代碼的過程中,總覺得圖片輪播的效果和Android Activity的耦合過高,如果一個開發者要集成該功能,會將整個功能代碼和自己的App代碼攪在一起,提高代碼的復雜度。同時圖片和圖片文字描述存放在兩個獨立的ArrayList,這樣的對應關系要由開發者手動維護,時刻關注對應關系正確性。
為什么需要組件:組件開發的目的,即讓開發者用最少的代碼,調用最少的接口,實現開發者的需求。
以上的描述是筆者對組件概念的最基本的認識,也是基于該原則,筆者基于http://blog.csdn.net/allen315410/article/details/39294343 進行了重構,實現了一個相對內聚的組件。

圖片輪播的要素

如果一個開發者需要開發一個圖片輪播的功能,開發者最少需要提供的元素有哪些:

  • 輪播的圖片元素
  • 每個圖片對應的文字描述
  • 輪播圖片在布局中的位置
  • 圖片描述在布局中的位置
  • 圖片輪播的時間間隔

理論上講,開發者只需要提高以上幾個元素即可,剩下的就有組件完成吧。基于以上思路,開發者大概只需要完成類似代碼即可:

public class MainActivity extends Activity {//提供一個ViewPagerItem類型數組,ViewPagerItem包括了圖片信息和圖片對應描述信息,采用一一對應的方式,方便維護private ViewPagerItem[] viewPagerItem = new ViewPagerItem[] {new ViewPagerItem(R.drawable.a, "0圖片描述信息0"),new ViewPagerItem(R.drawable.b, "1圖片描述信息1"),new ViewPagerItem(R.drawable.c, "2圖片描述信息2"),new ViewPagerItem(R.drawable.d, "3圖片描述信息3"),new ViewPagerItem(R.drawable.e, "4圖片描述信息4"),new ViewPagerItem(R.drawable.e, "5圖片描述信息5"),};private ViewPagerShow mViewPagerShow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//提供一個layout布局容器,用來指定圖片展示的位置LinearLayout container = (LinearLayout) findViewById(R.id.dot_container);//new一個ViewPagerShow,提供相應參數mViewPagerShow = new ViewPagerShow(viewPagerItem, this, (ViewPager)findViewById(R.id.vp), mHandler,(TextView)findViewById(R.id.title), container);}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();}/*** 接收子線程傳遞過來的數據,調用ViewPagerShow提供的update方法,實現ui的更新*/private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {mViewPagerShow.update();};};@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();}
}

瀏覽以上代碼,不難發現該功能的加入,對開發者原有的代碼的侵入范圍不是很大。

用盡量少的代碼,完成功能需求,是軟件開發人員不斷的追求。

輪播組件的實現

下面附上圖片輪播效果組件的代碼實現:

package com.example.image.view;import android.content.Context;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;import static android.content.ContentValues.TAG;/*** Created by image on 2017/7/14.*/class ViewPagerItem {public int iMageId;public String iMageTitle;public ViewPagerItem(int iMageId, String iMageTitle) {this.iMageId = iMageId;this.iMageTitle = iMageTitle;}
}class ViewPagerAdapter extends PagerAdapter {private List<ImageView> iMageViews;public ViewPagerAdapter(List<ImageView> iMageViews) {this.iMageViews = iMageViews;}@Overridepublic int getCount() {return iMageViews.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(ViewGroup view, int position, Object object) {// TODO Auto-generated method stubview.removeView(iMageViews.get(position));}@Overridepublic Object instantiateItem(ViewGroup view, int position) {// TODO Auto-generated method stubview.addView(iMageViews.get(position));return iMageViews.get(position);}
}class cloneView extends View {public cloneView(Context context) {super(context);}public cloneView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public cloneView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public cloneView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}public Object clone(){Object o=null;try {o=super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return o;}
}class ViewPagerShow {private ArrayList<View> dots;private ViewPagerItem[] viewPagerItem;private List<ImageView> iMagesList;private Context context;private ViewPagerAdapter mViewPagerAdapter;private ViewPager mViewPager;private ScheduledExecutorService scheduledExecutorService;private Handler mHandler;private int currentItem = 0;private TextView titleText;private LinearLayout container;private View dot_focus, dot_unfocus;private class ViewPageTask implements Runnable{@Overridepublic void run() {currentItem = (currentItem + 1) % viewPagerItem.length;mHandler.sendEmptyMessage(0);};}public void dotUpdate() {container.removeAllViews();View view;for (int i = 0; i < this.viewPagerItem.length; i++) {if (i == currentItem) {view = LayoutInflater.from(context).inflate(R.layout.dot_focus, null);container.addView(view);} else {view = LayoutInflater.from(context).inflate(R.layout.dot_unfocus, null);container.addView(view);}}}public ViewPagerShow(final ViewPagerItem[] viewPagerItem, Context context, ViewPager mViewPager, Handler mHandler,final TextView titleText, LinearLayout container) {this.viewPagerItem = viewPagerItem;this.context = context;this.mViewPager = mViewPager;this.mHandler = mHandler;this.titleText = titleText;this.container = container;this.dot_focus = dot_focus;this.dot_unfocus = dot_unfocus;/* show first pic title */titleText.setText(viewPagerItem[0].iMageTitle);iMagesList = new ArrayList<ImageView>();for (int i = 0; i < this.viewPagerItem.length; i++) {ImageView imageView = new ImageView(context);imageView.setBackgroundResource(viewPagerItem[i].iMageId);imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLog.d(TAG, "onClick: onClick");;}});iMagesList.add(imageView);}dotUpdate();mViewPagerAdapter = new ViewPagerAdapter(iMagesList);mViewPager.setAdapter(mViewPagerAdapter);mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {titleText.setText(viewPagerItem[position].iMageTitle);currentItem = position;dotUpdate();}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();scheduledExecutorService.scheduleWithFixedDelay(new ViewPageTask(), 5, 5, TimeUnit.SECONDS);}public void update() {mViewPager.setCurrentItem(currentItem);titleText.setText(viewPagerItem[currentItem].iMageTitle);dotUpdate();}
}

圖片輪播的原理,基本都是參考http://blog.csdn.net/allen315410/article/details/39294343 該篇blog的介紹,這里做的主要的事情即把相關的接口進行一個整理,集中,剝離出一個通用的處理組件,方便開發者的集成。

目前該組件的實現還比較粗糙,待后續持續的更新,完善

文章寫的很隨意,時間精力關系很多細節沒有講到,最后附上github地址,供參考:https://github.com/imagec/ViewPager

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

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

相關文章

天下IT:程序員能掙哪些外快?

各位朋友&#xff0c;大家好&#xff01;歡迎收看《天下IT》。 今天我們給您講講程序員&#xff0c;坦率的說世界上的程序員基本跟我手里的帽子一樣遍地都是&#xff0c;各種各樣的程序員&#xff0c;因為程序員已經成為社會的主流打工群體。但是程序員實際在公司里往往是最不受…

P1616 瘋狂的采藥(洛谷,動態規劃遞推,完全背包)

先上題目鏈接:P1616 瘋狂的采藥 然后放AC代碼: #include<bits/stdc.h> #define ll long long using namespace std; ll f[100010]; ll timee[10010]; ll w[10010]; int main() {ll t,m;cin>>t>>m;//t總時間,m總草藥//time時間,w價值for(ll i1;i<m;i){scan…

MySQL通過source命令執行sql文件

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IT人員經常會和MySQL打交道&#xff0c;備份和恢復應該是最常用的操作了&#xff0c;那么通過直接執行sql文件無疑是最快捷的方式&#x…

Android系統中通過shell命令實現wifi的連接控制

簡介 工作中遇到一個“變態”的需求&#xff0c;在android系統中不通過java層控制wifi的連接&#xff08;主要是修改ap的essid和password&#xff09;&#xff0c;而是需要通過native層實現對wifi的控制。 How 接到這個需求時&#xff0c;第一個想法是如何找到Android nativ…

程序員賺大錢

本文共分三部分&#xff0c;現在打開的是《第一部分》&#xff0c;歡迎繼續閱讀《第二部分》和《第三部分》1 引子 都說海闊憑魚躍&#xff0c;又有多少魚能躍出大海&#xff1f;都說天高任鳥飛&#xff0c;但真正能一飛沖天的&#xff0c;也不過是寥寥數鷹而已&#xff1b;在…

MySQL索引底層實現原理

索引的本質 MySQL官方對索引的定義為&#xff1a;索引&#xff08;Index&#xff09;是幫助MySQL高效獲取數據的數據結構。提取句子主干&#xff0c;就可以得到索引的本質&#xff1a;索引是數據結構。 我們知道&#xff0c;數據庫查詢是數據庫的最主要功能之一。我們都希望查詢…

解決 A component required a bean of ‘XXX.RoleService‘ that could not be found.

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 springboot工程啟動報錯&#xff0c;無法啟動成功。 dubbo訂閱服務失敗&#xff0c;提示如下&#xff1a; 出錯原因&#xff1a;唉&…

開源個小工具simple-repo

背景 了解android系統的都應該熟悉repo這個工具&#xff0c;google為了方便管理數百個git倉庫&#xff0c;開發了repo這個批量管理工具。不過google repo project配置比較麻煩&#xff0c;而通過gitbucket搭建git server則比較傻瓜&#xff0c;所以此處開發了simple-repo這么一…

配合OAuth2進行單設備登錄攔截

2019獨角獸企業重金招聘Python工程師標準>>> 要進行單設備登錄&#xff0c;在其他地點登錄后&#xff0c;本地的其他操作會被攔截返回登錄界面。 原理就在于要在登錄時在redis中存儲Session,進行操作時要進行Session的比對。 具體實現&#xff0c;假設我們的OAuth 2…

朱大鳴:中國金融危機到底有多嚴重

我們到底該不該救助金融機構&#xff0c;中國鈔票到底有沒有超發&#xff0c;對于這個問題&#xff0c;央行行長周小川日前撰文全面為之辯護&#xff1a;對于第一個問題&#xff0c;他的觀點是金融業出現了問題就必須救&#xff0c;否則意味著集體的失靈甚至死亡&#xff1b;中…

C++知識點(六)數組、指針與字符串導學

1.數組 地址連續存放初始化&#xff1a;列出全部初始值后&#xff0c;第1維下標個數可以省略不做初始化&#xff0c;局部變量中為垃圾數據&#xff0c;static變量為0只對一部分進行初始化&#xff0c;其余數值初始化為02.動態內存分配&#xff1a; new delete 3.動態創建數組 n…

Android應用開發—知識點匯總

獲取Fragment的context&#xff1a; getActivity().getApplicationContext()或者getActivity()You can use getActivity(), which returns the activity associated with a fragment.The activity is a context (since Activity extends Context).設置TextView的顏色setTextCol…

條件渲染vue

v-if:只渲染一次的情況下&#xff0c;性能更好v-show:頻繁切換性能更好 vue虛擬DOM技術 瀏覽器&#xff1a;渲染引擎&#xff08;慢&#xff09;JS引擎&#xff08;快&#xff09; 用1個JS對象來充當DOM對象&#xff0c;因為JS對象性能比較快&#xff0c;所以用虛擬DOM對象進行…

錢線觀察:貨幣基金T+0駕到 活期存款將死?

導語&#xff1a;即使沒有任何投資風險&#xff0c;通脹也在侵蝕居民的財富&#xff0c;現金是不安全的。最近出現的一項業務&#xff0c;貨幣基金"T0"贖回&#xff0c;意味著貨幣基金可以像活期存款一樣即時取現&#xff0c;而其收益率普遍高于活期存款。因此有人認…

git stash和git stash pop

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 git stash 可用來暫存當前正在進行的工作&#xff0c; 比如想pull 最新代碼&#xff0c; 又不想加新commit&#xff0c; 或者另外一種情…

CentOS 7.0 上安裝和配置 VNC 服務器

作為一個系統管理員&#xff0c;大多數時間是通過網絡管理服務器的。在管理服務器的過程中很少會用到圖形界面&#xff0c;多數情況下我們只是用 SSH 來完成我們的管理任務。在這篇文章里&#xff0c;我們將配置 VNC 來提供一個連接我們 CentOS 7 服務器的方法。VNC 允許我們開…

Android應用開發—TextView的動態創建

動態創建TextView的兩種方式&#xff1a; 下面介紹兩種創建方式&#xff1a; 在drawable里面創建共同依賴的background.xml文件&#xff0c;里面設置shape來設置文本框的一些特殊效果&#xff1a; eg&#xff1a; <?xml version"1.0" encoding"utf-8"…

Mongo DB 簡單搭建和部署

1.先下載源代碼包 官網下載地址&#xff1a;http://www.mongodb.org/downloads 2.解包tar xf mongodb-linux-x86_64-rhel62-3.2.7.tgz 3.把包移動到 /usr/local/mongodb mv mongodb-linux-x86_64-rhel62-3.2.7/ /usr/local/mongodb 指定同一時間最多可開啟的文件數&#xff08…

運算符優先級 必熟記,放到心里

優先級 運算符 名稱或含義 使用形式 結合方向 說明 1 [] 數組下標 數組名[常量表達式] 左到右 () 圓括號 &#xff08;表達式&#xff09;/函數名(形參表) . 成員選擇&#xff08;對象&#xff09; 對象.成員名 -> 成員選擇&#xff08;指針&#xff0…

可持久化平衡樹(FHQ Treap)

兩個最基本的操作 merge合并 split分割 merge 把兩棵treap合并成一棵treap&#xff0c;要滿足T1最大值要比T2最小值小&#xff0c;比較將隨機數值key值更大的作為合并后的根 假設T1作為根節點作為新子樹的根&#xff0c;左子樹不變&#xff0c;右子樹對T1原來的右子樹與T2再遞歸…