Android系統對鼠標的支持並不好,因爲Android系統原本是爲手機量身定做的,手機系統基本上是不需要鼠標的。但是隨着Android系統移植到其他領域,對鼠標的支持也越來越有意義。現在Android已經支持鼠標了,但是有一個完善的過程。本文後面會介紹到Android對鼠標支持的一些不足。
原來我以爲Android系統的光標會和Windows差不多,是一個圖片資源呢。這樣的話,我只需要替換掉這個圖片就可以搞定了。找了好久都沒有找到圖片資源的位置,最終反過來思考,Android系統鼠標光標非常簡單,手動繪製也不是很難的事情。會不會是代碼中繪製的呢?
沿着這個思路,終於在WindowManagerService.java中,找到了相關的代碼:
frameworks/base/services/java/com/android/server/WindowManagerService.java
相關的代碼位於performLayoutAndPlaceSurfacesLockedInner方法中:
mMouseSurface = new Surface(mFxSession, 0,-1,mMw,mMh, PixelFormat.TRANSPARENT, Surface.FX_SURFACE_NORMAL); mCanvas = mMouseSurface.lockCanvas(null); mCanvas.drawColor(0x0); mPath.moveTo(0.0f, 0.0f); mPath.lineTo(16.0f, 0.0f); mPath.lineTo(0.0f, 16.0f); mPath.close(); mCanvas.clipPath(mPath); mCanvas.drawColor(0x66666666); mMouseSurface.unlockCanvasAndPost(mCanvas); mMouseSurface.openTransaction(); mMouseSurface.setSize(mMw,mMh); mMouseSurface.closeTransaction();
可以看出默認情況下Android系統用顏色值0×66666666繪製了一個三角形,這個顏色值爲32bit——A8R8G8R8,A表示透明度,0表示全部透明,0xff爲不透明,0×66表示半透明。
你可以修改其中代碼來修改鼠標光標的形狀,需要學習一下Android繪圖系統,熟悉Paint,Canvas等概念,不過挺簡單的。下面是我的光標繪製的代碼:
mMouseSurface = new Surface(mFxSession, 0,-1,mMw,mMh, PixelFormat.TRANSPARENT, Surface.FX_SURFACE_NORMAL); mCanvas = mMouseSurface.lockCanvas(null); mCanvas.drawColor(0x0); mPath.moveTo(0.0f, 0.0f); mPath.lineTo(0.0f, 19.0f); mPath.lineTo(14.0f, 14.0f); mPath.close(); mCanvas.clipPath(mPath); mCanvas.drawColor(0xFFFFFFFF); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(0xFF000000); mCanvas.drawPath(mPath, paint); mMouseSurface.unlockCanvasAndPost(mCanvas); mMouseSurface.openTransaction(); mMouseSurface.setSize(mMw,mMh); mMouseSurface.closeTransaction();
繪製的光標爲一個瘦一點兒的不透明的白色填充的三角形,然後用黑色給白色三角形描邊。主要是模仿Windows的光標風格,對於各種顏色基調的主題這個光標都可以很清晰。
可以看出Android系統鼠標光標的定製不是非常容易,需要修改代碼,相信Android後續版本會對鼠標的支持有改進。以上代碼僅供參考,如有錯誤敬請指正。