編輯:關於Android編程
注解的定義
能夠添加到 Java 源代碼的語法元數據。類、方法、變量、參數、包都可以被注解,可用來將信息元數據與程序元素進行關聯,常見的注解如@Override, @Deprecated。
元注解
元注解是基本注解,所有的自定義注解都將會用到元注解,元注解主要有如下四個:
SOURCE:只保留在源碼中,不保留在class中,同時也不加載到虛擬機中
CLASS:保留在源碼中,同時也保留到class中,但是不加載到虛擬機中
RUNING:保留到源碼中,同時也保留到class中,最後加載到虛擬機中
@Target
這個注解表示注解的作用范圍,主要有如下:
ElementType.FIELD 注解作用於變量
ElementType.METHOD 注解作用於方法
ElementType.PARAMETER 注解作用於參數
ElementType.CONSTRUCTOR 注解作用於構造方法
ElementType.LOCAL_VARIABLE 注解作用於局部變量
ElementType.PACKAGE 注解作用於包
@Inherited
是否可以被繼承,默認為 false
@Documented
是否會保存到 Javadoc 文檔中
基本注解
java中常用的注解有如下三個
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnonation { String name() default ""; int Id() default 0; }
注解關鍵字時@interface,然後上面標注為元注解,表示只能修飾方法並且加載到虛擬機中,裡面時這個注解所具有的屬性,name, id,我們在給方法加注解的時候設置相應的值。
@TestAnnonation(name = "android" , Id = 1) private void testAnno(){ }
上面我們在一個方法上面添加注解,然後我們通過下面的方法將這個注解打印出來
private void outputAnnoDetail(Class clazz){ Method [] methods = clazz.getDeclaredMethods(); for(Method method : methods) { TestAnnonation testAnnonation = method.getAnnotation(TestAnnonation.class); if (testAnnonation != null) { Log.d("anonation", "name------>" + testAnnonation.name() + "------>Id------>" + testAnnonation.Id()); } } }
上面的打印結果就是
name------>android------>Id------>1
這是一個運行時注解,注解的作用就是標記一個可以被識別的作用域,可以被其他地方獲取解釋或者被編譯機識別等作用。
@Retention(CLASS) @Target(FIELD) public @interface BindView { /** View ID to which the field will be bound. */ @IdRes int value(); }
通過上面的代碼可以看出,ButterKnife的注解保留方式為CLASS模式,也就是會保留到class中但是不會背加載到虛擬機中,這個時候我們就要看下它的AbstractProcessor,一般標注為Class的都會重寫AbstractProcessor類,這樣在虛擬機進行編譯的時候就會做相應的處理。
主要看一下幾個方法:
@Override public SetgetSupportedAnnotationTypes() { Set types = new LinkedHashSet<>(); for (Class annotation : getSupportedAnnotations()) { types.add(annotation.getCanonicalName()); } return types; } private Set > getSupportedAnnotations() { Set > annotations = new LinkedHashSet<>(); annotations.add(BindArray.class); annotations.add(BindBitmap.class); annotations.add(BindBool.class); annotations.add(BindColor.class); annotations.add(BindDimen.class); annotations.add(BindDrawable.class); annotations.add(BindFloat.class); annotations.add(BindInt.class); annotations.add(BindString.class); annotations.add(BindView.class); annotations.add(BindViews.class); annotations.addAll(LISTENERS); return annotations; }
上面的方法主要表明會處理哪些注解
@Override public boolean process(Set elements, RoundEnvironment env) { MapbindingMap = findAndParseTargets(env); for (Map.Entry entry : bindingMap.entrySet()) { TypeElement typeElement = entry.getKey(); BindingSet binding = entry.getValue(); JavaFile javaFile = binding.brewJava(sdk); try { javaFile.writeTo(filer); } catch (IOException e) { error(typeElement, "Unable to write binding for type %s: %s", typeElement, e.getMessage()); } } return true; }
然後就是在編譯的時候的具體處理過程,這個過程主要時先找到並解析注解,然後生成java文件,這樣在虛擬機真正執行的時候就不用去查找和解析,也就不會耗時了。
* EventBus
EventBus是使用運行時注解,主要的作用是在運行的時候會去查找所有被注解的方法,然後再去解析注解。運行時注解會影響程序的性能,畢竟在運行的時候有一個查找的過程,所以運行時注解的作用一般是標記一個作用區。
思想:將一個View設計成多層,內層(包括中獎信息)和外層(用於刮獎),外層的圖層用Canvas與一個Bitmap關聯,用這個關聯的Bitmap來處理手勢的滑動,類似於刮
目前的應用市場上,使用毛玻璃效果的APP隨處可見,比如用過微信語音聊天的人可以發現,語音聊天頁面就使用了高斯模糊效果。先看下效果圖: 仔細觀察上圖,我們可以發現
最近無意中看到釘釘這個App,發現聯系人詳情這個界面的效果還是蠻好看的。正好最近在看Material Design,所以想看看可不可用Android系統原生的來實現這種效
顯示對話框窗口 1、創建Dialog1項目,在activity_main.xml文件中添加一個Button: 2、在MainActivity.jav