Butterknife全方位解析

概述

Butterknife是供職于Square公司的JakeWharton大神開發的開源庫,使用這個庫,在AS中搭配Android ButterKnife Zelezny插件,可以大大提高開發的效率,從此擺脫繁瑣的findViewById(int id),也不用自己手動@bind(int id) , 直接用插件生成即可。本篇博客將對Butterknife進行深入解析。

項目地址:?JakeWharton/butterknife

ButterKnife有以下優點:

1、強大的View綁定和Click事件處理功能,簡化代碼,提升開發效率

2、方便的處理Adapter里的ViewHolder綁定問題

3、運行時不會影響APP效率,使用配置方便

4、代碼清晰,可讀性強

如何導入ButterKnife

在項目的build.grade文件中進行如下配置:

 
  1. buildscript?{?
  2. ????repositories?{?
  3. ????????jcenter()?
  4. ????????mavenCentral()?
  5. ????????maven?{?
  6. ????????????url?"https://plugins.gradle.org/m2/"?
  7. ????????}?
  8. ????}?
  9. ????dependencies?{?
  10. ????????classpath?'com.android.tools.build:gradle:2.2.0'?
  11. ????????//這里配置?apt?供butterknife使用?
  12. ????????classpath?'com.neenbedankt.gradle.plugins:android-apt:1.8'?
  13. ?
  14. ????}?
  15. }??

例如:

 
  1. buildscript?{?
  2. ????repositories?{?
  3. ????????jcenter()?
  4. ????????mavenCentral()?
  5. ????????maven?{?
  6. ????????????url?"https://plugins.gradle.org/m2/"?
  7. ????????}?
  8. ?
  9. ????}?
  10. ?
  11. ????dependencies?{?
  12. ????????classpath?'com.android.tools.build:gradle:2.2.2'?
  13. ????????classpath?'com.neenbedankt.gradle.plugins:android-apt:1.8'?
  14. ????}?
  15. }?
  16. ?
  17. allprojects?{?
  18. ????repositories?{?
  19. ????????jcenter()?
  20. ????}?
  21. }?
  22. ?
  23. task?clean(type:?Delete)?{?
  24. ????delete?rootProject.buildDir?
  25. }??

在app的build.grade文件中進行如下配置:

 
  1. apply?plugin:?'com.android.application'?
  2. apply?plugin:?'com.neenbedankt.android-apt'?
  3. ?
  4. android{...}?
  5. ?
  6. dependencies?{?
  7. ????//視圖綁定?butterknife?
  8. ????compile?'com.jakewharton:butterknife:8.4.0'?
  9. ????apt?'com.jakewharton:butterknife-compiler:8.4.0'?
  10. }??

例如:

 
  1. apply?plugin:?'com.android.application'?
  2. apply?plugin:?'android-apt'?
  3. ?
  4. android?{?
  5. ????compileSdkVersion?24?
  6. ????buildToolsVersion?"24.0.3"?
  7. ?
  8. ????defaultConfig?{?
  9. ?
  10. ????????minSdkVersion?14?
  11. ????????targetSdkVersion?24?
  12. ????????versionCode?1?
  13. ????????versionName?"1.0"?
  14. ????}?
  15. ????buildTypes?{?
  16. ????????release?{?
  17. ????????????minifyEnabled?false?
  18. ????????????proguardFiles?getDefaultProguardFile('proguard-android.txt'),?'proguard-rules.pro'?
  19. ????????}?
  20. ????}?
  21. }?
  22. ?
  23. dependencies?{?
  24. ????compile?fileTree(dir:?'libs',?include:?['*.jar'])?
  25. ?
  26. ????compile?'com.jakewharton:butterknife:8.4.0'?
  27. ????apt?'com.jakewharton:butterknife-compiler:8.4.0'?
  28. }??

如何使用ButterKnife

1) 由于每次都要在Activity中的onCreate綁定Activity,所以個人建議寫一個BaseActivity完成綁定,子類繼承即可

注:ButterKnife.bind(this);綁定Activity 必須在setContentView之后:

實現如下(FragmentActivity 實現一樣):

 
  1. public?abstract?class?BaseActivity?extends?Activity?{???
  2. ????public?abstract?int?getContentViewId();???
  3. ?
  4. ????@Override???
  5. ????protected?void?onCreate(Bundle?savedInstanceState)?{???
  6. ????????super.onCreate(savedInstanceState);???
  7. ????????setContentView(getContentViewId());???
  8. ????????ButterKnife.bind(this);???
  9. ????????initAllMembersView(savedInstanceState);???
  10. ????}???
  11. ?
  12. ????protected?abstract?void?initAllMembersView(Bundle?savedInstanceState);???
  13. ?
  14. ????@Override???
  15. ????protected?void?onDestroy()?{???
  16. ????????super.onDestroy();???
  17. ????????ButterKnife.unbind(this);//解除綁定,官方文檔只對fragment做了解綁???
  18. ????}???
  19. }????

2) 綁定fragment

 
  1. public?abstract?class?BaseFragment?extends?Fragment?{???
  2. ????public?abstract?int?getContentViewId();???
  3. ????protected?Context?context;???
  4. ????protected?View?mRootView;???
  5. ?
  6. ????@Nullable???
  7. ????@Override???
  8. ????public?View?onCreateView(LayoutInflater?inflater,?@Nullable?ViewGroup?container,?@Nullable?Bundle?savedInstanceState)?{???
  9. ????????mRootView?=inflater.inflate(getContentViewId(),container,false);???
  10. ????????ButterKnife.bind(this,mRootView);//綁定framgent???
  11. ????????this.context?=?getActivity();???
  12. ????????initAllMembersView(savedInstanceState);???
  13. ????????return?mRootView;???
  14. ????}???
  15. ?
  16. ????protected?abstract?void?initAllMembersView(Bundle?savedInstanceState);???
  17. ?
  18. ????@Override???
  19. ????public?void?onDestroyView()?{???
  20. ????????super.onDestroyView();???
  21. ????????ButterKnife.unbind(this);//解綁???
  22. ????}???
  23. }????

3) 控件id 注解: @BindView()

 
  1. package?com.myl.test;?
  2. ?
  3. import?android.support.v7.app.AppCompatActivity;?
  4. import?android.os.Bundle;?
  5. import?android.widget.Button;?
  6. ?
  7. import?butterknife.BindView;?
  8. import?butterknife.ButterKnife;?
  9. ?
  10. public?class?ButterknifeActivity?extends?AppCompatActivity?{?
  11. ?
  12. ????@BindView(?R.id.button1?)?
  13. ????public?Button?button1?;?
  14. ?
  15. ????//?注意:button?的修飾類型不能是:private?或者?static?。?否則會報錯:錯誤:?@BindView?fields?must?not?be?private?or?static.?(com.myl.test.ButterknifeActivity.button1)?
  16. ?
  17. ????@Override?
  18. ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  19. ????????super.onCreate(savedInstanceState);?
  20. ????????setContentView(R.layout.activity_butterknife);?
  21. ????????//綁定activity?
  22. ????????ButterKnife.bind(?this?)?;?
  23. ?
  24. ????????button1.setText(?"I?am?a?button?");?
  25. ????}?
  26. }??

4) 多個控件id 注解: @BindViews()

 
  1. package?com.myl.test;?
  2. ?
  3. import?android.support.v7.app.AppCompatActivity;?
  4. import?android.os.Bundle;?
  5. import?android.widget.Button;?
  6. import?java.util.List;?
  7. import?butterknife.BindViews;?
  8. import?butterknife.ButterKnife;?
  9. ?
  10. public?class?Main2Activity?extends?AppCompatActivity?{?
  11. ?
  12. ????@BindViews({?R.id.button1??,?R.id.button2?,??R.id.button3?})?
  13. ????public?List<Button>?buttonList?;?
  14. ?
  15. ????@Override?
  16. ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  17. ????????super.onCreate(savedInstanceState);?
  18. ????????setContentView(R.layout.activity_main2);?
  19. ?
  20. ????????ButterKnife.bind(this);?
  21. ?
  22. ????????buttonList.get(?0?).setText(?"hello?1?");?
  23. ????????buttonList.get(?1?).setText(?"hello?2?");?
  24. ????????buttonList.get(?2?).setText(?"hello?3?");?
  25. ????}?
  26. }??

5) @BindString() :綁定string 字符串

 
  1. package?com.myl.test;?
  2. ?
  3. import?android.os.Bundle;?
  4. import?android.support.v7.app.AppCompatActivity;?
  5. import?android.widget.Button;?
  6. ?
  7. import?butterknife.BindString;?
  8. import?butterknife.BindView;?
  9. import?butterknife.ButterKnife;?
  10. ?
  11. public?class?ButterknifeActivity?extends?AppCompatActivity?{?
  12. ?
  13. ????@BindView(?R.id.button1?)?//綁定button?控件?
  14. ????public?Button?button1?;?
  15. ?
  16. ????@BindString(?R.string.app_name?)??//綁定string?字符串?
  17. ????String?meg;?
  18. ?
  19. ????@Override?
  20. ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  21. ????????super.onCreate(savedInstanceState);?
  22. ????????setContentView(R.layout.activity_butterknife);?
  23. ?
  24. ????????//綁定activity?
  25. ????????ButterKnife.bind(?this?)?;?
  26. ?
  27. ????????button1.setText(?meg?);?
  28. ????}?
  29. }??

6) @BindArray() : 綁定string里面array數組

 
  1. <resources>?
  2. ????<string?name="app_name">校園助手</string>?
  3. ?
  4. ????<string-array?name="city">?
  5. ????????<item>東莞市</item>?
  6. ????????<item>廣州市</item>?
  7. ????????<item>珠海市</item>?
  8. ????????<item>肇慶市</item>?
  9. ????????<item>深圳市</item>?
  10. ????</string-array>?
  11. ?
  12. </resources>?
  13. -----------------------------------------------------------------?
  14. package?com.myl.test;?
  15. ?
  16. import?android.os.Bundle;?
  17. import?android.support.v7.app.AppCompatActivity;?
  18. import?android.widget.Button;?
  19. ?
  20. import?butterknife.BindArray;?
  21. import?butterknife.BindView;?
  22. import?butterknife.ButterKnife;?
  23. ?
  24. public?class?ButterknifeActivity?extends?AppCompatActivity?{?
  25. ?
  26. ????@BindView(?R.id.button1?)?//綁定button?控件?
  27. ????public?Button?button1?;?
  28. ?
  29. ????@BindArray(R.array.city?)??//綁定string里面array數組?
  30. ????String?[]?citys?;?
  31. ?
  32. ????@Override?
  33. ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  34. ????????super.onCreate(savedInstanceState);?
  35. ????????setContentView(R.layout.activity_butterknife);?
  36. ?
  37. ????????//綁定activity?
  38. ????????ButterKnife.bind(?this?)?;?
  39. ?
  40. ????????button1.setText(?citys[0]?);?
  41. ????}?
  42. }??

7) @BindBitmap( ) : 綁定Bitmap 資源

 
  1. package?com.myl.test;?
  2. ?
  3. import?android.graphics.Bitmap;?
  4. import?android.os.Bundle;?
  5. import?android.support.v7.app.AppCompatActivity;?
  6. import?android.widget.ImageView;?
  7. ?
  8. import?butterknife.BindBitmap;?
  9. import?butterknife.BindView;?
  10. import?butterknife.ButterKnife;?
  11. ?
  12. public?class?ButterknifeActivity?extends?AppCompatActivity?{?
  13. ?
  14. ????@BindView(?R.id.imageView?)?//綁定ImageView?控件?
  15. ????public?ImageView?imageView?;?
  16. ?
  17. ????@BindBitmap(?R.mipmap.wifi?)??//綁定Bitmap?資源?
  18. ????public?Bitmap?wifi_bitmap?;?
  19. ?
  20. ????@Override?
  21. ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  22. ????????super.onCreate(savedInstanceState);?
  23. ????????setContentView(R.layout.activity_butterknife);?
  24. ?
  25. ????????//綁定activity?
  26. ????????ButterKnife.bind(?this?)?;?
  27. ?
  28. ????????imageView.setImageBitmap(?wifi_bitmap?);?
  29. ????}?
  30. }??

8) @BindColor( ) : 綁定一個顏色值

 
  1. package?com.myl.test;?
  2. ?
  3. import?android.os.Bundle;?
  4. import?android.support.v7.app.AppCompatActivity;?
  5. import?android.widget.Button;?
  6. ?
  7. import?butterknife.BindColor;?
  8. import?butterknife.BindView;?
  9. import?butterknife.ButterKnife;?
  10. ?
  11. public?class?ButterknifeActivity?extends?AppCompatActivity?{?
  12. ?
  13. ????@BindView(?R.id.button1?)??//綁定一個控件?
  14. ????public?Button?button1?;?
  15. ?
  16. ????@BindColor(?R.color.colorAccent?)?int?black?;??//綁定一個顏色值?
  17. ?
  18. ????@Override?
  19. ????protected?void?onCreate(Bundle?savedInstanceState)?{?
  20. ????????super.onCreate(savedInstanceState);?
  21. ????????setContentView(R.layout.activity_butterknife);?
  22. ?
  23. ????????//綁定activity?
  24. ????????ButterKnife.bind(?this?)?;?
  25. ?
  26. ????????button1.setTextColor(??black?);?
  27. ?
  28. ????}?
  29. }??

9) Adapter ViewHolder 綁定

 
  1. public?class?TestAdapter?extends?BaseAdapter?{???
  2. ????private?List<String>?list;???
  3. ????private?Context?context;???
  4. ?
  5. ????public?TestAdapter(Context?context,?List<String>?list)?{???
  6. ????????this.list?=?list;???
  7. ????????this.context?=?context;???
  8. ????}???
  9. ?
  10. ????@Override???
  11. ????public?int?getCount()?{???
  12. ????????return?list==null???0?:?list.size();???
  13. ????}???
  14. ?
  15. ????@Override???
  16. ????public?Object?getItem(int?position)?{???
  17. ????????return?list.get(position);???
  18. ????}???
  19. ?
  20. ????@Override???
  21. ????public?long?getItemId(int?position)?{???
  22. ????????return?position;???
  23. ????}???
  24. ?
  25. ????@Override???
  26. ????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{???
  27. ????????ViewHolder?holder;???
  28. ????????if?(convertView?==?null)?{???
  29. ????????????convertView?=?LayoutInflater.from(context).inflate(R.layout.layout_list_item,?null);???
  30. ????????????holder?=?new?ViewHolder(convertView);???
  31. ????????????convertView.setTag(holder);???
  32. ????????}?else?{???
  33. ????????????holder?=?(ViewHolder)?convertView.getTag();???
  34. ????????}???
  35. ????????holder.textview.setText("item====="?+?position);???
  36. ????????return?convertView;???
  37. ????}???
  38. ?
  39. ????static?class?ViewHolder?{???
  40. ????????@Bind(R.id.hello_world)???
  41. ????????TextView?textview;???
  42. ?
  43. ????????public?ViewHolder(View?view)?{???
  44. ????????????ButterKnife.bind(this,?view);???
  45. ????????}???
  46. ????}???
  47. }????

10) 點擊事件的綁定:不用聲明view,不用setOnClickLisener()就可以綁定點擊事件

a. 直接綁定一個方法

 
  1. @OnClick(R.id.submit)???
  2. public?void?submit(View?view)?{???
  3. ??//?TODO?submit?data?to?server...???
  4. }????

b. 所有監聽方法的參數是可選的

 
  1. @OnClick(R.id.submit)???
  2. public?void?submit()?{???
  3. ??//?TODO?submit?data?to?server...???
  4. }???

c. 定義一個特定類型,它將自動被轉換

 
  1. @OnClick(R.id.submit)???
  2. public?void?sayHi(Button?button)?{???
  3. ??button.setText("Hello!");???
  4. }????

d. 多個view統一處理同一個點擊事件,很方便,避免抽方法重復調用的麻煩

 
  1. @OnClick(R.id.submit)???
  2. public?void?sayHi(Button?button)?{???
  3. ??button.setText("Hello!");???
  4. }???

e. 自定義view可以綁定自己的監聽,不指定id

 
  1. public?class?FancyButton?extends?Button?{???
  2. ??@OnClick???
  3. ??public?void?onClick()?{???
  4. ????//?TODO?do?something!???
  5. ??}???
  6. }????

f. 給EditText加addTextChangedListener(即添加多回調方法的監聽的使用方法),利用指定回調,實現想回調的方法即可,哪個注解不會用點進去看下源碼上的注釋

 
  1. @OnTextChanged(value?=?R.id.mobileEditText,?callback?=?OnTextChanged.Callback.BEFORE_TEXT_CHANGED)???
  2. void?beforeTextChanged(CharSequence?s,?int?start,?int?count,?int?after)?{???
  3. ?
  4. }???
  5. @OnTextChanged(value?=?R.id.mobileEditText,?callback?=?OnTextChanged.Callback.TEXT_CHANGED)???
  6. void?onTextChanged(CharSequence?s,?int?start,?int?before,?int?count)?{???
  7. ?
  8. }???
  9. @OnTextChanged(value?=?R.id.mobileEditText,?callback?=?OnTextChanged.Callback.AFTER_TEXT_CHANGED)???
  10. void?afterTextChanged(Editable?s)?{???
  11. ?
  12. }??

代碼混淆

 
  1. -keep?class?butterknife.**?{?*;?}???
  2. -dontwarn?butterknife.internal.**???
  3. -keep?class?**$$ViewBinder?{?*;?}???
  4. ?
  5. -keepclasseswithmembernames?class?*?{???
  6. ????@butterknife.*?<fields>;???
  7. }???
  8. ?
  9. -keepclasseswithmembernames?class?*?{???
  10. ????@butterknife.*?<methods>;???
  11. }????

Zelezny插件的使用

在AndroidStudio->File->Settings->Plugins->搜索Zelezny下載添加就行 ,可以快速生成對應組件的實例對象,不用手動寫。使用時,在要導入注解的Activity 或 Fragment 或 ViewHolder的layout資源代碼上,右鍵——>Generate——Generate ButterKnife Injections,然后就出現如圖的選擇框。

ButterKnife實現原理

對ButterKnife有過了解人 , 注入字段的方式是使用注解@BindView(R.id.tv_account_name),但首先我們需要在Activity聲明注入ButterKnife.bind(Activity activity) 。我們知道,注解分為好幾類, 有在源碼生效的注解,有在類文件生成時生效的注解,有在運行時生效的注解。分別為RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME ,其中以RetentionPolicy.RUNTIME最為消耗性能。而ButterKnife使用的則是編譯器時期注入,在使用的時候,需要配置classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ , 這個配置說明,在編譯的時候,進行注解處理。要對注解進行處理,則需要繼承AbstractProcessor , 在boolean process(Set

ButterKnife實現方式

知曉了注解可以在編譯的時候進行處理,那么,我們就可以得到注解的字段屬性與所在類 , 進而生成注入文件,生成一個注入類的內部類,再進行字段處理 , 編譯之后就會合并到注入類中,達到植入新代碼段的目的。例如:我們注入@VInjector(R.id.tv_show) TextView tvShow;我們就可以得到tvShow這個變量與R.id.tv_show這個id的值,然后進行模式化處理injectObject.tvShow = injectObject.findViewById(R.id.tv_show); ,再將代碼以內部類的心事加入到組件所在的類中 , 完成一次DI(注入) 。

a) 首先創建一個視圖注解

b) 創建一個注解處理器,用來得到注解的屬性與所屬類

c) 解析注解,分離組合Class與屬性

d) 組合Class與屬性,生成新的Java File

APT生成的Java File , 以及模式代碼

使用Javac , 編譯時期生成注入類的子類

項目UML圖

簡要說明:

主要類:

VInjectProcessor —-> 注解處理器 , 需要配置注解處理器

 
  1. resources?
  2. ????????-?META-INF?
  3. ??????????????-?services?
  4. ????????????????????-?javax.annotation.processing.Processor??

Processor內容:

 
  1. com.myl.viewinject.apt.VInjectProcessor???#?指定處理器全類名??

VInjectHandler —-> 注解處理類 , 主要進行注入類與注解字段進行解析與封裝,將同類的字段使用map集合進行映射。exp: Map

自定義ButterKnife具體實現

因微信字數限制,請點擊左下角原文鏈接查看!~







本文作者:佚名
來源:51CTO

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux下編譯FFMpeg

環境&#xff1a;RedHat AS4  1。首先獲取ffmpeg  通過svn下載&#xff1a;  從 http://subversion.tigris.org下載SVN客戶端程序。   先裝subversion&#xff0c;確保已經安裝了apr和apr-util&#xff0c;在apache.org網站能下到  wget http://subversion.tigris.or…

論文筆記 Aggregated Residual Transformations for Deep Neural Networks

這篇文章構建了一個基本“Block”&#xff0c;并在此“Block”基礎上引入了一個新的維度“cardinality”(字母“C”在圖、表中表示這一維度)。深度網絡的另外兩個維度分別為depth&#xff08;層數&#xff09;、width&#xff08;width指一個層的channel的數目&#xff09;。 首…

matlab 歸一化_機器學習中如何用Fscore進行特征選擇(附Matlab代碼)

作者&#xff1a;kervin編輯&#xff1a;阿吉 目前&#xff0c;機器學習在腦科學領域的應用可謂廣泛而深入&#xff0c;不論你是做EEG/ERP研究&#xff0c;還是做MRI研究&#xff0c;都會看到機器學習的身影。機器學習最簡單或者最常用的一個應用方向是分類&#xff0c;…

Java筆記05-Collection、泛型、迭代器

Java筆記05-Collection、泛型、迭代器 【Collection、泛型】 主要內容 Collection集合迭代器增強for泛型 第一章 Collection集合 1.1 集合概述 在前面基礎班我們已經學習過并使用過集合ArrayList ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一種容器&a…

IOS安裝CocoaPods完整流程

作為一個底層系統大菜鳥,又搞過幾年ios來說,安裝一個CocoaPods是一件蛋痛的事~ 說懂又懂,說不懂又不懂. 由于安裝過程比較復雜,步驟較多,而網上教程又比較零散,并且有一些是扯蛋的,所以本篇文章主要從頭到位依據自身安裝經歷記錄每一條終端指令,至于里面的原理和一些概念性的東…

重裝TCP/IP

在Windows XP的網絡組件列表里&#xff0c;Internet 協議 (TCP/IP)的"卸載"按鈕是灰色不可選狀態。這是因為傳輸控制協議/Internet 協議 (TCP/IP) 堆棧是 Microsoft XP/ 2003 的核心組件(TCP/IP協議是Windows XP的默認協議),不能刪除。所以Windows XP不允許卸載TCP/I…

linux 修改時區_教你在Centos8中更改時區

對于許多與系統相關的任務和進程&#xff0c;使用正確的時區是必不可少的。例如&#xff0c;cron守護進程使用系統的時區執行cron作業&#xff0c;日志文件中的時間戳基于同一系統的時區。環 境CentOS 8檢查現在的時區timedatectl是一個命令行實用程序&#xff0c;允許您查看和…

UVA12511 - Virus(DP+最長公共上升子序列)

題目鏈接&#xff1a; https://vjudge.net/problem/UVA-12511 題目大意&#xff1a; 給定兩個序列&#xff0c;求出兩個序列的最長公共上升子序列&#xff08;嚴格上升&#xff09;。 解題過程&#xff1a; 比賽的時候沒有做出來&#xff0c;非常咸魚的一場比賽&#xff0c;當時…

Java筆記06-Map集合

Map集合 學習目標 能夠說出Map集合特點使用Map集合添加方法保存數據使用”鍵找值”的方式遍歷Map集合使用”鍵值對”的方式遍歷Map集合能夠使用HashMap存儲自定義鍵值對的數據能夠使用HashMap編寫斗地主洗牌發牌案例 Map集合概述 啥也不用說,Map集合就相當于python中的字典…

理解什么是前后端分離

HTML、CSS、JS。 AJAX或Fetch。 學習一個前端的框架&#xff0c; React或者Vue或者Angularjs2都可以。 學會一個前端的路由框架&#xff0c; 如React-Router或者Vue-Router。 在學會3的基礎上你肯定已經搭建好前端的開發環境了&#xff0c;所有和后端的交互走AJAX或者Fetch…

幀間、幀內像素塊預測

一、像素塊預測 H.264/ AVC標準中的基本預測技術是基于塊&#xff0c;而不是基于對象的。它的編碼器是利用混合的編碼方案來提高編碼效率&#xff0c;這些方案包括高級的預測技術和有效熵編碼技術。在運動預測中它使用不同的塊的大小進行預測&#xff0c;以樹結構的方式來組織…

高性能mysql 第10章 復制

復制功能不僅能夠構建高可用的應用&#xff0c;同時也是高可用性&#xff0c;可擴展性&#xff0c;災難恢復&#xff0c;備份以及數據倉庫等工作的基礎。 mysql支持兩種復制方式&#xff1a;基于語句的復制和基于行的復制。基于語句的復制&#xff08;也成為邏輯復制&#xff0…

vb6在后臺將窗體保存到圖片_如何將寺庫網多個商品圖片一鍵分類保存到一個目錄...

寺庫網是全球最大的奢侈品網上在線購物平臺&#xff0c;那么我們怎樣可以從寺庫網上一鍵批量采集到多個寶貝商品圖片&#xff0c;并分類保存到電腦呢&#xff1f;今天小編給大家帶來一款專業電商圖片鏈接采集軟件【載圖助手】&#xff0c;它支持平臺高達141個&#xff0c;均可支…

Java筆記07-List、Set、數據結構、Collections

Java筆記07-List、Set、數據結構、Collections 主要內容 數據結構List集合Set集合Collections 第一章 數據結構 2.1 數據結構有什么用&#xff1f; 當你用著java里面的容器類很爽的時候&#xff0c;你有沒有想過&#xff0c;怎么ArrayList就像一個無限擴充的數組&#xff…

Apache安裝問題:configure: error: APR not found . Please read the documentation

參考&#xff1a;http://cuisuqiang.iteye.com/blog/2068794 http://www.cnblogs.com/Anker/p/3355573.html pcre: https://ftp.pcre.org/pub/pcre/ http://www.linuxidc.com/Linux/2012-06/62289.htm 1. 不贊成去卸載httpd的東西。 2. server上可以存在多個apache。一個是rpm&…

浮動與定位

2019獨角獸企業重金招聘Python工程師標準>>> 一.浮動:float:一個元素浮動時,其他內容會"環繞"該元素. 浮動元素的外邊距不會合并浮動的元素不能超出其包含快的內邊界浮動元素彼此會避免重疊浮動元素的頂端不能比之前所有浮動元素或塊級元素的頂端更高如果…

驅動級的自動按鍵_Aqara全自動智能推拉鎖D100,體驗全自動開門的便捷

大家好&#xff0c;我是夢想是個豬&#xff0c;今天為大家帶來的是一篇智能門鎖的使用體驗。前言家里的這張門陸陸續續的換了好幾把智能門鎖了&#xff0c;也體驗了好幾種不同的開鎖方式。最開始開發商給安裝的是一把指紋和把手分離的那種款式&#xff0c;開鎖的時候需要先輸入…

碼率問題

幀率影響的是每幀的額定比特數 我說的幀率是編碼幀率&#xff0c;不是采集幀率。對于一個采集后的序列&#xff0c;MAD 只跟參考幀有關。而編碼幀率與參考幀無關&#xff0c;因此編碼幀率不影響 MAD。 ———————————————————————————————————…

Java筆記08-Map詳解

第一章 Map集合 1.1 概述 現實生活中&#xff0c;我們常會看到這樣的一種集合&#xff1a;IP地址與主機名&#xff0c;身份證號與個人&#xff0c;系統用戶名與系統用戶對象等&#xff0c;這種一一對應的關系&#xff0c;就叫做映射。Java提供了專門的集合類用來存放這種對象…

Node.js的helloworld 程序

用文本編輯器&#xff0c;如npp,鍵入例如以下代碼&#xff0c;存儲成hello.js console.log(hello) console.log(hello %s->%d,jeapedu, 1941847311) cmd進入dos。切入hello.js所在文件夾。運行node.js程序 node hello.js執行結果例如以下所看到的&#xff1a; C:\nodeS>n…