編輯:關於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) {
Map bindingMap = 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是使用運行時注解,主要的作用是在運行的時候會去查找所有被注解的方法,然後再去解析注解。運行時注解會影響程序的性能,畢竟在運行的時候有一個查找的過程,所以運行時注解的作用一般是標記一個作用區。
Andriod實現刮刮卡的效果
思想:將一個View設計成多層,內層(包括中獎信息)和外層(用於刮獎),外層的圖層用Canvas與一個Bitmap關聯,用這個關聯的Bitmap來處理手勢的滑動,類似於刮
Android 高仿微信語音聊天頁面高斯模糊(毛玻璃效果)
目前的應用市場上,使用毛玻璃效果的APP隨處可見,比如用過微信語音聊天的人可以發現,語音聊天頁面就使用了高斯模糊效果。先看下效果圖: 仔細觀察上圖,我們可以發現
仿釘釘聯系人詳情界面--Material Design的使用
最近無意中看到釘釘這個App,發現聯系人詳情這個界面的效果還是蠻好看的。正好最近在看Material Design,所以想看看可不可用Android系統原生的來實現這種效
Android學習筆記(七)——顯示對話框窗口
顯示對話框窗口 1、創建Dialog1項目,在activity_main.xml文件中添加一個Button: 2、在MainActivity.jav