精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

所有Android 開發者都要知道的開發常識

移動開發
可見現代軟件開發對開發者的綜合素質(這并不是facebook所講的全棧工程師)越來越高,自稱為碼農或者程序猿顯然是不合理的,因為這個過程是腦力勞動和體力腦動并存,稱呼自己為工程師顯得更為合理。

[[155312]]

軟件開發流程

一個完整的軟件開發流程離不開策劃、交互、視覺、軟件、測試、維護和運營這七個環節,這七個環節并不是孤立的,它們是開發一款成功產品的前提,但每一項也都可以形成一個學科,是一個獨立的崗位,隨著敏捷開發的流行,以及來到了體驗為王的時代,現代軟件開發更多的是注重效率和敏捷,而不是循規蹈矩的遵循這些開發流程,比如軟件開發的崗位不再僅僅是個技術崗位,它需要去參與前期的設計和評審、可以在視覺和交互方面提出自己的見解,在開發的過程中需要自測程序盡快解決現存問題,運營和維護的過程中也需要軟件的幫助。可見現代軟件開發對開發者的綜合素質(這并不是facebook所講的全棧工程師)越來越高,自稱為碼農或者程序猿顯然是不合理的,因為這個過程是腦力勞動和體力腦動并存,稱呼自己為工程師顯得更為合理。

策劃:需求收集(通過用戶調研、灰度發布、大數據分析、競品分析、領導拍腦袋等方式獲取需求)、需求整理(將需求歸類、劃分優先級等)、將需求轉換成解決方案(輸出設計文檔);

交互:從心理學(利用人性的弱點)、人性化(心智)、個性化的角度將解決方案轉換成可交互的功能和界面(需要輸出交互文檔),比如加載等待、消息提示、頁面布局、頁面內和頁面間的交互邏輯、頁面切換動畫等等,這個過程中一般會使用Axure或者PowerPoint來制作交互文檔;

視覺:根據交互圖,使用PhotoShop來做視覺效果,在Android上的圖片格式大多是png和jpg,對于需要屏幕適配,程序又適合做屏幕適配的地方可以使用九圖,格式為*.9.png。

軟件:根據視覺和交互效果將需求轉化為具體的實現,在實現的過程中可能會因為需求、交互或者視覺的變動導致軟件實現的變動,因為策劃、交互、視覺這每一個環節都可能會有信息失真的現象,或者是由于市場環境的變化、獲取信息不夠準確、領導拍腦袋等等情況導致軟件始終處于被動狀態,所以現在會提倡敏捷開發、結對編程、程序設計、同行評審、單元測試來提高程序的靈活性和穩定性;

測試:軟件達到可交互的標準后,需要將可交互的程序提供測試,其中灰度發布(用戶測試)、自測(開發自測)、SQA(品質保證)都算是測試;

維護和運營:通過測試程序達到穩定標準后,軟件就可以上線了,軟件上線后,需要去維護,用戶反饋的問題要及時解決、用戶有疑問要及時解答;根據后臺統計信息、抓住可運營的節日、民族文化需要做運營來提高用戶使用產品的粘度,讓更多的用戶知道、使用產品都是運營應該做的。

注:

可以查看這個答案了解一個APP從創意到上線的具體流程,開發一個APP有多難?

可以查看筆戈科技的這篇文章了解一個手機(平板或其它電子產品也差不多)的誕生需要哪些環節,一個手機的誕生過程

提問的智慧

大多數工作都是以結果為導向的,特別是軟件開發這個職業,績效考核、KPI這些都是在考核你工作的成果,所以工作更多地是需要你解決問題的能力,至于學習這個事情,還是在工作之外的時間去做吧。對于提高解決問題能力我有兩個建議:

學會學習和思考:學習的過程中要廣度和深度并存,Android應用開發本身對技術功底的要求不高(因為很多底層的東西都被google、框架、開源代碼給封裝起來了,多數時候你只需要看ReadMe或者API知道怎么用就可以了),更多地是在你遇到問題的時候知道這個問題能夠通過什么方法和方式來解決。書要看,但多逛逛論壇、QQ群、Github、StackOverflow、CSDN博客專欄對自己都是有益的。

學會提問:你身邊有很多資源,比如同事、StackOverflow、QQ技術交流群、搜索引擎,當你遇到問題的時候完全可以利用身邊的資源來解決遇到的問題,如果一個問題在一個小時之內自己都不能夠解決它,我就會通過搜索引擎、Github、QQ技術交流群、同事、StackOverflow(以上排序是按優先級排列的)來解決它。如果你需要好的答案你就需要有好的提問,特別是在QQ群或者論壇,在提問的過程中需要體現出你的思考,能夠通過搜索引擎解決的問題堅決不問他人,這是對別人的尊重,在這里推薦幾個鏈接,認真看會對你有莫大的幫助:

如何用好 Google 等搜索引擎?

程序員應該如何提問?

提問的智慧

Smart Questions

解決bug的方法

為了寫這一項我專門在知乎上提過一個問題:

你有哪些解決bug的技巧?

在知道如何快速解決bug之前,你需要知道什么是bug。沒有完成策劃、交互、視覺要求的功能,這不叫bug,這叫功能缺陷;一個功能完成后不能正常使用也不叫bug,因為它根本還沒達到可測試的標準。我認為當你的程序達到可測試標準之后發現的問題才叫bug。綜合我自己解決bug的經驗和知乎上的回答,總結常見的解決bug的方法有(你想要高效解決bug的前提是你能夠快速定位到缺陷所在的位置,所以以下方法多數講的是如何快速定位問題,至于真正解決bug,需要你自己修改程序才行):

斷點調試:

以Eclipse為例:

1、打斷點:

(1)打斷點:

 

所有Android開發人員都要知道這些

(2)清除斷點:

 

2、啟動調試模式的兩種方式:

(1)通過debug as啟動調試程序:右鍵工程名--]Debug AS --]Android Application --]模擬器或者真機會彈出......watching for the debugger......的提示框,不要點擊等待其自動消失 --] 此時已經進入調試模式,操作程序到達打斷點的地方。

(2)在程序運行過程中,在DDMS視圖下選中要調試的程序,啟動調試模式:

 

3、調試:請自行嘗試F5、F6、F7、F8這幾個調試的快捷鍵;

4、watch成員變量:在調試的過程中,比如在執行for、while、do while循環、遞歸、系統回調等程序時可以通過watch來觀察成員變量或者方法返回值的變化情況,watch的方法:

 

所有Android開發人員都要知道這些

注:更多關于在Eclipse IDE中調試Android程序的知識請參見:Android eclipse中程序調試

打印:

打印調試的方法對于循環、異步加載、遞歸、JNI等代碼段非常有用,特別是在循環中,在循環次數非常大時,通過打斷點調試顯然是一件費力的事情,這時候打印就顯得更“智能”了,我通常會通過下面封裝的打印調試類來輸出打印信息,這個類可以打印print、log、行號、文件名、StrictMode等信息,當不需要打印信息時,只需要將DEBUG_MODE改為false就可以了:

 

  1. import android.content.Context; 
  2. import android.os.StrictMode; 
  3. import android.util.Log; 
  4. import android.widget.Toast; 
  5. /** 
  6. * 調試打印類 
  7. * 
  8. * */ 
  9. public class DebugUtils{ 
  10. private DebugUtils( ){ 
  11. public static void println( String printInfo ){ 
  12. if( Debug.DEBUG_MODE && null != printInfo ){ 
  13. System.out.println( printInfo ); 
  14. public static void print( String printInfo ){ 
  15. if( Debug.DEBUG_MODE && null != printInfo ){ 
  16. System.out.print( printInfo ); 
  17. public static void printLogI( String logInfo ){ 
  18. printLogI( TAG, logInfo ); 
  19. public static void printLogI( String tag, String logInfo ){ 
  20. if( Debug.DEBUG_MODE && null != tag && null != logInfo ){ 
  21. Log.i( tag, logInfo ); 
  22. public static void printLogE( String logInfo ){ 
  23. printLogE( TAG, logInfo ); 
  24. public static void printLogE( String tag, String logInfo ){ 
  25. if( Debug.DEBUG_MODE && null != tag && null != logInfo ){ 
  26. Log.e( tag, logInfo ); 
  27. public static void printLogW( String logInfo ){ 
  28. printLogW( TAG, logInfo ); 
  29. public static void printLogW( String tag, String logInfo ){ 
  30. if( Debug.DEBUG_MODE && null != tag && null != logInfo ){ 
  31. Log.w( tag, logInfo ); 
  32. public static void printLogD( String logInfo ){ 
  33. printLogD( TAG, logInfo ); 
  34. public static void printLogD( String tag, String logInfo ){ 
  35. if( Debug.DEBUG_MODE && null != tag && null != logInfo ){ 
  36. Log.d( tag, logInfo ); 
  37. public static void printLogV( String logInfo ){ 
  38. printLogV( TAG, logInfo ); 
  39. public static void printLogV( String tag, String logInfo ){ 
  40. if( Debug.DEBUG_MODE && null != tag || null != logInfo ){ 
  41. Log.v( tag, logInfo ); 
  42. public static void printLogWtf( String logInfo ){ 
  43. printLogWtf( TAG, logInfo ); 
  44. public static void printLogWtf( String tag, String logInfo ){ 
  45. if( Debug.DEBUG_MODE && null != tag && null != logInfo ){ 
  46. Log.wtf( tag, logInfo ); 
  47. public static void showToast( Context context, String toastInfo ){ 
  48. ifnull != context && null != toastInfo ){ 
  49. Toast.makeText( context, toastInfo, Toast.LENGTH_LONG ).show( ); 
  50. public static void showToast( Context context, String toastInfo, int timeLen ){ 
  51. ifnull != context && null != toastInfo && ( timeLen ] 0 ) ){ 
  52. Toast.makeText( context, toastInfo, timeLen ).show( ); 
  53. public static void printBaseInfo( ){ 
  54. if( Debug.DEBUG_MODE ){ 
  55. StringBuffer strBuffer = new StringBuffer( ); 
  56. StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( ); 
  57. strBuffer.append( "; class:" ).append( stackTrace[ 1 ].getClassName( ) ) 
  58. .append( "; method:" ).append( stackTrace[ 1 ].getMethodName( ) ) 
  59. .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ) 
  60. .append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) ); 
  61. println( strBuffer.toString( ) ); 
  62. public static void printFileNameAndLinerNumber( ){ 
  63. if( Debug.DEBUG_MODE ){ 
  64. StringBuffer strBuffer = new StringBuffer( ); 
  65. StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( ); 
  66. strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) ) 
  67. .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ); 
  68. println( strBuffer.toString( ) ); 
  69. public static int printLineNumber( ){ 
  70. if( Debug.DEBUG_MODE ){ 
  71. StringBuffer strBuffer = new StringBuffer( ); 
  72. StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( ); 
  73. strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ); 
  74. println( strBuffer.toString( ) ); 
  75. return stackTrace[ 1 ].getLineNumber( ); 
  76. }else
  77. return 0
  78. public static void printMethod( ){ 
  79. if( Debug.DEBUG_MODE ){ 
  80. StringBuffer strBuffer = new StringBuffer( ); 
  81. StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( ); 
  82. strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getMethodName( ) ); 
  83. println( strBuffer.toString( ) ); 
  84. public static void printFileNameAndLinerNumber( String printInfo ){ 
  85. ifnull == printInfo || !Debug.DEBUG_MODE ){ 
  86. return
  87. StringBuffer strBuffer = new StringBuffer( ); 
  88. StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( ); 
  89. strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) ) 
  90. .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ).append( "\n" ) 
  91. .append( ( null != printInfo ) ? printInfo : "" ); 
  92. println( strBuffer.toString( ) ); 
  93. public static void showStrictMode( ) { 
  94. if (DebugUtils.Debug.DEBUG_MODE) { 
  95. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
  96. .detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); 
  97. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
  98. .detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); 
  99. public static void d(String tag, String msg){ 
  100. if(DebugUtils.Debug.DEBUG_MODE){ 
  101. Log.d(tag, msg); 
  102. public class Debug{ 
  103. public static final boolean DEBUG_MODE = true
  104. public static final String TAG = "Debug"
  105. }  

目視法:

這適合于code review,但是不太靠譜,因為人的精力畢竟有限,有時候你多敲一個分號,縮進不對都有可能導致程序出現問題,但在代碼量較少時是一個高效率的方法。

自動化測試:

Android的自動化測試(分白盒測試和黑盒測試)工具有:monkey、Robotium、Appium、云端測試(比如testin),具體用法可參見:

android實用測試方法之Monkey與MonkeyRunner

Robotium

Testin

Appium中文教程

排除法:

調試、打印、目視這三種方法適合于可以復現的問題,對于隨機問題(實際上不存在隨機問題,只是問題不那么容易復現而已),比如在線程、音頻播放、AnsynTask、Timer切換或者結束時剛好做了相應地人為操作導致出現靈異現象。這時候可以通過排除法來排查問題,具體的方法是首先大概定位到出現問題的位置,然后將代碼一段一段地注釋,觀察程序現象,逐步縮小出現問題的范圍。

版本管理介紹

在較大的軟件開發過程中,可能有多個軟件工程師同時開發一個項目的情況,比如有負責讀取數據、獲取網絡數據等API封裝的,有負責程序架構的,有負責上層界面實現的,為了能夠最終編譯一個完成的程序出來,需要將代碼整合,這個時候最方便的方法就是使用版本管理工具,固定時間上傳(比如每天、沒改動一個功能等等),這樣能夠實時保證服務器上的代碼是最完整、最新的,也可以避免由于自然災害、電腦異常導致本地電腦掛掉損失掉代碼的問題。

常見的版本管理工具有SVN和Git,我也使用過CVS,關于版本管理工具的介紹參見:

版本控制

版本控制系統的選擇之路

git教程

git簡易指南

注:對于windows用戶來說,建議使用烏龜殼系列的版本控制客戶端,使用github的朋友可以使用github for windows客戶端:

 

    tortoisegit 
     
    tortoisecvs 
     
    tortoisesvn 
     
    github for windows 

 

編譯

通常我們用Eclipse或者Android Studio開發android程序時,只需要運行程序就可以在模擬器或者機器上運行程序了,但為了保證代碼的完整性、能夠在服務器上編譯,需要通過編譯工具將代碼編譯成apk,常見的編譯工具有:ant、gradle,但這兩種編譯工具都是需要通過手動敲命令來完成編譯功能(當然你也可以自己寫腳本來實現編譯自動化),jenkins是一個持續集成的工具,通過它可以代碼克隆、編譯以及程序加密自動化,其實它也是通過批處理來實現的,ant、gradle和jenkins的具體用法自行谷歌,使用起來很簡單,目前android studio和github上很多功能都是通過gradle來編譯的。

專業術語介紹

以下解釋完全是本人的理解,詳細解釋可自行谷歌。

版本迭代:按照需求優先級,在保證基本功能OK后持續開發和升級,這樣能夠降低軟件開發的風險,并且能夠及時解決用戶反饋的問題,船小好掉頭嘛;

敏捷開發:小步快跑,大概意思就是不要過于注重文檔,要注重當面交流,能夠在實現時高保真的還原用戶的需求場景,并且能夠快速地解決用戶的需求。

單元測試:白盒測試的一種,對核心方法通過寫程序來測試自己的程序,單元測試的目的是讓你有意識地降低程序間的耦合,保證每一個方法都是最小單元,但這對于測試程序邏輯是沒有幫助,這是我自己的理解。。。

灰度發布:先找一部分用戶來使用即將發布的程序(這部分用戶可以是隨機抽取、制定年齡段、指定地區或者通過某種方式知道他是活躍用戶),在測試的過程中給與用戶一點好處讓用戶寫用戶體驗報告、反饋問題等方式來發現程序存在的問題和缺陷;

DA統計:也叫后臺統計,通過在程序中埋點的方式,在有網絡的情況下將用戶的操作行為和數據上傳到后臺,將每個用戶的信息都上傳回來就叫大數據,通過建模對這些數據分析就叫大數據分析。

開放平臺:比如分享到QQ空間、分享到微信、訊飛語音、友盟的后臺統計、天氣、地圖等等都叫做開放平臺,它提供了一些開放的接口給開發者,方便開發者使用它的服務,開放平臺多數服務都是免費的,但有時候也可能不穩定,比如用的人少它自然就活不下去了,然后就沒有然后了。

同行評審:你的同行和你一起看看你的代碼,發現是否有問題;

結對編程:在寫代碼的過程中,有個人坐在你旁邊或者你坐在別人旁邊,編寫邊討論,降低程序出現邏輯和低級錯誤的概率。

Android開發資源

參見我的另一篇文章:Android開發者網址導航

建議

盡量閱讀官方文檔,這才是原汁原味、不失真的開發指導;

即使你認為設計程序是浪費時間,你只是喜歡寫程序,至少你也得用思維導圖理清思路,思維導圖對于幫助你理解設計文檔、理清思路有很大的幫助;

不要用Intent傳遞大量的數據,這有可能導致ANR或者報異常;

在退出頁面后,系統不一定會及時執行onDestory方法,如果你在onDestory方法里做關閉文件、釋放內存的操作可能出現退出程序又立即進入時,由于需要重新初始化這些信息導致代碼重入的異常;

在改動JNI后,運行程序之前記得卸載掉已經安裝在模擬器或者真機上的該程序,如果直接運行,android不會load最新編譯的so,也就不能立即看到修改后的效果;

代碼至少每天備份一次,或者是完善一個功能就備份一次,不要堆積之后一次性備份,因為在你的代碼出問題需要回溯代碼時你需要從服務器上重新取代碼,同時也可以避免代碼不是最新導致最后和其他人合并時不知道改了哪些地方;

將打印信息封裝成一個方法,用一個標志位控制這個這個方法的方法體是否需要執行,這樣在由debug版釋放到release版本時,不需要傻傻地一行一行地去掉代碼,你只需要改變標志位的值就可以了;

對于有返回值的JNI函數,即使你不返回任何值,用NDK編譯JNI的時候也不會報錯,所以在寫JNI代碼的時候,一定要仔細檢查代碼;

JNI頻繁讀寫文件操作會影響程序的運行性能,可以考慮一次性在內存中申請一塊大內存作為緩存空間,用這種空間換時間的方式可以大大提高程序的運行效率;

不要指望類的finalize方法去處理需要回收和銷毀的工作,因為finalize是系統回調的方法,調用時機不可預見,切記;

使用文件流、Cursor時,使用結束后記得一定要關閉,否則可能導致內存泄漏,嚴重的情況可能引發程序崩潰;

優先使用Google搜索引擎(少用百度),如果不能正常使用Google搜索引擎建議通過代理、VPN、修改hosts文件等方式搭建梯子。這里提供一個免費的谷歌搜索引擎

對于不需要使用硬件加速的activity(沒有動畫效果、視頻播放以及各種多媒體文件的操作都可以關掉硬件加速),在AndroidManifest.xml文件中通過“android:hardwareAccelerated="false"”關掉硬件加速可節省應用內存;

對于需要橫豎屏轉換的應用,又不想在橫豎屏切換的時候重新跑onCreate方法,可以在AndroidManifest.xml文件中對應的Activity標簽下調用“android:configChanges="screenSize|orientation"”;

為了減輕應用程序主進程的內存壓力,對于耗內存比較多的界面(比如視頻播放界面、flash播放界面等),可以在AndroidManifest.xml文件中對應的Activity標簽下調用“android:process=".processname"”單開一個進程,但在退出這個界面的時候一定要在該界面的onDestory方法中調用System的kill方法來殺掉該進程;

在res/values/arrays.xml文件中定義的單個數組的元素個數不宜過大,過大會導致加載數據時非常慢,有時候你需要使用數組資源時數據有可能還沒加載完成;

一個Activity中最耗費內存的是activity的背景(多數情況如此,特別是對于分辨率很大的機器,一個界面的背景算下來都需要好幾兆內存),所以在程序界面較多時,可以考慮將圖片轉換成靜態的drawable,然后多個activity共用這一張背景圖;

可以通過為application、activity自定義主題的方式來關掉多點觸摸功能,只需要在自定義的主題下添加這兩個標簽:

 

  1. [item name="android:windowEnableSplitTouch"]false[/item] 
  2. [item name="android:splitMotionEvents"]false[/item] 

很多游戲進入時,播放的片頭動畫多數是一個視頻文件;

Android單個dex文件的方法數不能超過65536個,android使用多個dex能否避開65536方法數限制?

使用模擬器genymotion代替android自帶模擬器(它需要虛擬機vituralbox的支持,不過官網已經提供了一個集成虛擬機的安裝包了,直接下載下來安裝即可),可以大大提高使用模擬器的體驗(流暢、快),它也可以以插件的形式集成在Eclipse中,這是視頻教程

給Application或者activity設置自定義主題時,最好不要設置為全透明,否則在activity按Home鍵回退到桌面的時候效果很渣;

如果你需要取消toast顯示的功能,在一個類中你只需要實例化該類一次(也就是說將Toast定義成一個全局的成員變量),這樣你就可以調用mToast.cancel()了,我把它寫成了一個靜態類:

 

  1. public class ToastUtils { 
  2. private ToastUtils( ){ 
  3. public static void showToast( Context context, String toast ){ 
  4. ifnull == mToast ){ 
  5. mToast = Toast.makeText( context, toast, Toast.LENGTH_LONG ); 
  6. }else
  7. mToast.setText( toast ); 
  8. mToast.show( ); 
  9. public static void cancel( ){ 
  10. ifnull != mToast ){ 
  11. mToast.cancel( ); 
  12. public static Toast mToast = null

你可以定義一個靜態類來實現防止按鈕被重復點擊導致重復執行一段代碼的問題:

 

  1. /** 
  2. * 按鈕重復點擊 
  3. * 
  4. * */ 
  5. public class BtnClickUtils { 
  6. private BtnClickUtils( ){ 
  7. public static boolean isFastDoubleClick() { 
  8. long time = System.currentTimeMillis(); 
  9. long timeD = time - mLastClickTime; 
  10. if ( 0 [ timeD && timeD [ 1000) { 
  11. return true
  12. mLastClickTime = time; 
  13. return false
  14. private static long mLastClickTime = 0

放在apk的assets或者raw目錄下的數據文件最好做加密處理,在需要使用的時候才解密,這樣可以避免在apk被他人破解時數據也被破解的問題;

最好不要再activity的onCreate方法里面調用popupwindow的show方法,有可能由于activity沒有完全初始化導致程序異常(android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid),如果非要在一進activity就顯示popupwindow,建議用handler.post、View.postDelay來處理;

對于自定義View,在構造方法里面是獲取不到視圖的寬高的(此時獲取長寬都為0),需要在onMeasure方法中或者跑了onMeasure方法后才能夠獲取到視圖的寬高,不過你可以通過在構造方法里面強制測量視圖的寬高來實現在構造方法里獲取視圖的寬高信息,具體見MeasureSpec介紹及使用詳解

如果你覺得在安裝Eclipse后還需要配置android開發環境很麻煩,你可以直接使用ADT Bundle,它是一個懶人套餐,下載下來就可以用了,可以在這里下載。

有時間看看阿里技術嘉年華、InfoQ演講與訪談、Google IO視頻,可以學習到一些解決問題、做大項目的經驗。

當應用中動畫比較多,并且動畫都是通過圖片來切換的時候,可以考慮借用Cocos的精靈表單思想,這樣就可以避免圖片命名的煩惱。

工具推薦

代碼對比:Beyond compare

屏幕取色:ColorPix

梯子:紅杏

思維導圖: mindmanager

在線工具:在線工具

責任編輯:chenqingxiang 來源: 張明云 的簡書
相關推薦

2012-07-31 09:52:54

HTML5

2013-06-28 14:19:20

2021-12-24 11:24:59

React HackReact JavaScript

2016-02-22 15:09:19

Android項目管理技巧

2010-07-30 16:27:06

Flex開發

2011-05-26 11:13:36

Flex

2014-07-17 09:31:50

iOS8SDK

2010-03-01 10:20:27

Flex

2017-06-09 13:33:57

2015-08-21 09:47:02

ios9sdk新特性

2025-02-25 08:30:00

前端開發VSCode

2023-06-05 16:50:06

開發TypeScriptJavaScript

2018-09-29 15:27:05

BinderAPPAndroid

2013-04-26 09:38:13

go

2024-04-26 13:36:01

2015-09-18 08:41:12

androidM權限

2015-08-31 09:41:38

androidM權限

2015-08-11 08:41:58

游戲數據游戲開發

2012-11-13 10:34:03

PythonWeb

2014-09-01 09:53:50

Android框架
點贊
收藏

51CTO技術棧公眾號

免费日韩视频在线观看| 国产精品久久视频| 欧美xxxx日本和非洲| av漫画网站在线观看| 亚洲都市激情| 欧美性大战xxxxx久久久| 黄色一级视频播放| 日韩大胆人体| 激情文学综合插| 97久久伊人激情网| 网站在线你懂的| gogo高清在线播放免费| 欧美激情一区二区三区全黄 | 影音先锋亚洲天堂| 999久久久91| 精品亚洲国产成av人片传媒| 97av中文字幕| 久久经典视频| 天堂一区二区在线| 粗暴蹂躏中文一区二区三区| 成年人网站免费在线观看| 四虎精品永久免费| 色婷婷久久一区二区三区麻豆| 可以在线看黄的网站| 超碰免费在线| 2017欧美狠狠色| 99理论电影网| 一区二区三区精彩视频| 亚洲欧美日韩在线观看a三区| 色妞久久福利网| 911福利视频| 精品国产第一福利网站| 亚洲午夜一区二区| www.亚洲一区二区| 伊人免费在线| 国产免费久久精品| 欧美黑人xxxxx| 网站黄在线观看| 国产69精品久久99不卡| 91免费在线视频网站| 亚洲成人第一网站| 亚洲一区不卡| 欧美在线观看网址综合| 久久久久亚洲av成人片| 在线看片不卡| 久久天天躁夜夜躁狠狠躁2022| 亚洲一区视频在线播放| 久久91精品| 亚洲欧美激情视频| 一本加勒比北条麻妃| 欧美理伦片在线播放| 精品国产99国产精品| 亚洲精品成人无码毛片| 视频精品二区| 亚洲第一av网站| 亚洲av无码专区在线播放中文| 三级网站视频在在线播放| 国产精品久久久久影院老司| 西游记1978| 成人高清免费观看mv| 国产区在线观看成人精品| 日韩高清三级| 天天在线视频色| 中文字幕一区二区三区色视频| 一区二区av| 蜜桃久久一区二区三区| 成人在线一区二区三区| 国产精品久久久久免费| 日本美女一级视频| 久久亚洲春色中文字幕久久久| 玛丽玛丽电影原版免费观看1977| 日夜干在线视频| 国产亚洲一区二区在线观看| 亚洲已满18点击进入在线看片| 国产免费福利视频| 粉嫩嫩av羞羞动漫久久久| 国产伦精品一区二区三区照片| 特级丰满少妇一级aaaa爱毛片| eeuss影院一区二区三区| 美女主播视频一区| 中文字幕日本在线观看| 亚洲男人的天堂一区二区| 国产成人永久免费视频| 周于希免费高清在线观看| 中文字幕一区二区三区在线播放| 丰满女人性猛交| 麻豆av在线播放| 亚洲免费视频成人| 男女猛烈激情xx00免费视频| 成人亚洲欧美| 4438x亚洲最大成人网| 日本美女视频网站| 国产一区二区亚洲| 久久伊人免费视频| 五月天婷婷久久| 久久精品久久精品| 国产欧美欧洲| 日韩在线资源| 精品久久久视频| 91 视频免费观看| 日本欧美高清| 两个人的视频www国产精品| 国产成人精品一区二三区| 精品一区二区三区香蕉蜜桃| 国产精品香蕉视屏| 午夜不卡视频| 大荫蒂欧美视频另类xxxx| 99国产精品久久久久久| 美女一区二区在线观看| 日韩中文字幕在线精品| 在线天堂中文字幕| 国产精品18久久久久久vr| 欧美大香线蕉线伊人久久| 污污的网站在线看| 欧美日韩一区不卡| 中文字幕一区二区人妻在线不卡| 亚洲精品国产偷自在线观看| 国产精品极品尤物在线观看| 黑人操亚洲女人| 国产成人午夜高潮毛片| 日韩精品欧美在线| 超碰激情在线| 欧美精品亚洲一区二区在线播放| 日本黄色片在线播放| 欧美高清日韩| 成人黄色av网站| 国产黄在线看| 色婷婷激情久久| 日本护士做爰视频| 韩国亚洲精品| 3d精品h动漫啪啪一区二区| 99视频在线观看地址| 欧美性猛交xxxx乱大交极品| 在线xxxxx| 日韩高清成人在线| 久久久久国产视频| 国产黄色片网站| 亚洲乱码一区二区三区在线观看| 五月婷婷丁香色| 欧美亚洲激情| 国产精品亚洲精品| 成人p站proumb入口| 色婷婷狠狠综合| 亚洲自拍偷拍图| 丝袜诱惑亚洲看片| 日韩欧美在线一区二区| 日韩中文在线播放| 日韩一区二区在线看| 国产麻豆a毛片| 久久91精品国产91久久小草| 亚洲国产日韩综合一区| 色呦呦在线免费观看| 欧美久久免费观看| 欧美特黄一级片| 国产一区三区三区| 特大黑人娇小亚洲女mp4| 精品中文字幕一区二区三区四区 | 国产67194| 中文字幕日韩一区二区不卡| 91精品久久久久久久久久久久久| 国产激情无套内精对白视频| 亚洲免费av网站| 91av免费观看| 1024日韩| 国产精品视频久| 日本在线人成| 日韩一区二区在线观看视频 | 黄色片视频免费观看| 亚洲一区欧美二区| 无码免费一区二区三区免费播放| 欧美aaaaaaaa| 欧美第一黄网免费网站| 手机看片1024日韩| 欧美性猛交一区二区三区精品| 天天操天天摸天天舔| 国产高清一区日本| 免费一级特黄毛片| 日本不卡高清| 成人av资源| 电影一区二区三| zzjj国产精品一区二区| 乱色精品无码一区二区国产盗| 欧美小视频在线| www亚洲色图| 国产精选一区二区三区| 日本一区不卡| 成人av在线播放| 性欧美激情精品| 91精彩在线视频| 精品少妇一区二区三区免费观看| 日本中文字幕第一页| 成人免费在线视频观看| 一级欧美一级日韩片| 美女免费视频一区| 国产精品999视频| 日韩免费一区| 精品国产第一页| 91麻豆精品国产综合久久久 | 91在线云播放| 亚洲综合123| 先锋亚洲精品| japanese在线播放| 欧美精品色图| 国产成人免费观看| av网址在线播放| 国产视频久久久久| www.精品视频| 欧美日韩三级在线| 国产手机在线视频| 亚洲美腿欧美偷拍| 国产1区2区在线观看| 成人国产亚洲欧美成人综合网| 黄色永久免费网站| 国产亚洲精品自拍| 久久香蕉视频网站| 四虎成人精品永久免费av九九| 极品尤物一区二区三区| 色妞ww精品视频7777| 国产在线观看91精品一区| 在线观看爽视频| 欧美激情精品久久久久久久变态 | 中文字幕精品在线不卡| 欧美在线一级片| 国产成人在线视频播放| xxww在线观看| 亚洲一区二区伦理| 天堂8在线天堂资源bt| 女人色偷偷aa久久天堂 | 日韩不卡av| 日韩电影不卡一区| 国内成+人亚洲| 国产成人澳门| 操人视频欧美| 免费观看亚洲视频大全| 96pao国产成视频永久免费| av久久网站| 久久亚洲精品视频| 亚洲1卡2卡3卡4卡乱码精品| 国产亚洲精品va在线观看| 日韩私人影院| 亚洲另类欧美自拍| 天堂av网在线| 亚洲男人天堂网| 久久经典视频| 日韩精品在线免费观看| 人操人视频在线观看| 亚洲乱码国产乱码精品精天堂| 手机看片国产1024| 亚洲国产天堂网精品网站| 欧美 日韩 国产 精品| 亚洲第一天堂无码专区| 亚洲国产精品久久久久久久| 精品国产一区二区三区久久影院| 亚洲精品视频91| 亚洲福利视频免费观看| 视频二区在线| 亚洲一区第一页| 色开心亚洲综合| 欧美疯狂做受xxxx高潮| √最新版天堂资源网在线| 51精品国产黑色丝袜高跟鞋| 都市激情亚洲一区| 国产日韩中文字幕| 亚洲精品一区二区三区中文字幕| 成人激情av| 图片婷婷一区| 午夜精品福利一区二区| 91精品国产91久久久久久密臀| 成人毛片100部免费看| 99视频精品| 亚洲最大综合网| 国产精品自拍av| 800av在线播放| 欧美韩日一区二区三区四区| 免费观看特级毛片| 亚洲成人资源网| 国产性生活视频| 在线不卡中文字幕| 免费看黄色一级视频| 亚洲欧洲一区二区三区久久| 欧美性videos| 992tv成人免费视频| 国产成人77亚洲精品www| 96久久精品| 亚洲尤物av| 国产又黄又爽免费视频| 亚洲毛片播放| 污视频网站观看| 成人毛片视频在线观看| 日韩一级片在线免费观看| 亚洲自拍偷拍欧美| 国产精品久久久久久久久久精爆| 欧美久久免费观看| 日韩专区一区二区| 欧美精品在线观看| www日韩tube| 欧美剧在线观看| 欧美黑人粗大| 高清国产一区| 日韩久久精品| 一女被多男玩喷潮视频| 激情综合网最新| 国产肥白大熟妇bbbb视频| 亚洲精品美腿丝袜| 久久影院一区二区| 欧美无人高清视频在线观看| 风流老熟女一区二区三区| 中文字幕少妇一区二区三区| а√在线天堂官网| 成人信息集中地欧美| 国产亚洲电影| 国产九九九九九| 国产高清精品网站| 蜜桃av免费观看| 色婷婷综合久久久| 欧美天堂在线视频| 久久中文字幕在线视频| 成人免费黄色| 国产视频精品网| 午夜精品久久| 天天综合天天添夜夜添狠狠添| 国产亚洲欧洲997久久综合| 日本道在线观看| 精品国产91久久久久久久妲己| 国内精品久久久久久野外| 国产精品69久久| 久久99青青| 啊啊啊一区二区| av在线播放一区二区三区| 国产性生活网站| 日韩亚洲欧美在线| 久草资源在线观看| 国产日韩av在线| 久久国产成人精品| 日韩一区二区三区不卡视频| 国产人伦精品一区二区| 中文字幕视频网站| 精品伊人久久97| 亚洲精华液一区二区三区| 精品日韩欧美| 亚洲一区二区三区免费在线观看| 无码任你躁久久久久久老妇| 亚洲国产精品久久久久婷婷884 | 日韩成人在线视频| 东热在线免费视频| 国产精品黄色av| 日本一区二区在线看| 亚洲天堂av线| 欧美国产日本视频| 在线免费观看日韩视频| 色哟哟入口国产精品| 亚洲毛片在线免费| 最新视频 - x88av| 大尺度一区二区| 亚洲一区欧美在线| 亚洲人成五月天| 91精品国产66| 26uuu成人| 国产99久久久国产精品潘金| 色播视频在线播放| 亚洲免费福利视频| 九九热这里有精品| www.-级毛片线天内射视视| 国产福利91精品一区| 日韩免费不卡视频| 亚洲人成电影网站色| 亚洲美女色播| 国产毛片视频网站| 久久久午夜精品理论片中文字幕| 欧美 亚洲 另类 激情 另类| 精品国模在线视频| 大香伊人久久精品一区二区| 欧美一级在线看| 欧美激情一区二区在线| 国产黄色一区二区| 欧美在线观看网址综合| 先锋资源久久| yjizz视频| 欧美亚洲自拍偷拍| 色婷婷av在线| 日本成人黄色| 国产电影一区二区三区| 亚洲图片在线视频| 欧美视频中文在线看| 国产精品亚洲a| 国产一区二区三区香蕉| 国产在线观看免费视频今夜| 亚洲天堂av在线免费观看| 999精品视频在线观看| 热99这里只有精品| 中文字幕一区二区在线观看| 天天干天天摸天天操| 国产在线拍偷自揄拍精品| 日韩午夜精品| 久久久精品少妇| 亚洲精品中文字| 婷婷视频一区二区三区| 在线观看av日韩| 欧美日韩性视频| 污视频在线看网站|