android框架的設計模式pattern之美gof ch108state_第1頁
android框架的設計模式pattern之美gof ch108state_第2頁
android框架的設計模式pattern之美gof ch108state_第3頁
android框架的設計模式pattern之美gof ch108state_第4頁
android框架的設計模式pattern之美gof ch108state_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、224Android 設計招式之美Android 第 10 章Se 樣式 225第10章e 模式SSe 模式美何在?狀態(tài)變化之美10.1.2以 Android 的畫面布局為例10.2介紹 Se 模式10.2.1GoF 的 Se 模式圖10.2.2Se 模式之范例10.3Android 框架與 Se 模式226Android 設計招式之美Se 模式美何在?狀態(tài)變化之美10.110.1.1上一章里,已經(jīng)介紹過聚合(Aggregate)對象的多樣化組合。由于簡單的序,所以很容易組合;由于能包容復雜多變,所以創(chuàng)造了無盡的繁榮。美的設計就是要在追求簡單次序之時,并不能傷害對繁雜的包容能力。就如老子所言:

2、多聞數(shù)窮,不如守中。(對繁雜多加限制,反而會失去動能;應該盡力維護繁雜的完整性與變化的自由度。)其說明了萬事萬物之本質(zhì):多采多姿的大自然就是來自于大地孕育和包容萬物的繁雜多變之狀態(tài)(S e)。例如,我們周遭的對象,在其生命期中,內(nèi)部狀態(tài)常不斷變化。有些過程是循環(huán)的,有些則是分階段的。例如,花對象的顏色、大小等狀態(tài)是連續(xù)的,然而人們常將其分階段,亦即分為三個狀態(tài)如下圖 10-1花朵的繁雜之美花在不同狀態(tài)中,釋放出不同的訊息(香味),也呈現(xiàn)不同面貌,激發(fā)人們不一樣的心情。含苞待放的花散發(fā)出令人期望的訊息,而凋謝的花帶給人惆悵心情。再如,街道上的紅綠燈之狀態(tài)是周而復始地變換。其中,紅燈亮、綠燈亮和黃

3、燈亮分別是紅綠燈對象的 3 種不同狀態(tài)(Se)。在不同狀態(tài)下,對象本身常產(chǎn)生不同行為和面貌。如下圖:10Se22710-2AndroidStrategy10-3AndroidStrategy228Android 設計招式之美這個模式可實踐兩種變與不變之分離:不同的應用程序里有不同的策略(Strategy)類別,它們之間有變與不變的部份,可以將之分離開來,然后將不變部分寫入抽象類別里。一個應用程序里因不同情境而需要撰寫不同的程序碼來表達不同的策略,我們通常會將程序碼的變異部分分離開來,委托給不同策略類別去實現(xiàn)。分離只是手段,簡單的組合和包容變易才是目標,才能無盡繁榮。這說明了,一個應用程序里可能

4、需要表達多個不同之策略(Strategy),因而需要設計不同的策略類別,以包含其繁雜多變的部份。在 Android 應用程序里,還有類似的結(jié)構(gòu),就是:一個應用程序在其生命周期里(Life Cycle)常會歷經(jīng)數(shù)個不同之狀態(tài)(S e),當處于不同狀態(tài)時,常需要表現(xiàn)出不同的行為,因而需要設計不同的狀態(tài)類別,以包含其會變的部份,以便表現(xiàn)不同的行為。例如,飛機具有 4 個典型的飛行狀態(tài),一開始處于 Preparing 狀態(tài),然后進入 TakingOff 狀態(tài),代表飛機正起飛中。不久,進入 Flying 狀態(tài),代表飛機正平穩(wěn)飛行中;欲下降時,進入 Landing 狀態(tài),逐漸降落于機場跑道。在這個飛機的仿

5、真應用程序上,可設計 4 個狀態(tài)類別來表達飛機處于不同狀態(tài)下的不同行為。此時,也是從飛機類別里將程序碼的會變(會隨著所處狀態(tài)不同而變)部分分離開來,委托給不同的狀態(tài)類別(S e Class)去實現(xiàn)。上一章介紹了 Strategy 模式之美,本章則將介紹 S e 模式之美。兩者有雷同之美,一樣的序,但包容了不同層面的繁雜多變。以 Android 的畫面布局為例狀態(tài)及其轉(zhuǎn)移在Android 里,一個 Activity 對象可負責多個畫面布局(Layout)的呈現(xiàn)和變換。在架構(gòu)師的觀點下, 畫面布局的變換可視為 Activity 對象狀態(tài)(Se) 的轉(zhuǎn)移 (Transition)。大家都知道 And

6、roid 應用程序的畫面布局是變化多端的,所以它的10Se229SeSeMediaPlayerStrategy()AndroidSe(Event)(Behavior)(Se)Activity(Event)(Se)(Action)ActivityUML10-4XCActivity123230Android10-5(Nested)10-6第 10 章Se 樣式 231狀態(tài) 1 內(nèi)含兩個小狀態(tài),這種巢狀結(jié)構(gòu)又稱為階層(Hierarchical)結(jié)構(gòu)。在上圖里,如果狀態(tài) 1 和 2 是在層級 1(即 Level 1),則狀態(tài) 4 和 5 就屬于層級 2。一個狀態(tài)機可以含有許多層級,各層級可以含有許多狀

7、態(tài)。當我們說Activity 對象處于狀態(tài) 1 時,意謂著,它若不是處于狀態(tài) 4 就是處于狀態(tài) 5。此圖表達了:當 Activity 對象處于狀態(tài) 4,而且發(fā)生事件Q 時,就會轉(zhuǎn)移到狀態(tài) 2。當它處于狀態(tài) 4 或 5,而且發(fā)生事件X 時,都會轉(zhuǎn)移到狀態(tài) 2。當它處于狀態(tài) 2,而且發(fā)生事件M 時,會轉(zhuǎn)移到狀態(tài) 1 里面的狀態(tài) 5。當它處于狀態(tài) 2,而且發(fā)生事件Y 時,都會轉(zhuǎn)移到狀態(tài) 1 里面的狀態(tài) 4 或 5。10.1.2.2 事件與動作(Operation)外來的事件(Event)會觸發(fā)對象的狀態(tài)(S某些動作。例如下圖:e)轉(zhuǎn)移,同時也會觸發(fā)對象去執(zhí)行圖 10-7事件、狀態(tài)與活動當對象進入 S

8、e1 時,就會執(zhí)行兩個動作,包括:將 1 值指定給 se_var_A232Android 設計招式之美變數(shù);以及執(zhí)行 show_layout_01()函數(shù)。還有,當 OnKeyDown 事件發(fā)生時,也會執(zhí)行其它動作。10.1.2.3Android 框架的角色當應用程序執(zhí)行時,Android 框架會不斷發(fā)出訊息給應用類別,持續(xù)推動畫面布局的變化。Android框架成為程序運轉(zhuǎn)的動力來源。如下圖:圖 10-8Android 推動應用程序的狀態(tài)變化OnKeyDownOnCheckedChangedAndroid Framework第 10 章Se 樣式 233當 User 按下鍵,Linux 操作系

9、統(tǒng)偵測到此事件發(fā)生了,會傳達訊息給 Android 框架,Android 就發(fā)出 OnKeyDown 訊息(或稱為事件)給我們設計的狀態(tài)機,就推動應用程序狀態(tài)的變化了。同樣地,當 User 按下畫面上的 CheckBox 時, Android 就發(fā)出 OnCheckedChanged 訊息給應用類別,觸發(fā)狀態(tài)的繼續(xù)轉(zhuǎn)移了。我們需要有種優(yōu)雅之序來包容上述的眾多變化。10.2介紹 Se 模式10.2.1GoF 的 Strategy 模式圖由于 Se 模式與上一章的 Strategy 模式結(jié)構(gòu)非常相似,提供一個簡單的序,包容無盡變化,只是包容的層面不同罷了。在上一章,我們介紹過 Strategy 模

10、式之結(jié)構(gòu)如下圖:圖 10-9復習 Strategy 模式234Android 設計招式之美在上一章已經(jīng)說明過,Strategy 模式通常用來建構(gòu)復雜的聚合對象。不同的聚合對象的建構(gòu)規(guī)則是不一樣的,適合委托給不同的類別來實現(xiàn)之。上述 Strategy模式的結(jié)構(gòu)和包容能力,也能拿來包容狀態(tài)的繁雜多變。GoFPatterns一書里,就稱之為Se 模式,如下圖:的Design圖 10-10GoF 的 Se 模式圖這 Se 模式涵蓋了兩種變與不變分離之情形,就是:不同狀態(tài)類別間之變與不變分離了,不變部份寫入 Se 抽象類別里。將 Context 類別里的不同狀態(tài)(即會變部分)分離出來,而委托不同的狀態(tài)類

11、別去實現(xiàn)之。這個 Se 模式提供了簡單接口給 Context。而 Context 可透過該界面而隨意抽換狀態(tài)應用類別,創(chuàng)造多樣化的組合。由于各狀態(tài)應用類別本身已經(jīng)包含了該狀態(tài)里的復雜行為,即使搭配 S e 模式的簡單組合方式,也能像 DNA 一樣,其小單位的內(nèi)涵可簡單也可能復雜,其造形簡單,組合規(guī)則也簡單,不過組合出來的DNA 螺旋結(jié)構(gòu)的內(nèi)涵卻極為復雜,但結(jié)構(gòu)外形仍維持簡單的。第 10 章Se 樣式 235Se 模式之范例10.2.2現(xiàn)在,就來看一個范例,它的各狀態(tài)應用類別都各自啟動一個 Activity 應用類別,來呈現(xiàn)出各自復雜又獨特的畫面布局。如下圖:圖 10-11Se 模式之范例其中,

12、Se_V、Se_E 是狀態(tài)類別,由 Se_V 啟動 ViewAct 畫面,由 S啟動 ViewAct 畫面。e_E236Android 設計招式之美1. 此程序啟動后,按下就在畫面上呈現(xiàn)選單如下:2. 如果選取選項時,首先出現(xiàn)處于View狀態(tài)之畫面(即啟動 Activity:ViewAct):3. 接著,按下按鈕時,就變換到Edit狀態(tài)之畫面(即啟動 EditAct):再按下按鈕時,就回到View狀態(tài)之畫面,周而復始下去。按下按鈕,程序就結(jié)束了。Step-1: 建立 Android 應用程序項目:Ex10-01。10Se237Step-2:/ AbstractSAbstractSee.java

13、Step-3:Se_VSe_E/ Se_V.java/ Se_E.javapackage com.misoo.kx;import android.app.Activity; import android.content.Context; import android.content.ent;public class S e_E extends AbstractS e Override protected void handle(Context ctx) entent = newent(ctx, EditAct.class); (Activity)ctx).startActivityForRes

14、ult(ent, 100);package com.misoo.kx;import android.app.Activity; import android.content.Context; import android.content.ent;public class S e_V extends AbstractS e Override protected void handle(Context ctx) entent = newent(ctx, ViewAct.class); (Activity)ctx).startActivityForResult(ent, 101);package c

15、om.misoo.kx;import android.content.Context;public abstract class AbstractS e protected abstract void handle(Context ctx);238AndroidStep-4:ActivityViewActEditAct/ ViewAct.java/ EditAct.javapackage com.misoo.kx; import android.app.Activity; import android.content.ent; import android.os.Bundle; import

16、android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class EditAct extendivity implements OnClickListener private Button btn, btn2;Override public void onCreate(Bundle icicle) package com.misoo.kx; import android.app.Activity; import android.content.ent; imp

17、ort android.os.Bundle; import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class ViewAct extendivity implements OnClickListener private Button btn, btn2;Override public void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.act)

18、;btn = (Button)findViewById(R.id.btn); btn.setBackgroundResource(R.drawable.x_jd);btn.setText(Exit from action.VIEW);btn.setOnClickListener(this); btn2 = (Button)findViewById(R.id.btn_next);btn2.setOnClickListener(this);public void onClick(View arg0) Bundundle = new Bundle();if(arg0 = btn)bundle.put

19、String(DataKey, Exit);elsebundle.putString(DataKey, Next); ent ment = newent();ment.putExtras(bundle); setResult(RESULT_OK, ment); finish();10Se239Step-5:Activityac01/ ac01.javapackage com.misoo.kx;import android.app.Activity; import android.content.Context; import android.content.ent; import androi

20、d.os.Bundle; import android.view.; import android.view.Item;public class ac01 extendivity public sic finalGO_ID =.; public sic finalEXIT_ID =.+ 1; private Controller ctrl;Override public void onCreate(Bundle icicle) super.onCreate(icicle);setContentView(R.layout.main); ctrl = new Controller();Overri

21、de publiconCreateOptions() super.onCreateOptions();.add(0, GO_ID, 0, Go);.add(0, EXIT_ID, 1, Exit);return true; Override publiconOptionsItemSelected(Item item) switch (item.getItemId() case GO_ID:ctrl.Request(this);break; case EXIT_ID:finish();break;return super.onOptionsItemSelected(item);protected

22、 void onActivityResult(reqode,resultCode,ent data) String data_str = (String)data.getCharSequenceExtra(DataKey);super.onCreate(icicle);setContentView(R.layout.act);btn = (Button)findViewById(R.id.btn); btn.setBackgroundResource(R.drawable.x_blue);btn.setText(Exit from action.EDIT);btn.setOnClickList

23、ener(this);btn2 = (Button)findViewById(R.id.btn_next);btn2.setOnClickListener(this);public void onClick(View arg0) Bundundle = new Bundle();if(arg0 = btn)bundle.putString(DataKey, Exit);elsebundle.putString(DataKey, Next); ent ment = newent();ment.putExtras(bundle);setResult(RESULT_OK, ment);finish(

24、);240Androidctrl.Request();onOptionsItemSelected()ctrlSe_VControllerRequest()goto_V()(V)se = new Se_V();Se_Vse.handle()ViewActEditActViewActViewActRequest()Sac01e_Eif(data_str.contains(Next)ctrl.Request(this);elsefinish();/class Controller private char s e_var;private AbstractS e s e;Controller()e_v

25、ar = I;public void Reqontext ctx) switch(s e_var) case I:this.goto_V();break; case V: this.goto_E();break; case E:this.goto_V();break;s e.handle(ctx);public char get_s e()return s e_var;public void set_s e(char k)s e_var = k;private void goto_E()s e_var = E;s e = new S e_E();private void goto_V()s e

26、_var = V;s e = new S e_V();10Se24110-1210-12SeSeSe_VSe_EActivitySeViewActSe_VEditActViewActSe_EEditActSeAndroid242Android 設計招式之美10.3Android 框架與 Se 模式如何從 Android 畫面的變化中找出狀態(tài)及其轉(zhuǎn)移呢?這是大家最常提出的問題。其實,一個系統(tǒng)的狀態(tài)變化并非本質(zhì)性(Essence)的,而是因觀點(View)而有所不同的。從不同的觀點可看到不同的狀態(tài)及其變化。請您想一想,電梯的狀態(tài)有那些呢?可將電梯設計成兩種狀態(tài):升降中與停止中。也可以設計為三個狀態(tài)

27、:停在一樓、停在二樓和停在三樓。這些看法都沒錯,重要的是:您必須為不同場合和目的而挑選最適當?shù)臓顟B(tài)設計。以上三個觀點都針對同一個對象:電梯,而做出不同之設計。同樣的道理,在 Android 應用程序里,從它的畫面布局(Layout)之變化,可以聯(lián)想到它的狀態(tài)變化。由于它的狀態(tài)變化是人們眼睛看得到的,簡單易用,是個合宜的狀態(tài)設計。換句話說,我們不要拘泥于:系統(tǒng)本質(zhì)上有多少狀態(tài)。而應該問的是:分為那些狀態(tài)最能幫助組織您的軟件程序,達到控制系統(tǒng)之目標。所以針對上述的問題,其最容易的答案是:從 Android 的畫面布局(Layout)聯(lián)想到狀態(tài)。一開始,不需要太完美的切入點,只要一個 Layout

28、對應到一個狀態(tài)就行了。例如,有一個 MP4 影片播放應用程序,其操作過程及畫面如下: 首先出現(xiàn)第 1 個畫面:第 10 章Se 樣式 243這表示有兩支 MP4 影片可供選擇。 如果你選取第 2 支影片(名為 good),就會出現(xiàn)一個新畫面(正在下載影片的畫面),如下: 下載完畢時,就轉(zhuǎn)換到另一個新畫面(正在播放影片的畫面),如下:244Android 設計招式之美 如果按下鍵,就結(jié)束了。剛才已經(jīng)說明了,想從 Android 畫面的變化中找出狀態(tài)之變化,其最容易的答案是:從 Android 的畫面布局聯(lián)想到狀態(tài)。于是將上述 3 個畫面對應到 3 個狀態(tài),如下圖:圖 10-13MP4 影片播放程

29、序的狀態(tài)變化此應用程序一開始,先處于 Selecting狀態(tài),等待你選取一支影片。一旦你選取了影片,就進入 Loading 狀態(tài),開始下載影片。下載完畢就進入 Playing 狀態(tài),開始播放影片。從上圖可看出,此應用程序在其生命周期(Lifecycle)里,共會歷經(jīng) 3 個狀態(tài),于是我們可以規(guī)劃 3 個狀態(tài)類別。由于這 3 個狀態(tài)類別,都是由關(guān)于畫面布局之行為,所以能繼承 Activity 抽象類別的一些行為,會更容易實現(xiàn)畫面的布局。所以這些狀態(tài)類別的結(jié)構(gòu)如下圖:10Se24510-14MP4Android10-14AndroidEx10-02246Android 設計招式之美Step-2:

30、撰寫 AbstractSe 類別。/ AbstractSe.javaStep-3: 撰寫與 Selecting 狀態(tài)有關(guān)的類別:Row、myAdapter 和 SelectingSe。/ Row.java/ myAdapter.javapackage com.misoo.pkmm;import java.util.ArrayList;package com.misoo.pkmm;public class Row private String text;privateresid;Row(String tx,id) text = tx; resid = id; publicgetDwId() re

31、turn resid; public String getText() return text; publiciectable() return true;package com.misoo.pkmm;import android.app.Activity;public abstract class AbstractS e extendivity10Se247/ SelectingSe.javapackage com.misoo.pkmm; import java.util.ArrayList; import android.content.ent; import android.os.Bun

32、dle; import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.content.Context; import android.graphics.Color; import android.view.View; import android.view.ViewGroup;import android.widget.BaseAdapter; import android.widget.ImageView; import android.wid

33、get.LinearLayout; import android.widget.TextView;public class myAdapter extends BaseAdapter private finalWC = ViewGroup.LayoutParams.WRAP_CONTENT;private Context ctx;private ArrayList coll;public myAdapter(Context context, ArrayList list)ctx = context;coll = list;publicgetCount() return coll.size();

34、public Object getItem(ition) return coll.get(ition);public long getItemId(ition) returnition;public View getView(ition, View convertView, ViewGroup parent) LinearLayout layout = new LinearLayotx);layout.setOrien ion(LinearLayout.HORIZONTAL); Row rw = (Row)coll.get(ition);ImageView iv = new ImageView

35、(ctx); iv.setImageResource(rw.getDwId();iv.setPadding(0, 2, 5, 0); LinearLayout.LayoutParams param= new LinearLayout.LayoutParams(WC, WC); layout.addView(iv, param);TextView txv = new TextView(ctx);txv.setText(rw.getText(); txv.setTextColor(Color.WHITE);txv.setTextSize(26); LinearLayout.LayoutParams

36、 param2= new LinearLayout.LayoutParams(WC, WC); param2.leftMargin = 5;param2.topMargin = 13; layout.addView(txv, param2);return layout;248AndroidStep-4:LoadingLoadService myBinderLoadingSe/ LoadService.javapackage com.misoo.pkmm; import android.app.Service; import android.content.ent; import android

37、.os.IBinder;public class LoadService extends Service private IBinder mBinder = null; Override public void onCreate()import android.widget.AdapterView.OnItemClickListener;public clasectingS e extends AbstractS e implements OnItemClickListener private ArrayList coll;Override public void onCreate(Bundl

38、e icicle) super.onCreate(icicle); setContentView(R.layout.main);coll = new ArrayList();coll.add(new Row(nice,R.drawable.mp4_icon) ); coll.add(new Row(good, R.drawable.mp4_icon_2); coll.add(new Row(Exit, R.drawable.icon2);ListView lv = new ListView(this);lv.setAdapter(new myAdapter(this, coll); lv.se

39、tOnItemClickListener(this);setContentView(lv);public void onItemClick(AdapterView arg0, View arg1,arg2, long arg3) if(arg2 = 0) entent = newent(this, LoadingS e.class); ent.putExtra(resid, R.raw.nice);this.startActivityForResult(ent, 0);else if(arg2 = 1)entent = newent(this, LoadingS e.class); ent.p

40、utExtra(resid, R.raw.good);this.startActivityForResult(ent, 0);else if(arg2 = 2) finish();Overrideprotected void onActivityResult(reqode,resultCode,ent data) entent = newent(this, PlayingS e.class);startActivity(ent);10Se249/ myBinder.javaStep-5:PlayingMySurfaceViewPlayingSepackage com.misoo.pkmm;im

41、port java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream;import android.content.Context; import android.os.Binder; import android.os.Parcel;public class myBinder extends Binderprivate Context ctx;privaterid = 0;public myBinder(Context cx)ctx= cx;Override public

42、onTran(code, Parcel data, Parcel reply,flags)throws android.os.RemoteException rid = data.read();saveMP4(rid);return true;public void saveMP4(rid) String fname = nice01.mp4; FileOutputStream os = null;try os = ctx.openFileOutput(fname, Context.MODE_WORLD_READABLE); catch (FileNotFoundException e1) e

43、1.prStackTrace();return; InputStream is = ctx.getResour().openRawResource(rid);/rd_size;bufSize=10*1024;byte buffer= new bytebufSize;k= 0;try rd_size = is.read(buffer);while(rd_size = 0) os.write(buffer); k+;rd_size = is.read(buffer);os.flush();os.close();catch (Exception e1) return;mBinder = new my

44、Binder(getApplicationContext(); Override public IBinder onBind(entent) return mBinder;250Android/ MySurfaceView.javapackage com.misoo.pkmm;import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer;import android.mediapletionListener; import android.media.Med

45、iaPlayer.OnPreparedListener; import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MySurfaceView extendrfaceView implementrfaceHolder.Callback, OnPreparedListener,pletionListener private final String FILE_NAME = nice01.mp4;private SurfaceHolder mHolde

46、r;private String path;private MThread mThread;private MediaPlayer mMediaPlayer;MySurfaceView(Context context) super(context);mHolder = getHolder(); mHolder.addCallback(this);mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); public void surfaceCreated(SurfaceHolder holder) mThread = new MThre

47、ad();mThread.start();public void onPrepared(MediaPlayer mediaplayer)mMediaPlayer.start();public voidpletion(MediaPlayer arg0)Log.d(Com, pletion called);public void surfaceDestroyed(SurfaceHolder holder)mMediaPlayer.stop();public void surfaceChanged(SurfaceHolder holder,format,width, height) /class M

48、Thread extends Thread MThread() super(); try path = .misoo.pkmm/files/+FILE_NAME; mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); mMediaPlayer.setDisplay(mHolder);mWidth = mMediaPlayer.getWidth();10Se251/ PlayingSe.javapackage com.misoo.pkmm; import android.os.Bundle; import andr

49、oid.view.KeyEvent; import android.widget.CheckBox;importpoundButton;import android.widget.LinearLayout;importpoundButton.OnCheckedChangeListener;public class PlayingS e extends AbstractS e implements OnCheckedChangeListenerprivate finalWC = LinearLayout.LayoutParams.WRAP_CONTENT;Override public void

50、 onCreate(Bundle savedInstane) super.onCreate(savedInstane); this.show_layout_01();public void show_layout_01() LinearLayout.LayoutParams para,para2; LinearLayout layout_01 = new LinearLayout(this); layout_01.setOrien ion(LinearLayout.VERTICAL); CheckBox cx = new CheckBox(this); cx.setText(Stop);cx.

51、setChecked(false); cx.setOnCheckedChangeListener( this);para = new LinearLayout.LayoutParams(WC, WC);para.leftMargin = 30;para.topMargin = 15;layout_01.addView(cx, para); MySurfaceView sv = new MySurfaceView(this);para2 = new LinearLayout.LayoutParams(WC, WC); para2.leftMargin = 1;para2.topMargin = 3; layout_01.addView(sv,para2);setTitle(Check to start/stop, or press to exit); setContentView(layout_01);public void show_layout_02()mHeight = mMediaPlayer.getHeight();if (mWidth

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論