




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android程序員必須知道的53個(gè)知識(shí)點(diǎn)1. android單實(shí)例運(yùn)行方法我們都知道Android平臺(tái)沒(méi)有任務(wù)管理器,而內(nèi)部App維護(hù)者一個(gè)Activityhistorystack來(lái)實(shí)現(xiàn)窗口顯示和銷(xiāo)毀,對(duì)于常規(guī)從快捷方式運(yùn)行來(lái)看都是startActivity可能會(huì)使用FLAG_ACTIVITY_NEW_TAS麻記來(lái)打開(kāi)一個(gè)新窗口,比如Launcher,所以考慮單任務(wù)的實(shí)現(xiàn)方法比較簡(jiǎn)單,首先Android123糾正下大家一種錯(cuò)誤的方法就是直接在androidmanifest.xml的application節(jié)點(diǎn)中加入android:launchMode=singleInstance這句,其實(shí)這樣
2、將不會(huì)起到任何作用,Apps內(nèi)部維護(hù)的歷史棧作用于Activity,我們必須在activity節(jié)點(diǎn)中加入android:launchMode=singleInstance這句才能保證單實(shí)例,當(dāng)然一般均加在主程序啟動(dòng)窗口的Activity。2. px像素如何轉(zhuǎn)為dip設(shè)備獨(dú)立像素:最近有網(wǎng)友問(wèn)如何將px像素車(chē)專(zhuān)為dip獨(dú)立設(shè)備像素,由于Android的設(shè)備分辨率眾多,目前主流的為wvga,而很多老的設(shè)備為hvga甚至低端的qvga,對(duì)于兼容性來(lái)說(shuō)使用dip無(wú)非是比較方便的,由于他和分辨率無(wú)關(guān)和屏幕的密度大小有關(guān),所以推薦使用。px=(int)(dip*density+0.5f)/這里androi
3、d開(kāi)發(fā)網(wǎng)提示大家很多網(wǎng)友獲取density(密度)的方法存在問(wèn)題,從資源中獲取的是靜態(tài)定義的,一般為1.0對(duì)于HVGA是正好的,而對(duì)于wvga這樣的應(yīng)該從WindowsManager中獲取,WVGA為1.5這里可以再補(bǔ)充一下dip,sip的知識(shí)3. Android中動(dòng)態(tài)改變ImageView大小大小很多網(wǎng)友可能發(fā)現(xiàn)在layout.xml文件中定義了ImageView的絕對(duì)大小后,無(wú)法動(dòng)態(tài)修改以后的大小顯示,其實(shí)Android平臺(tái)在設(shè)計(jì)UI控件時(shí)考慮到這個(gè)問(wèn)題,為了適應(yīng)不同的Drawable可以通過(guò)在xml的相關(guān)ImageView中加入android:scaleType=fitXY這行即可,但因
4、為使用了縮放可能會(huì)造成當(dāng)前UI有所變形。使用的前提是限制ImageView所在的層,可以使用一個(gè)內(nèi)嵌的方法限制顯示。4. 如何判斷Android手機(jī)當(dāng)前是否聯(lián)網(wǎng)?如果擬開(kāi)發(fā)一個(gè)網(wǎng)絡(luò)應(yīng)用的程序,首先考慮是否接入網(wǎng)絡(luò),在Android手機(jī)中判斷是否聯(lián)網(wǎng)可以通過(guò)ConnectivityManager類(lèi)的isAvailable()方法判斷,首先獲取網(wǎng)絡(luò)通訊類(lèi)的實(shí)例ConnectivityManagercwjManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);使用cwjManager.getActiveN
5、etworkInfo().isAvailable();來(lái)返回是否有效,如果為T(mén)rue則表示當(dāng)前Android手機(jī)已經(jīng)聯(lián)網(wǎng),可能是WiFi或GPRSHSDPA等等,具體的可以通過(guò)ConnectivityManager類(lèi)的getActiveNetworkInfo()方法判斷詳細(xì)的接入方式,需要注意的是有關(guān)調(diào)用需要加入這個(gè)權(quán)限,android開(kāi)發(fā)網(wǎng)提醒大家在真機(jī)上Market和Browser程序都使用了這個(gè)方法,來(lái)判斷是否繼續(xù),同時(shí)在一些網(wǎng)絡(luò)超時(shí)的時(shí)候也可以檢查下網(wǎng)絡(luò)連接是否存在,以免浪費(fèi)手機(jī)上的電力資源。5. Drawable、Bitmap、Canvas和和Paint的關(guān)系很多網(wǎng)友剛剛開(kāi)始學(xué)習(xí)An
6、droid平臺(tái),對(duì)于Drawable、BitmapCanvas和Paint它們之間的概念不是很清楚,其實(shí)它們除了Drawable外早在Sun的J2ME中就已經(jīng)出現(xiàn)了,但是在Android平臺(tái)中,Bitmap、Canvas相關(guān)的都有所變化。首先讓我們理解下Android平臺(tái)中的顯示類(lèi)是View,但是還提供了底層圖形類(lèi)android.graphics,今天所說(shuō)的這些均為graphics底層圖形接口。Bitmap-稱(chēng)作位圖,一般位圖的文件格式后綴為bmp,當(dāng)然編碼器也有很多如RGB565、RGB888。作為一種逐像素的顯示對(duì)象執(zhí)行效率高,但是缺點(diǎn)也很明顯存儲(chǔ)效率低。我們理解為一種存儲(chǔ)對(duì)象比較好。Dr
7、awable-作為Android平下通用的圖形對(duì)象,它可以裝載常用格式的圖像,比如GIF、PNG、JPG當(dāng)然也支持bmp,當(dāng)然還提供一些高級(jí)的可視化對(duì)象,比如漸變、圖形等。Canvas-名為畫(huà)布,我們可以看作是一種處理過(guò)程,使用各種方法來(lái)管理Bitmap、GL或者Path路徑,同時(shí)它可以配合Matrix矩陣類(lèi)給圖像做旋轉(zhuǎn)、縮放等操作,同時(shí)Canvas類(lèi)還提供了裁剪、選取等操作。Paint-我們可以把它看做一個(gè)畫(huà)圖工具,比如畫(huà)筆、畫(huà)刷。他管理了每個(gè)畫(huà)圖工具的字體、顏色、樣式。如果涉及一些Android游戲開(kāi)發(fā)、顯示特效可以通過(guò)這些底層圖形類(lèi)來(lái)高效實(shí)現(xiàn)自己的應(yīng)用。6. Activity切換導(dǎo)致的o
8、nCreate重復(fù)執(zhí)行部分網(wǎng)友會(huì)發(fā)現(xiàn)Activity在切換到后臺(tái)或布局從橫屏LANDSCAPE切換到PORTRAIT會(huì)重新切換Activity會(huì)觸發(fā)一次onCreate方法,我們可以在androidmanifest.xml中的activit元素加入這個(gè)屬性android:configChanges=orientation|keyboardHidden即可,比如同時(shí)在Activity的Java文件中重載onConfigurationChanged(ConfigurationnewConfig)這個(gè)方法,這樣就不會(huì)在布局切換或窗口切換時(shí)重載onCreate等方法。代碼如下:Overridepubl
9、icvoidonConfigurationChanged(ConfigurationnewConfig)super.onConfigurationChanged(newConfig);if(this.getResources().getConfiguration().orientation=Configuration.ORIENTATION_LANDSCAPE)(/land)elseif(this.getResources().getConfiguration().orientation=Configuration.ORIENTATION_PORTRAIT)(/port)7. Android的
10、的ImageButton問(wèn)題問(wèn)題很多網(wǎng)友對(duì)Android提供的ImageButton有個(gè)疑問(wèn),當(dāng)顯示Drawable圖片時(shí)就不會(huì)再顯示文字了,其實(shí)解決的方法有兩種,第一種就是圖片中就寫(xiě)入文字,但是這樣解決會(huì)增加程序體積,同時(shí)硬編碼方式會(huì)影響多國(guó)語(yǔ)言的發(fā)布。第二種解決方法很簡(jiǎn)單,通過(guò)分析可以看到ImageButton的layout,我們可以直接直接繼承,添加一個(gè)TextView,對(duì)齊方式為右側(cè)即可實(shí)現(xiàn)ImageButton支持文字右側(cè)顯示。8. Android代碼優(yōu)化技術(shù)I.Java內(nèi)存控制對(duì)于字符串操作而言如果需要連加這樣的操作建議使用StringBuilder,經(jīng)過(guò)調(diào)試不難發(fā)現(xiàn)如果你的字符串
11、每次連加,使用String需要的內(nèi)存開(kāi)銷(xiāo)會(huì)遠(yuǎn)大于StringBuilder,然后Android手機(jī)常規(guī)的運(yùn)行內(nèi)存大約在128MB左右,對(duì)于運(yùn)行多任務(wù)就需要考慮了,Android開(kāi)發(fā)網(wǎng)提示因?yàn)镴ava有GC不需要手動(dòng)釋放那么分配的時(shí)候就要格外的小心,頻繁的GC操作仍然是很影響性能的,在調(diào)試時(shí)我們可以通過(guò)logcat查看內(nèi)存釋放情況。2 .循環(huán)使用平時(shí)在訪問(wèn)一個(gè)屬性的時(shí)候效率遠(yuǎn)比一個(gè)固定變量低,如果你的循環(huán)估計(jì)次數(shù)常常大于5,假設(shè)xxx.GetLength()方法的值一般大于5,推薦這樣寫(xiě),比如for(inti=0;ixxx.GetLength();i+)這里xxx.GetLength在每次循環(huán)都
12、要調(diào)用,必然會(huì)影響程序效率,在游戲開(kāi)發(fā)中顯得更為明顯,改進(jìn)的方法應(yīng)該為intj=xxx.GetLength()for(inti=0;ij;i+)3 .圖片的優(yōu)化在Android平臺(tái)中2維圖像處理庫(kù)BitmapFactory做的比較智能,為了減少文件體積和效率,常常不用很多資源文件,而把很多小圖片放在一個(gè)圖片中,有切片的方式來(lái)完成,在J2ME中我們這樣是為了將少文件頭而解決MIDP這些設(shè)備的問(wèn)題,而Android中雖然機(jī)型硬件配置都比較高,有關(guān)AndroidG1硬件配置可以參考G1手機(jī)參數(shù)以及評(píng)測(cè),但是當(dāng)資源多時(shí)這樣的運(yùn)行效率還是令人滿(mǎn)意的,至少Dalvik優(yōu)化的還不是很夠。9 .Android
13、開(kāi)發(fā)進(jìn)階之NIO非阻塞包()對(duì)于Android的網(wǎng)絡(luò)通訊性能的提高,我們可以使用Java上高性能的NIO(NewI/O)技術(shù)進(jìn)行處理,NIO是從JDK1.4開(kāi)始引入的,NIO的N我們可以理解為Noblocking即非阻塞的意思,相對(duì)應(yīng)傳統(tǒng)的I/O,比如Socket的accpet()、read()這些方法而言都是阻塞的。NIO主要使用了Channel和Selector來(lái)實(shí)現(xiàn),Java的Selector類(lèi)似Winsock的Select模式,是一種基于事件驅(qū)動(dòng)的,整個(gè)處理方法使用了輪訓(xùn)的狀態(tài)機(jī),如果你過(guò)去開(kāi)發(fā)過(guò)Symbian應(yīng)用的話這種方式有點(diǎn)像活動(dòng)對(duì)象,好處就是單線程更節(jié)省系統(tǒng)開(kāi)銷(xiāo),NIO的好處可
14、以很好的處理并發(fā),對(duì)于Android網(wǎng)游開(kāi)發(fā)來(lái)說(shuō)比較關(guān)鍵,對(duì)于多點(diǎn)Socket連接而言使用NIO可以大大減少線程使用,降低了線程死鎖的概率,畢竟手機(jī)防戲有UI線程,音樂(lè)線程,網(wǎng)絡(luò)線程,管理的難度可想而知,同時(shí)I/O這種低速設(shè)備將影響游戲的體驗(yàn)。NIO作為一種中高負(fù)載的I/O模型,相對(duì)于傳統(tǒng)的BIO(BlockingI/O)來(lái)說(shuō)有了很大的提高,處理并發(fā)不用太多的線程,省去了創(chuàng)建銷(xiāo)毀的時(shí)間,如果線程過(guò)多調(diào)度是問(wèn)題,同時(shí)很多線程可能處于空閑狀態(tài),大大浪費(fèi)了CPU時(shí)間,同時(shí)過(guò)多的線程可能是性能大幅下降,一般的解決方案中可能使用線程池來(lái)管理調(diào)度但這種方法治標(biāo)不治本。使用NIO可以使并發(fā)的效率大大提高。當(dāng)
15、然NIO和JDK7中的AIO還存在一些區(qū)別,AIO作為一種更新的當(dāng)然這是對(duì)于Java而言,如果你開(kāi)發(fā)過(guò)Winsock服務(wù)器,那么IOCP這樣的I/O完成端口可以解決更高級(jí)的負(fù)載,當(dāng)然了今天Android123主要給大家講解下為什么使用NIO在Android中有哪些用處。NIO我們分為幾個(gè)類(lèi)型分別描述,作為Java的特性之一,我們需要了解一些新的概念,比如ByteBuffer類(lèi),Channel,SocketChannel,ServerSocketChannel,Selector和SelectionKey。有關(guān)具體的使用,Android開(kāi)發(fā)網(wǎng)將在明天詳細(xì)講解。網(wǎng)友可以在AndroidSDK文檔中看
16、下java.nio和java.nio.channels兩個(gè)包了解。10 .AndroidTheme和和Styles內(nèi)部定義解析昨天我們講到的有關(guān)在AndroidManifest.xml中定義Activity的theme方法來(lái)實(shí)現(xiàn)無(wú)標(biāo)題的方法,在使用xml讓你的Activity無(wú)標(biāo)題方法一文中講到的,很多網(wǎng)友不明白為什么這樣做,其實(shí)在Android123以前的文章中多次提到了styles樣式定義方法,今天Android開(kāi)發(fā)網(wǎng)再次把一些網(wǎng)友回顧了解下android樣式的內(nèi)部定義。在一個(gè)工程的res/values/theme.xml中我們可以方便的定義自己的風(fēng)格主題,比如下面的cwjTheme中我們
17、使用了基于android內(nèi)部的白色調(diào)的背景Theme.Light,設(shè)置windowsNoTitle為true代表沒(méi)有標(biāo)題,背景顏色我們使用了android內(nèi)部定義的透明,同時(shí)設(shè)置listView控件的樣式為cwjListView,xml樣式代碼如下:trueandroid:color/transparentstyle/cwjListView有關(guān)ListView控件我們自定義的風(fēng)格就是修改下系統(tǒng)listview這個(gè)控件的每行分隔符樣式,這里我們?cè)诠こ滔聄es/drawable文件夾下放一個(gè)圖片名為list_selector圖片,這樣我們的cwjListView的代碼可以這樣寫(xiě)drawable/l
18、ist_selector通過(guò)定義style可以設(shè)置更多,比如讓cwjListView的字體顏色就加入textAppearance屬性,比如android:style/TextAppearance等等。11 .AndroidJSON解析示例代碼來(lái)自Google官方的有關(guān)Android平臺(tái)的JSON解析示例,如果遠(yuǎn)程服務(wù)器使用了json而不是xml的數(shù)據(jù)提供,在Android平臺(tái)上已經(jīng)內(nèi)置的org.json包可以很方便的實(shí)現(xiàn)手機(jī)客戶(hù)端的解析處理。下面Android123起分析下這個(gè)例子,幫助Android開(kāi)發(fā)者需要有關(guān)HTTP通訊、正則表達(dá)式、JSON解析、appWidget開(kāi)發(fā)的一些知識(shí)。pub
19、licclassWordWidgetextendsAppWidgetProvider/appWidgetOverridepublicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int口appWidgetIds)context.startService(newIntent(context,UpdateService.class);/避免ANR,所以Widget中開(kāi)了個(gè)服務(wù)publicstaticclassUpdateServiceextendsServiceOverridepublicvoidonStart(Inten
20、tintent,intstartId)/BuildthewidgetupdatefortodayRemoteViewsupdateViews=buildUpdate(this);ComponentNamethisWidget=newComponentName(this,WordWidget.class);AppWidgetManagermanager=AppWidgetManager.getInstance(this);manager.updateAppWidget(thisWidget,updateViews);publicRemoteViewsbuildUpdate(Contextcont
21、ext)/PickoutmonthnamesfromresourcesResourcesres=context.getResources();String口monthNames=res.getStringArray(R.array.month_names);Timetoday=newTime();today.setToNow();StringpageName=res.getString(R.string.template_wotd_title,monthNamestoday.month,today.monthDay);RemoteViewsupdateViews=null;Stringpage
22、Content=;trySimpleWikiHelper.prepareUserAgent(context);pageContent=SimpleWikiHelper.getPageContent(pageName,false);catch(ApiExceptione)Log.e(WordWidget,CouldntcontactAPI,e);catch(ParseExceptione)Log.e(WordWidget,CouldntparseAPIresponse,e);/正則表達(dá)式處理,有關(guān)定義見(jiàn)下面的SimpleWikiHelper類(lèi)Patternpattern=Ppile(Simple
23、WikiHelper.WORD_OF_DAY_REGEX);Matchermatcher=pattern.matcher(pageContent);if(matcher.find()updateViews=newRemoteViews(context.getPackageName(),R.layout.widget_word);StringwordTitle=matcher.group(1);updateViews.setTextViewText(R.id.word_title,wordTitle);updateViews.setTextViewText(R.id.word_type,matc
24、her.group(2);updateViews.setTextViewText(R.id.definition,matcher.group(3).trim();StringdefinePage=res.getString(R.string.template_define_url,Uri.encode(wordTitle);IntentdefineIntent=newIntent(Intent.ACTION_VIEW,Uri.parse(definePage);/這里是打開(kāi)相應(yīng)的網(wǎng)頁(yè),所以Uri是http的url,action是view即打開(kāi)web瀏覽器PendingIntentpending
25、Intent=PendingIntent.getActivity(context,0/*norequestCode*/,defineIntent,0/*noflags*/);updateViews.setOnClickPendingIntent(R.id.widget,pendingIntent);/單擊Widget打開(kāi)ActivityelseupdateViews=newRemoteViews(context.getPackageName(),R.layout.widget_message);CharSequenceerrorMessage=context.getText(R.string.
26、widget_error);updateViews.setTextViewText(R.id.message,errorMessage);returnupdateViews;OverridepublicIBinderonBind(Intentintent)/Wedontneedtobindtothisservicereturnnull;)有關(guān)網(wǎng)絡(luò)通訊的實(shí)體類(lèi),以及一些常量定義如下:publicclassSimpleWikiHelperprivatestaticfinalStringTAG=SimpleWikiHelper;publicstaticfinalStringWORD_OF_DAY_R
27、EGEX=(?s)wotd|(.+?)|(.+?)|(r#|+).*?;privatestaticfinalStringWIKTIONARY_PAGE=http:/w/api.php?action=query&prop=revisions&titles=%s&+rvprop=content&format=json%s;privatestaticfinalStringWIKTIONARY_EXPAND_TEMPLATES=&rvexpandtemplates=true;privatestaticfinalintHTTP_STATUS_OK=200;private
28、staticbytesBuffer=newbyte512;privatestaticStringsUserAgent=null;publicstaticclassApiExceptionextendsExceptionpublicApiException(StringdetailMessage,Throwablethrowable)super(detailMessage,throwable);publicApiException(StringdetailMessage)super(detailMessage);publicstaticclassParseExceptionextendsExce
29、ptionpublicParseException(StringdetailMessage,Throwablethrowable)super(detailMessage,throwable);publicstaticvoidprepareUserAgent(Contextcontext)try/ReadpackagenameandversionnumberfrommanifestPackageManagermanager=context.getPackageManager();PackageInfoinfo=manager.getPackageInfo(context.getPackageNa
30、me(),0);sUserAgent=String.format(context.getString(R.string.template_user_agent),info.packageName,info.versionName);catch(NameNotFoundExceptione)Log.e(TAG,CouldntfindpackageinformationinPackageManager,e);publicstaticStringgetPageContent(Stringtitle,booleanexpandTemplates)throwsApiException,ParseExce
31、ptionStringencodedTitle=Uri.encode(title);StringexpandClause=expandTemplates?WIKTIONARY_EXPAND_TEMPLATES:Stringcontent=getUrlContent(String.format(WIKTIONARY_PAGE,encodedTitle,expandClause);tryJSONObjectresponse=newJSONObject(content);JSONObjectquery=response.getJSONObject(query);JSONObjectpages=que
32、ry.getJSONObject(pages);JSONObjectpage=pages.getJSONObject(String)pages.keys().next();JSONArrayrevisions=page.getJSONArray(revisions);JSONObjectrevision=revisions.getJSONObject(0);returnrevision.getString(*);catch(JSONExceptione)thrownewParseException(ProblemparsingAPIresponse,e);protectedstaticsync
33、hronizedStringgetUrlContent(Stringurl)throwsApiExceptionif(sUserAgent=null)thrownewApiException(User-Agentstringmustbeprepared);HttpClientclient=newDefaultHttpClient();HttpGetrequest=newHttpGet(url);request.setHeader(User-Agent,sUserAgent);/設(shè)置客戶(hù)端標(biāo)識(shí)tryHttpResponseresponse=client.execute(request);Stat
34、usLinestatus=response.getStatusLine();if(status.getStatusCode()!=HTTP_STATUS_OK)thrownewApiException(Invalidresponsefromserver:+status.toString();HttpEntityentity=response.getEntity();InputStreaminputStream=entity.getContent();/獲取HTTP返回的數(shù)據(jù)流ByteArrayOutputStreamcontent=newByteArrayOutputStream();intr
35、eadBytes=0;while(readBytes=inputStream.read(sBuffer)!=-1)content.write(sBuffer,0,readBytes);/轉(zhuǎn)化為字節(jié)數(shù)組流returnnewString(content.toByteArray();/從字節(jié)數(shù)組構(gòu)建Stringcatch(IOExceptione)thrownewApiException(ProblemcommunicatingwithAPI,e);有關(guān)整個(gè)每日維基的widget例子比較簡(jiǎn)單,主要是幫助大家積累常用代碼,了解Android平臺(tái)JSON的處理方式,畢竟很多Server還是Java的。1
36、2 .Android中使用定時(shí)器TimerTask類(lèi)介紹在Android平臺(tái)中需要反復(fù)按周期執(zhí)行方法可以使用Java上自帶的TimerTask類(lèi),TimerTask相對(duì)于Thread來(lái)說(shuō)對(duì)于資源消耗的更低,除了使用Android自帶的AlarmManager使用Timer定時(shí)器是一種更好的解決方法。我們需要引入importjava.util.Timer;和importjava.util.TimerTask;privateTimermTimer=newTimer(true);privateTimerTaskmTimerTask;mTimerTask=newTimerTask()publicvoi
37、drun()Log.v(android123,cwj);mTimer.schedule(mTimerTask,5000,1000);/在1秒后每5秒執(zhí)行一次定時(shí)器中的方法,比如本文為調(diào)用log.v打印輸出。如果想取消可以調(diào)用下面方法,取消定時(shí)器的執(zhí)行while(!mTimerTask.cancel();mTimer.cancel();最后Android123提示大家,如果處理的東西比較耗時(shí)還是開(kāi)個(gè)線程比較好,Timer還是會(huì)阻塞主線程的執(zhí)行,更像是一種消息的執(zhí)行方式。當(dāng)然比Handler的postDelay等方法更適合處理計(jì)劃任務(wù)。13 .Android應(yīng)用應(yīng)用Icon大小在不同分辨率下定義對(duì)
38、于Android平臺(tái)來(lái)說(shuō),不同分辨率下Icon的大小設(shè)計(jì)有著不同的要求,對(duì)于目前主流的HDPI即WVGA級(jí)別來(lái)說(shuō),通常hdpi的應(yīng)用icon大小為72x72,而標(biāo)準(zhǔn)的mdpi即hvga為48x48,對(duì)于目前HTC和Motorola推出的一些QVGA的使用了ldpi,圖標(biāo)為32x32,常見(jiàn)的Android圖標(biāo)大小設(shè)計(jì)規(guī)范如下表所示:Launcher:36x36px48x48px72x72pxMenuMenuMenu:36x36px48x48px72x72pxStatusBar:24x24px32x32px48x48pxTabTabTab:24x24px32x32px48x48pxDialog:2
39、4x24px32x32px48x48pxListView:24x24px32x32px48x48px對(duì)于android界面設(shè)計(jì)的安全色,如下:而對(duì)于系統(tǒng)自帶默認(rèn)程序的圖標(biāo),下面為png的透明格式,直接鼠標(biāo)右鍵另存為即可:看看sdk文檔上的關(guān)于界面圖標(biāo)的詳細(xì)說(shuō)明。14 .Android控件美化Shape你會(huì)用嗎?如果你對(duì)Android系統(tǒng)自帶的UI控件感覺(jué)不夠滿(mǎn)意,可以嘗試下自定義控件,我們就以Button為例,很早以前Android123就寫(xiě)到過(guò)AndroidButton按鈕控件美化方法里面提到了xml的selector構(gòu)造。當(dāng)然除了使用drawable這樣的圖片外今天Android開(kāi)發(fā)網(wǎng)談下
40、自定義圖形shape的方法,對(duì)于Button控件Android上支持以下幾種屬性shape、gradientstrokecorners等。我們就以目前系統(tǒng)的Button的selector為例說(shuō)下:對(duì)于上面,這條shape的定義,分別為漸變,在gradient中startColor屬性為開(kāi)始的顏色,endColor為漸變結(jié)束的顏色,下面的angle是角度。接下來(lái)是stroke可以理解為邊緣,corners為拐角這里radius屬性為半徑,最后是相對(duì)位置屬性padding。對(duì)于一個(gè)Button完整的定義可以為selectorxmlns:android=注意Android123提示大家,以上幾個(gè)it
41、em的區(qū)別主要是體現(xiàn)在state_pressed按下或state_focused獲得焦點(diǎn)時(shí),當(dāng)當(dāng)來(lái)判斷顯示什么類(lèi)型,而沒(méi)有state_xxx屬性的item可以看作是常規(guī)狀態(tài)下。15 .Android開(kāi)發(fā)者應(yīng)該保持以下特質(zhì)Android123推薦新手應(yīng)該遵循1 .深讀SDK文檔2 .深讀SDK的APIDemo和Samples3 .掌握GIT開(kāi)源代碼4 .多了解Android開(kāi)源項(xiàng)目,學(xué)習(xí)別人的手法寫(xiě)程序。16 .Android數(shù)組排序常見(jiàn)方法Android的數(shù)組排序方式基本上使用了Sun原生的JavaAPI實(shí)現(xiàn),常用的有Comparator接口實(shí)現(xiàn)compare方法和Comparable接口的c
42、ompareTo方法,我們對(duì)于一個(gè)數(shù)組列表比如ArrayList可以通過(guò)這兩個(gè)接口進(jìn)行排序和比較,這里Android123給大家一個(gè)例子privatefinalComparatorcwjComparator=newComparator()privatefinalCollatorcollator=Collator.getInstance();publicfinalintcompare(Objecta,Objectb)CharSequencea=(Item)a).sName;CharSequenceb=(Item)b).sID;pare(a,b);我們的ArrayList對(duì)象名為mList,則執(zhí)行
43、排序可以調(diào)用方法Collections.sort(mList,cwjComparator);17 .Android控件控件TextProgressBar進(jìn)度條上顯文字Android系統(tǒng)的進(jìn)度條控件默認(rèn)的設(shè)計(jì)的不是很周全,比如沒(méi)有包含文字的顯示,那么如何在Android進(jìn)度條控件上顯示文字呢?來(lái)自Google內(nèi)部的代碼來(lái)了解下,主要使用的addView這樣的方法通過(guò)覆蓋一層Chronometer秒表控件來(lái)實(shí)現(xiàn),整個(gè)代碼如下publicclassTextProgressBarextendsRelativeLayoutimplementsOnChronometerTickListenerpublic
44、staticfinalStringTAG=TextProgressBar;staticfinalintCHRONOMETER_ID=android.R.id.text1;staticfinalintPROGRESSBAR_ID=android.R.gress;ChronometermChronometer=null;ProgressBarmProgressBar=null;longmDurationBase=-1;intmDuration=-1;booleanmChronometerFollow=false;intmChronometerGravity=Gravity.NO_GRAVITY;publicTextProgressBar(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 毛巾產(chǎn)品的生命周期評(píng)估考核試卷
- 社會(huì)心理學(xué)在人機(jī)交互設(shè)計(jì)中的應(yīng)用考核試卷
- 涂料配方設(shè)計(jì)考核試卷
- 電子元器件識(shí)別與應(yīng)用考核試卷
- 社交心理學(xué)與消費(fèi)者心理分析考核試卷
- 紡織機(jī)械的邊緣計(jì)算服務(wù)發(fā)展趨勢(shì)預(yù)測(cè)考核試卷
- 服裝批發(fā)過(guò)程中的質(zhì)量控制考核試卷
- 禽類(lèi)屠宰行業(yè)綠色可持續(xù)發(fā)展考核試卷
- 海底設(shè)施施工質(zhì)量控制與驗(yàn)收考核試卷
- 竹木材料在環(huán)境工程中的應(yīng)用考核試卷
- 2025年江蘇省徐州市銅山區(qū)中考一模道德與法治試題(原卷版+解析版)
- 制造業(yè)自檢自控流程優(yōu)化計(jì)劃
- 《人工智能的進(jìn)展》課件
- 風(fēng)濕免疫病患者結(jié)核病診治及預(yù)防實(shí)踐指南(2025版)解讀課件
- 大建安-大連市建筑工程安全檔案編制指南
- 上海2024-2025學(xué)年五年級(jí)數(shù)學(xué)第二學(xué)期期末聯(lián)考模擬試題含答案
- GB/T 45421-2025城市公共設(shè)施非物流用智能儲(chǔ)物柜服務(wù)規(guī)范
- 高中家長(zhǎng)會(huì) 高三高考沖刺家長(zhǎng)會(huì)課件
- 2025年湖南韶旅集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2024年全國(guó)統(tǒng)一高考英語(yǔ)試卷(新課標(biāo)Ⅰ卷)含答案
- 讀書(shū)分享讀書(shū)交流會(huì)《你當(dāng)像鳥(niǎo)飛往你的山》課件
評(píng)論
0/150
提交評(píng)論