Androidでのマウスカーソルの画像表示について

1,894 views
Skip to first unread message

TwoDream

unread,
Jan 22, 2011, 10:49:53 AM1/22/11
to 日本Androidの会
初めまして。TwoDreamと申します。

初めて投稿させて頂きます。

x86版の環境を使って手持ちのネットブックに入れて、Androidに関してミドル(KernelやFramework)から
アプリケーションまで広く勉強中です。

x86版を使っているのは、手元にG1等の実機がなく、VM環境等を利用して手軽に勉強が出来ると思ったからで、
深い意味はありません。

本題ですが、Androidでは標準でマウスカーソルの表示(そもそもマウス全般)に対応していませんが、
x86版では、さすがに標準(レポジトリからソースを取得した時点)で対応しています。

巷で上がっているマウス用のPatchが適用されているようでした。

そのx86版の標準環境では、シンプルな白縁の黒塗りのマウスカーソルが表示されますが、これを自分好みの
画像(pngやgif等)に変えられないか、と思った事がきっかけです。

マウス表示の処理に関して調べたところ、WindowManagerServiceというClassの中で
Surface Classを利用し、取得したCanvasに対して、Paint、Path Classを利用して、
いわゆる "線" の描画を組み合わせてマウスの矢印の絵を描画していました。

実装部の抜粋は以下のようになっております。
(frameworks\base\services\java\com\android\server
\WindowManagerService.java)

mMouseSurface =
new Surface(mFxSession,
0, -1, mMw, mMh,
PixelFormat.TRANSPARENT,
Surface.FX_SURFACE_NORMAL);
mCanvas = mMouseSurface.lockCanvas(null);
Paint tPaint = new Paint();
tPaint.setStyle(Paint.Style.STROKE);
tPaint.setStrokeWidth(2);
tPaint.setColor(0xffffffff);
mPath.moveTo(0.0f, 0.0f);
mPath.lineTo(12.0f, 12.0f);
mPath.lineTo(7.0f, 12.0f);
mPath.lineTo(11.0f, 20.0f);
mPath.lineTo(8.0f, 21.0f);
mPath.lineTo(4.0f, 13.0f);
mPath.lineTo(0.0f, 17.0f);
mPath.close();
mCanvas.clipPath(mPath);
mCanvas.drawColor(0xff000000);
mCanvas.drawPath(mPath, tPaint);

mMouseSurface.unlockCanvasAndPost(mCanvas);
mMouseSurface.openTransaction();
mMouseSurface.setSize(mMw, mMh);
mMouseSurface.closeTransaction();


上記の実装を利用し、安直にmCanvas.drawPath()している個所をmCanvas.drawBitmap()に変更して
みたのですが、何も描画されませんでした。

drawBitmap()に渡すBitmapは、BitmapFactory.decodeResource()を利用してリソースから
画像データを取得するようにしています。

リソースは、png画像を使用しており、frameworks\base\core\res\res\drawable-mdpi、
frameworks\base\core\res\res\drawable-hdpiそれぞれに配置しました。

png画像は、同じディレクトリ内になる、emo_im_cool.pngをリネームして利用しています。

DDMSでログを見る限り、関連しそうなエラーログは出ていませんし、当然リソースのロードに失敗しているような
ログも出ていません。

そもそも、Frameworkでの描画方法自体知っている訳ではなく、現状の実装からこうやったら出来るのではないか?
という想像だけで試しています。

ですので、同じようにマウスカーソルを好みの画像に変更して使っている、又はマウスではないが、Framework上での
画像描画例を知っている、等の情報をお持ちの方がいらっしゃれば、ご教授頂きたく、投稿させて頂きました。

何卒、宜しくお願い致します。

TwoDraem

unread,
Jan 30, 2011, 9:47:25 AM1/30/11
to 日本Androidの会
各位、お世話になっております。
TwoDreamと申します。

自己レスになります。

先日投稿した以下の件について、自己解決出来ましたので
ご報告させて頂きます。

> 上記の実装を利用し、安直にmCanvas.drawPath()している個所をmCanvas.drawBitmap()に変更して
> みたのですが、何も描画されませんでした。

原因としては、mCanvas.drawBitmap()にて指定する座標に
問題がありました。
(かなり恥ずかしいミスでした・・・)

いろいろとありがとうございました。

2011年1月23日0:49 TwoDream <003z...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages