国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

自定義Android界面切換效果庫的使用

移動開發(fā) Android
作者希望通過本文可以讓廣大讀者了解、熟悉并且掌握自定義Android界面切換效果庫的使用、開發(fā)與思考,希望大家可以學而能用制作自己的自定義Android界面切換效果庫來使用。

界面或者板塊的切換是Android應(yīng)用中非常常見的一個功能,同時也談?wù)勛约簩?“Android模塊化編程”的一些想法與對自定義Android界面切換效果庫的使用。希望大家能通過對界面切換效果庫的研究和思考,總結(jié)出一套自己的常用功能類庫的開發(fā)思路。界面切換效果庫 Demo項目的源碼(ShiftEffect.zip)可以點擊“此處下載”。將解壓后的項目源碼(ShiftEffect)導入到Eclipse中就可以看到這個Demo項目的代碼結(jié)構(gòu)了(如下圖)。

首先,在模擬器上運行項目代碼??梢钥吹?,界面切換效果庫的Demo為大家提供了比較豐富的選項,如下圖所示;我們可以隨意選擇切換的內(nèi)容(文字、圖片)、切換的漸變時間、切換的停頓時間以及豐富切換的效果(滾動切換、旋轉(zhuǎn)漸變、大小漸變等)。


下圖所示的就是圖片切換的效果,大家還可以嘗試各種切換的效果,我們可以看到效果還是很流暢的。

界面切換效果庫位于ShiftEffect項目的libs目錄下,即plugs-effect.jar。該效果庫的使用范例都在 com.example.scrolleffect包目錄下的MainActivity.java文件中,使用方法在代碼注釋中都已經(jīng)寫的非常清楚了,如 下參考。

  1. public class MainActivity extends Activity implements OnItemSelectedListener {   
  2.    
  3.     // 展示漸變動效的容器,用于容納漸變效果庫的View控件   
  4.     private LinearLayout container;   
  5.        
  6.     // 漸變效果庫的View控件類   
  7.     private EffectView mView;   
  8.        
  9.     // 文字資源(用于展示漸變切換)   
  10.     private String[] mTexts = { "今日新聞1""今日新聞2""今日新聞3" };   
  11.        
  12.     // 圖片資源(用于展示漸變切換)   
  13.     private int[] mImages = { R.drawable.image_1, R.drawable.image_2, R.drawable.image_3 };   
  14.    
  15.     // 切換內(nèi)容選項   
  16.     private Spinner sp1;   
  17.     private ArrayAdapter<String> aa1;   
  18.     private String[] menu1 = { "內(nèi)容:文字""內(nèi)容:圖片" };   
  19.    
  20.     // 切換漸變時間選項   
  21.     private Spinner sp2;   
  22.     private ArrayAdapter<String> aa2;   
  23.     private String[] menu2 = { "動時:300ms""動時:1000ms""動時:3000ms" };   
  24.    
  25.     // 切換漸變停頓選項   
  26.     private Spinner sp3;   
  27.     private ArrayAdapter<String> aa3;   
  28.     private String[] menu3 = { "停時:3000ms""停時:5000ms""停時:10000ms" };   
  29.    
  30.     // 切換漸變效果選項   
  31.     private Spinner sp4;   
  32.     private ArrayAdapter<String> aa4;   
  33.     private String[] menu4 = { "動效:向上""動效:向下""動效:向左""動效:向右""動效:旋轉(zhuǎn)",   
  34.             "動效:大小""動效:漸變" };   
  35.    
  36.     @Override   
  37.     public void onCreate(Bundle savedInstanceState) {   
  38.         super.onCreate(savedInstanceState);   
  39.         setContentView(R.layout.activity_main);   
  40.    
  41.         // 初始化展示動效的容器   
  42.         container = (LinearLayout) this.findViewById(R.id.container);   
  43.    
  44.         // 初始化各個選項的內(nèi)容   
  45.         sp1 = (Spinner) findViewById(R.id.spinner1);   
  46.         aa1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, menu1);   
  47.         aa1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
  48.         sp1.setAdapter(aa1);   
  49.         sp1.setOnItemSelectedListener(this);   
  50.    
  51.         sp2 = (Spinner) findViewById(R.id.spinner2);   
  52.         aa2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, menu2);   
  53.         aa2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
  54.         sp2.setAdapter(aa2);   
  55.         sp2.setOnItemSelectedListener(this);   
  56.    
  57.         sp3 = (Spinner) findViewById(R.id.spinner3);   
  58.         aa3 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, menu3);   
  59.         aa3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
  60.         sp3.setAdapter(aa3);   
  61.         sp3.setOnItemSelectedListener(this);   
  62.    
  63.         sp4 = (Spinner) findViewById(R.id.spinner4);   
  64.         aa4 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, menu4);   
  65.         aa4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
  66.         sp4.setAdapter(aa4);   
  67.         sp4.setOnItemSelectedListener(this);   
  68.     }   
  69.    
  70.     @Override   
  71.     public boolean onCreateOptionsMenu(Menu menu) {   
  72.         getMenuInflater().inflate(R.menu.activity_main, menu);   
  73.         return true;   
  74.     }   
  75.    
  76.     @Override   
  77.     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {   
  78.         // 選擇切換內(nèi)容選項(可選擇滾動文字或者圖片)   
  79.         if (parent.getAdapter() == aa1) {   
  80.             container.removeAllViews();   
  81.             switch (position) {   
  82.                 case 0:   
  83.                     // 初始化文字切換View對象   
  84.                     mView = EffectUtil.fillTexts(this, EffectView.ANI_UP, 30, mTexts);   
  85.                     container.addView(mView);   
  86.                     mView.start();   
  87.                     break;   
  88.                 default:   
  89.                     mView = EffectUtil.fillImages(this, EffectView.ANI_UP, mImages);   
  90.                     container.addView(mView);   
  91.                     mView.start();   
  92.                     break;   
  93.             }   
  94.         }   
  95.         // 選擇切換漸變時間選項   
  96.         if (parent.getAdapter() == aa2) {   
  97.             switch (position) {   
  98.                 case 0:   
  99.                     mView.setDuration(300);   
  100.                     break;   
  101.                 case 1:   
  102.                     mView.setDuration(1000);   
  103.                     break;   
  104.                 default:   
  105.                     mView.setDuration(3000);   
  106.                     break;   
  107.             }   
  108.         }   
  109.         // 選擇切換漸變間隔選項   
  110.         if (parent.getAdapter() == aa3) {   
  111.             switch (position) {   
  112.                 case 0:   
  113.                     mView.setInterval(3000);   
  114.                     break;   
  115.                 case 1:   
  116.                     mView.setInterval(5000);   
  117.                     break;   
  118.                 default:   
  119.                     mView.setInterval(10000);   
  120.                     break;   
  121.             }   
  122.         }   
  123.         // 選擇切換漸變效果選項   
  124.         if (parent.getAdapter() == aa4) {   
  125.             switch (position) {   
  126.                 case 0:   
  127.                     mView.setAnimation(EffectView.ANI_UP); // 往上滾動   
  128.                     break;   
  129.                 case 1:   
  130.                     mView.setAnimation(EffectView.ANI_DOWN); // 往下滾動   
  131.                     break;   
  132.                 case 2:   
  133.                     mView.setAnimation(EffectView.ANI_LEFT); // 往左滾動   
  134.                     break;   
  135.                 case 3:   
  136.                     mView.setAnimation(EffectView.ANI_RIGHT); // 往右滾動   
  137.                     break;   
  138.                 case 4:   
  139.                     mView.setAnimation(EffectView.ANI_ROTATE); // 旋轉(zhuǎn)漸變   
  140.                     break;   
  141.                 case 5:   
  142.                     mView.setAnimation(EffectView.ANI_SCALE); // 大小漸變   
  143.                     break;   
  144.                 default:   
  145.                     mView.setAnimation(EffectView.ANI_FADE); // 消失漸變   
  146.                     break;   
  147.             }   
  148.         }   
  149.     }   
  150.     @Overridek   
  151.     public void onNothingSelected(AdapterView<?> parent) {   
  152.         // TODO Auto-generated method stub   
  153.     }   

我們可以看到,該界面切換效果庫的使用方法是非常方便和靈活的。使用EffectUtil的fillTexts(或fillImages)方法添加需要進 行切換的文字(或圖片)之后,再調(diào)用其EffectView對象的start方法就可以打開切換效果了。此外,我們還可以使用setDuration方法 設(shè)置切換過程的漸變時間、使用setInterval設(shè)置切換過程的漸變間隔、使用setAnimation方法設(shè)置切換過程的漸變效果;這些方法的使用 在使用范例中都能查到。
接下來,讓我們來思考一個問題:如果拋開以上的Android界面切換效果庫,使用原生API來實現(xiàn)一個類似的效果,我們該如何來做?你 是否會感覺非常繁瑣?確實如此。其實,這也就是為何我們提倡“模塊化編程”的原因!實際上業(yè)內(nèi)已經(jīng)有很多的開發(fā)團隊早已意識到了這一點,也就是所謂的 “Android模塊化編程”。那么,何謂“Android模塊化編程”呢?簡單來說,就是把常見的、可復用的功能提取出來,單獨制作成好用的類庫,使之 在開發(fā)產(chǎn)品的時候可被復用。
實際上,任何一門技術(shù)發(fā)展到一定階段,必然會出現(xiàn)模塊化的方法和思想,對于Android編程來說也是如此。 模塊化編程可以幫助知識積累、技術(shù)沉淀,幫助我們制作出更加豐富和復雜的應(yīng)用。因此,我建議大家在學習Android變成的過程中,多使用模塊化的思想來 實現(xiàn),比如上述的“自定義Android界面切換效果庫”,就是個很好的例子。我們可以來看看以上界面切換效果庫源碼結(jié)構(gòu),如下圖。

從源碼的結(jié)構(gòu)中,我們可以看出,效果庫的代碼層次十分清晰。EffectUtil是總接口類,里面包含了fillTexts和fillImages兩個方 法,用于初始化界面切換的內(nèi)容(文字or圖片);相關(guān)的視圖類都在com.app.plugs.effect.view包下,這些視圖都是用于容納切換內(nèi) 容的容器;而動畫效果類則位于com.app.plugs.effect.anim包下,這里包含了所有動畫效果的邏輯。具體源碼大家可以直接反編譯 Demo項目的源碼plugs-effect.jar來看,此包是未加密過的。
當然,在模塊化編程實現(xiàn)的過程中,必定會遇到很多需要解決 的問題。比如下面就是個最常見的問題,模塊相關(guān)的資源文件如何打包?實際上在模塊化編程的過程中,我們不提倡對資源進行打包。大家更應(yīng)該使用 Android原生的控件API來實現(xiàn)模塊的UI,而不是XML模板(使用XML模板有可能降低Android應(yīng)用的運行效率,請參考《Android和PHP開發(fā)***實踐》第10章.客戶端優(yōu)化)來學習自定義Android界面切換效果庫的使用;而圖片資源這些則可以通過模塊的API進行設(shè)置;總之,原則是模塊化的類庫中應(yīng)該只包含代碼。當然,大家在實施過程中遇到任何問題,都歡迎到這里來留言和討論。

責任編輯:閆佳明 來源: csdn
相關(guān)推薦

2010-02-07 14:02:16

Android 界面

2013-01-06 10:43:54

Android開發(fā)View特效

2016-11-16 21:55:55

源碼分析自定義view androi

2016-12-26 15:25:59

Android自定義View

2010-10-25 16:05:07

oracle自定義函數(shù)

2017-10-25 14:07:54

APPiOSxcode

2024-05-30 08:23:37

ViewPager滑動效果接口

2017-04-21 14:27:21

Android控件QQ未讀消息

2013-04-01 14:35:10

Android開發(fā)Android自定義x

2014-12-10 10:37:45

Android自定義布局

2021-09-14 15:13:18

鴻蒙HarmonyOS應(yīng)用

2019-12-25 11:47:27

LinuxFVWM

2009-06-23 11:35:44

JSF的Naviati

2022-01-14 09:17:13

PythonAPISIX插件

2011-08-25 11:44:21

LUA腳本魔獸世界

2017-05-18 12:36:16

android萬能適配器列表視圖

2017-05-19 10:03:31

AndroidBaseAdapter實踐

2016-04-12 10:07:55

AndroidViewList

2015-06-10 10:54:24

自定義路PHP

2021-12-24 15:46:23

鴻蒙HarmonyOS應(yīng)用
點贊
收藏

51CTO技術(shù)棧公眾號

欧美 亚洲 视频| 国产精品美女久久久久aⅴ| a√天堂在线观看| 狠狠干狠狠久久| 巨胸喷奶水www久久久| 国产成人精品最新| 激情都市一区二区| 中文字幕免费在线观看| 中文字幕一区日韩电影| 欧美日韩一区二区高清| 午夜肉伦伦影院| 欧美zozozo| 国产精品久久观看| 成人小视频在线看| 精品久久久久99| 天天av综合| 亚洲精品怡红院| 亚洲的天堂在线中文字幕| 色喇叭免费久久综合| 日本一区二区黄色| 亚洲第一精品夜夜躁人人躁| 亚洲一区二区日韩| 天堂av在线网站| 一区二区三区美女xx视频| 亚洲一区二区网站| 爽爽视频在线观看| 国语对白做受69| www.av亚洲| 在线人成日本视频| 日韩电影在线播放| 欧美色网站导航| 久久国产综合| 国产黄色av免费看| 另类色图亚洲色图| 成人动漫中文字幕| 99爱在线观看| 久久久福利视频| 一本久久综合亚洲鲁鲁五月天| 日本韩国欧美在线观看| 欧美色另类天堂2015| 伊人久久大香线蕉综合网站 | 四虎国产精品成人免费影视| 亚欧精品在线| 欧美日韩成人综合天天影院| 亚洲成人一区| 视频国产一区二区三区| 国产在线精品播放| 亚洲午夜激情网站| 久久一区91| 亚洲sss视频| 91精品美女在线| 富二代精品短视频| 欧美69视频| 天天影视久久综合| 欧美久久久久久| 精品国产123| 国产在线观看免费一区| 91超碰碰碰碰久久久久久综合| 青青青青在线视频| 日韩中文字幕在线观看| 久久色成人在线| 欧美一级全黄| 最新亚洲伊人网| 91精品免费| 欧美一区二区视频在线观看2020| 另类天堂av| 樱桃视频成人在线观看| 欧美乱做爰xxxⅹ久久久| 精品久久久999| 国产精品丝袜91| 免费av一区| 国产在线观看免费| 欧美精品v日韩精品v国产精品| 亚洲精品一区二区三区精华液 | 69精品国产久热在线观看| 日av中文字幕| 91成人在线视频| 亚洲一区二区三区四区在线观看| 精品国产一区二区三区久久久蜜臀| av女同在线| 国产一区免费在线| 欧美大片顶级少妇| 久久99精品久久| 天天射成人网| 色综合888| 日韩精品在在线一区二区中文| 亚洲精品国产精品国自产在线| 夫妻av一区二区| 秋霞在线一区二区| 综合网中文字幕| 亚洲欧洲精品一区二区三区| 久久精品国产大片免费观看| 久操免费在线| 成人黄色大片网站| 国产91亚洲精品| 欧美日韩在线亚洲一区蜜芽| 国产剧情一区二区三区| 秋霞蜜臀av久久电影网免费| 国产一区电影| 小泽玛利亚av在线| 热门国产精品亚洲第一区在线| 欧美日韩日本视频| 成人黄色一级视频| 九九久久电影| av片在线观看永久免费| 国产在线观看福利| 成人精品视频在线| 国产视频亚洲精品| 亚洲乱码日产精品bd| 日韩精品电影在线| 国产精品自在| bt在线麻豆视频| 91精品无人成人www| 国产精品久久久久久免费观看| 亚洲欧美在线免费| 午夜精品久久久久久久蜜桃app| 三级在线观看一区二区| 亚洲一二三区视频| av网站在线免费观看| 免费拍拍拍网站| 91午夜在线播放| 色综久久综合桃花网| 色综合一区二区三区| av亚洲精华国产精华| 亚洲欧美色图| 欧美国产中文高清| 国产黄色在线网站| 加勒比日本影视| 一级全黄肉体裸体全过程| 国产精品主播视频| 日韩一级黄色av| 欧美在线|欧美| 国产精品麻豆久久久| 老色鬼精品视频在线观看播放| 中文有码一区| 日本少妇一区| 国产视频网站在线| www.日日操| 深田咏美在线x99av| 国产乱码精品1区2区3区| 欧美日韩亚洲一区三区| 日韩高清在线观看一区二区| 日韩少妇视频| 在线中文字幕av| 欧美成人黄色网址| 亚洲区成人777777精品| 91在线播放国产| 18性欧美xxxⅹ性满足| 国产一区二区三区直播精品电影 | 国产精品一区二区三区www| 精品美女在线观看视频在线观看 | 男人添女荫道口女人有什么感觉| 96国产粉嫩美女| 韩国精品美女www爽爽爽视频| 精品国产乱码久久久久久夜甘婷婷 | 国产精品日韩在线| 欧美xxxx14xxxxx性爽| 日韩一区二区精品葵司在线| 精品久久久免费| 国产精品视频九色porn| 豆国产96在线|亚洲| 午夜亚洲视频| 午夜久久99| 欧美日韩性在线观看| 欧美视频精品全部免费观看| 松下纱荣子在线观看| 黄色成人影院| 福利在线视频导航| 夜鲁很鲁在线视频| 午夜免费性福利| 欧美国产日韩在线播放| av免费看网址| 欧美一级免费在线观看| 久久av一区二区| 国产成人一区二区三区免费看| 国产精品久久久久久影视| 91国自产精品中文字幕亚洲| 欧美日韩国产91| 色妞欧美日韩在线| 一本色道久久综合亚洲精品小说| 精品免费99久久| 欧美videos大乳护士334| 欧美日韩专区在线| 欧美日韩在线观看一区二区 | 国产原创精品在线| 成人在线免费在线观看| 日韩精品久久一区二区| 亚洲精品偷拍视频| 91社在线播放| 久久男人资源站| 99在线精品免费视频| 免费一级特黄毛片| 日韩欧美一区二| 能在线观看的av| 欧美黄色性生活| 加勒比一区二区三区| 一级一片免费视频| 日本一区二区三区在线观看视频| 麻豆影视在线| 久做在线视频免费观看|