Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android4.4 鼠標光標切換具體整改

Android4.4 鼠標光標切換具體整改

編輯:關於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.資源配置:

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資源配置修改完畢。


2.代碼修改:

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。

代碼修改完畢。


3.測試DEMO

新建一個android app project。

\

測試結果:成功

後續只要在應用的oncreate和ondestroy加入以上發送廣播機制,就可實現進入和退出應用的時候切換鼠標icon這個功能。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved