編輯:關於Android編程
目的:在應用層,進入特定的應用顯示自己的指定的鼠標icon,或者隨時切換鼠標icon。
實現方案:開機預加載鼠標icon,app發送廣播方式通過不同的index,show出不同的icon。
Android系統鼠標流程原理:
系統開機底層會調用java的一個方法getPointerIcon去加載java層的icon資源,然後畫到最頂層的surface上面,開啟只執行一次。所以要隨時更換鼠標圖片需要打通一條路讓java層調用初始化鼠標icon的方法。鼠標的一切資源都是有java層,frameworks/base/core/res/res 裡面提供。包括鼠標icon,鼠標focus等。
客制化過程:
1.添加icon 對應xml 文件:frameworks/base/core/res/res
在這個文件夾的對應drawable-mdpi drawable-hdpi drawable-xdpi中,
放進准備好的鼠標圖片資源pointer_orbbec_arrow.png
系統默認文件如下:
增加完自己准備的圖片和xml(xml直接復制就可以)
Xml文件裡的內容也要修改:
原本:
添加的xml:
三個drawable分別這麼修改。
1.修改frameworks/base/core/res/res/values下的文件
Styles.xml中添加一個我們自己的icon item
添加的ICON 名字是 pointerOrbbecIconArrow
Java代碼中會根據這個名字來尋找圖片資源,所以一定要准確。
Attrs.xml文件 添加剛才的icon
到這裡icon資源配置修改完畢。
1.修改JNI層代碼:
frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp
函數:obtainPointerController
主要是添加一個if分之對controller非空的處理,這個時候要注意要用系統原先的mouse controller 故注釋掉new語句。原來的if句稍作修改:
這裡修改了Android原生的方法getPointerIcon的參數,也就是加了一個整型參數,對應的JNI層函數聲明和注冊java method都要留意修改,JAVA層的接口也要對應修改。
下面是加了一if分之,因為開機第一次controller是NULL,肯定進了第一個if句,後面controller非NULL,所以想換icon就是進入下面這個if分之了:
JAVA層通過渠道會調用到這個方法,這裡為了不破壞這個方法的參數結構,重新聲明定義了一個native函數,java層通過app不同的cmd而向JNI層下達對應cmd以show出不同的icon,具體如下:
這邊修改了JNI 會掉java方法的參數 getPointerIcon(),使其有個整型參數,用於區別不同的icon index。還添加了函數nativeOrbbecNotify(),所以
在這個文件的注冊java method的地方也要修改:
在函數:int register_android_server_InputManager(JNIEnv* env) {
在
static JNINativeMethod gInputManagerMethods[] = {
JNI的修改到此為止。
2.java 層的修改
Frameworks/base/services/java/com/android/server/input/InputManagerService.java
另外nativeOrbbecNotify()的聲明要加進去:
對應JNI層的方法,添加兩個索引。
以上是獲取icon資源的代碼,接下來開始在代碼上配置剛才添加的icon。
Frameworks/base/core/java/android/view/PointerIcon.java
添加新icon的index:
添加這兩個index的索引功能:
這個索引指向values下的attrrs.xml 和 style.xml文件中的關鍵變量,前面已經添加過了,注意名字要一致這些細節,上文只是舉例名字可能不一樣。
到此為止關於mouse的icon資源添加結束,接下來准備實現切換鼠標icon的功能。
2.Java層inputmanagerservices中添加特定廣播接收機,在特定情況下切換JNI層 mouse controller的icon raw內容
添加廣播接收器:
Frameworks/base/services/java/com/android/server/input/InputManagerService.java
在InputManagerService構造函數中添加以下內容:
注冊廣播接收,收到特定action “com.example.mouseicon”的時候觸發事件,dispatch()接口會向JNI層調用切換icon raw。
代碼修改完畢。
新建一個android app project。
測試結果:成功
後續只要在應用的oncreate和ondestroy加入以上發送廣播機制,就可實現進入和退出應用的時候切換鼠標icon這個功能。
在這篇文章中,我將向大家展示如何從相冊截圖。先看看效果圖:上一篇文章中,我就拍照截圖這一需求進行了詳細的分析,試圖讓大家了解Android本身的限制,以及我們應當采取的實
在Android的實際開發中,我們Android系統本身已經給我們提供了很豐富的UI以及各種實用的控件,例如TextView,Button,ImageView等。用這些
為什麼要使用多線程下載呢?究其原因就一個字:"快",使用多線程下載的速度遠比單線程的下載速度要快,說到下載速度,決定下載速度的因素一般有兩個:一個是客
Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命 日後我所寫的特效專輯也會以一添加在這個專欄上,今天寫的這個特效,是關於聊天