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

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、牧野網(wǎng)站維護(hù)、網(wǎng)站推廣。
首先,在模擬器上運(yùn)行項(xiàng)目代碼??梢钥吹剑缑媲袚Q效果庫(kù)的Demo為大家提供了比較豐富的選項(xiàng),如下圖所示;我們可以隨意選擇切換的內(nèi)容(文字、圖片)、切換的漸變時(shí)間、切換的停頓時(shí)間以及豐富切換的效果(滾動(dòng)切換、旋轉(zhuǎn)漸變、大小漸變等)。
下圖所示的就是圖片切換的效果,大家還可以嘗試各種切換的效果,我們可以看到效果還是很流暢的。
界面切換效果庫(kù)位于ShiftEffect項(xiàng)目的libs目錄下,即plugs-effect.jar。該效果庫(kù)的使用范例都在 com.example.scrolleffect包目錄下的MainActivity.java文件中,使用方法在代碼注釋中都已經(jīng)寫(xiě)的非常清楚了,如 下參考。
- public class MainActivity extends Activity implements OnItemSelectedListener {
- // 展示漸變動(dòng)效的容器,用于容納漸變效果庫(kù)的View控件
- private LinearLayout container;
- // 漸變效果庫(kù)的View控件類(lèi)
- private EffectView mView;
- // 文字資源(用于展示漸變切換)
- private String[] mTexts = { "今日新聞1", "今日新聞2", "今日新聞3" };
- // 圖片資源(用于展示漸變切換)
- private int[] mImages = { R.drawable.image_1, R.drawable.image_2, R.drawable.image_3 };
- // 切換內(nèi)容選項(xiàng)
- private Spinner sp1;
- private ArrayAdapter
aa1; - private String[] menu1 = { "內(nèi)容:文字", "內(nèi)容:圖片" };
- // 切換漸變時(shí)間選項(xiàng)
- private Spinner sp2;
- private ArrayAdapter
aa2; - private String[] menu2 = { "動(dòng)時(shí):300ms", "動(dòng)時(shí):1000ms", "動(dòng)時(shí):3000ms" };
- // 切換漸變停頓選項(xiàng)
- private Spinner sp3;
- private ArrayAdapter
aa3; - private String[] menu3 = { "停時(shí):3000ms", "停時(shí):5000ms", "停時(shí):10000ms" };
- // 切換漸變效果選項(xiàng)
- private Spinner sp4;
- private ArrayAdapter
aa4; - private String[] menu4 = { "動(dòng)效:向上", "動(dòng)效:向下", "動(dòng)效:向左", "動(dòng)效:向右", "動(dòng)效:旋轉(zhuǎn)",
- "動(dòng)效:大小", "動(dòng)效:漸變" };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 初始化展示動(dòng)效的容器
- container = (LinearLayout) this.findViewById(R.id.container);
- // 初始化各個(gè)選項(xiàng)的內(nèi)容
- sp1 = (Spinner) findViewById(R.id.spinner1);
- aa1 = new ArrayAdapter
(this, android.R.layout.simple_spinner_item, menu1); - aa1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- sp1.setAdapter(aa1);
- sp1.setOnItemSelectedListener(this);
- sp2 = (Spinner) findViewById(R.id.spinner2);
- aa2 = new ArrayAdapter
(this, android.R.layout.simple_spinner_item, menu2); - aa2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- sp2.setAdapter(aa2);
- sp2.setOnItemSelectedListener(this);
- sp3 = (Spinner) findViewById(R.id.spinner3);
- aa3 = new ArrayAdapter
(this, android.R.layout.simple_spinner_item, menu3); - aa3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- sp3.setAdapter(aa3);
- sp3.setOnItemSelectedListener(this);
- sp4 = (Spinner) findViewById(R.id.spinner4);
- aa4 = new ArrayAdapter
(this, android.R.layout.simple_spinner_item, menu4); - aa4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- sp4.setAdapter(aa4);
- sp4.setOnItemSelectedListener(this);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- @Override
- public void onItemSelected(AdapterView> parent, View view, int position, long id) {
- // 選擇切換內(nèi)容選項(xiàng)(可選擇滾動(dòng)文字或者圖片)
- if (parent.getAdapter() == aa1) {
- container.removeAllViews();
- switch (position) {
- case 0:
- // 初始化文字切換View對(duì)象
- mView = EffectUtil.fillTexts(this, EffectView.ANI_UP, 30, mTexts);
- container.addView(mView);
- mView.start();
- break;
- default:
- mView = EffectUtil.fillImages(this, EffectView.ANI_UP, mImages);
- container.addView(mView);
- mView.start();
- break;
- }
- }
- // 選擇切換漸變時(shí)間選項(xiàng)
- if (parent.getAdapter() == aa2) {
- switch (position) {
- case 0:
- mView.setDuration(300);
- break;
- case 1:
- mView.setDuration(1000);
- break;
- default:
- mView.setDuration(3000);
- break;
- }
- }
- // 選擇切換漸變間隔選項(xiàng)
- if (parent.getAdapter() == aa3) {
- switch (position) {
- case 0:
- mView.setInterval(3000);
- break;
- case 1:
- mView.setInterval(5000);
- break;
- default:
- mView.setInterval(10000);
- break;
- }
- }
- // 選擇切換漸變效果選項(xiàng)
- if (parent.getAdapter() == aa4) {
- switch (position) {
- case 0:
- mView.setAnimation(EffectView.ANI_UP); // 往上滾動(dòng)
- break;
- case 1:
- mView.setAnimation(EffectView.ANI_DOWN); // 往下滾動(dòng)
- break;
- case 2:
- mView.setAnimation(EffectView.ANI_LEFT); // 往左滾動(dòng)
- break;
- case 3:
- mView.setAnimation(EffectView.ANI_RIGHT); // 往右滾動(dòng)
- break;
- case 4:
- mView.setAnimation(EffectView.ANI_ROTATE); // 旋轉(zhuǎn)漸變
- break;
- case 5:
- mView.setAnimation(EffectView.ANI_SCALE); // 大小漸變
- break;
- default:
- mView.setAnimation(EffectView.ANI_FADE); // 消失漸變
- break;
- }
- }
- }
- @Overridek
- public void onNothingSelected(AdapterView> parent) {
- // TODO Auto-generated method stub
- }
- }
我們可以看到,該界面切換效果庫(kù)的使用方法是非常方便和靈活的。使用EffectUtil的fillTexts(或fillImages)方法添加需要進(jìn) 行切換的文字(或圖片)之后,再調(diào)用其EffectView對(duì)象的start方法就可以打開(kāi)切換效果了。此外,我們還可以使用setDuration方法 設(shè)置切換過(guò)程的漸變時(shí)間、使用setInterval設(shè)置切換過(guò)程的漸變間隔、使用setAnimation方法設(shè)置切換過(guò)程的漸變效果;這些方法的使用 在使用范例中都能查到。
接下來(lái),讓我們來(lái)思考一個(gè)問(wèn)題:如果拋開(kāi)以上的Android界面切換效果庫(kù),使用原生API來(lái)實(shí)現(xiàn)一個(gè)類(lèi)似的效果,我們?cè)撊绾蝸?lái)做?你 是否會(huì)感覺(jué)非常繁瑣?確實(shí)如此。其實(shí),這也就是為何我們提倡“模塊化編程”的原因!實(shí)際上業(yè)內(nèi)已經(jīng)有很多的開(kāi)發(fā)團(tuán)隊(duì)早已意識(shí)到了這一點(diǎn),也就是所謂的 “Android模塊化編程”。那么,何謂“Android模塊化編程”呢?簡(jiǎn)單來(lái)說(shuō),就是把常見(jiàn)的、可復(fù)用的功能提取出來(lái),單獨(dú)制作成好用的類(lèi)庫(kù),使之 在開(kāi)發(fā)產(chǎn)品的時(shí)候可被復(fù)用。
實(shí)際上,任何一門(mén)技術(shù)發(fā)展到一定階段,必然會(huì)出現(xiàn)模塊化的方法和思想,對(duì)于A(yíng)ndroid編程來(lái)說(shuō)也是如此。 模塊化編程可以幫助知識(shí)積累、技術(shù)沉淀,幫助我們制作出更加豐富和復(fù)雜的應(yīng)用。因此,我建議大家在學(xué)習(xí)Android變成的過(guò)程中,多使用模塊化的思想來(lái) 實(shí)現(xiàn),比如上述的“自定義Android界面切換效果庫(kù)”,就是個(gè)很好的例子。我們可以來(lái)看看以上界面切換效果庫(kù)源碼結(jié)構(gòu),如下圖。
從源碼的結(jié)構(gòu)中,我們可以看出,效果庫(kù)的代碼層次十分清晰。EffectUtil是總接口類(lèi),里面包含了fillTexts和fillImages兩個(gè)方 法,用于初始化界面切換的內(nèi)容(文字or圖片);相關(guān)的視圖類(lèi)都在com.app.plugs.effect.view包下,這些視圖都是用于容納切換內(nèi) 容的容器;而動(dòng)畫(huà)效果類(lèi)則位于com.app.plugs.effect.anim包下,這里包含了所有動(dòng)畫(huà)效果的邏輯。具體源碼大家可以直接反編譯 Demo項(xiàng)目的源碼plugs-effect.jar來(lái)看,此包是未加密過(guò)的。
當(dāng)然,在模塊化編程實(shí)現(xiàn)的過(guò)程中,必定會(huì)遇到很多需要解決 的問(wèn)題。比如下面就是個(gè)最常見(jiàn)的問(wèn)題,模塊相關(guān)的資源文件如何打包?實(shí)際上在模塊化編程的過(guò)程中,我們不提倡對(duì)資源進(jìn)行打包。大家更應(yīng)該使用 Android原生的控件API來(lái)實(shí)現(xiàn)模塊的UI,而不是XML模板(使用XML模板有可能降低Android應(yīng)用的運(yùn)行效率,請(qǐng)參考《Android和PHP開(kāi)發(fā)***實(shí)踐》第10章.客戶(hù)端優(yōu)化)來(lái)學(xué)習(xí)自定義Android界面切換效果庫(kù)的使用;而圖片資源這些則可以通過(guò)模塊的API進(jìn)行設(shè)置;總之,原則是模塊化的類(lèi)庫(kù)中應(yīng)該只包含代碼。當(dāng)然,大家在實(shí)施過(guò)程中遇到任何問(wèn)題,都?xì)g迎到這里來(lái)留言和討論。
本文題目:自定義Android界面切換效果庫(kù)的使用
本文URL:http://fisionsoft.com.cn/article/dhoojcj.html


咨詢(xún)
建站咨詢(xún)
