SamsungのGalaxy Note等、一部Android端末にはスタイラスに対応している機種がある。このスタイラスはWACOM社製の電磁誘導方式により指とスタイラスの区別が出来、またスタイラスも感圧(筆圧)によりペンの太さや濃さを変えたり、スタイラスによってはペン裏側に消しゴム機能がついているものもありそれぞれ動作を切り替える事が可能となっている。
スタイラス対応端末をお持ちであれば、筆者が公開しているAndroid用Stylus Testerを試してみるとどのようなデータが上がっているか調べる事が出来る(2013/5/7時点、本アプリはAndroid 4.0非対応)
アプリをスタイラスに対応させるのは難しくなく、onTouchEventをベースに、状態の確認を追加する程度である。
簡単なサンプルコードは以下の通り。
@SuppressLint(“NewApi”)
@Override
public boolean onTouchEvent(MotionEvent e) {
boolean sw_androidoverfour;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH)
sw_androidoverfour = false;
else
sw_androidoverfour = true;
if (e.getAction() == MotionEvent.ACTION_DOWN) {
if (sw_androidoverfour){ //for android 4.0+
if (e.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS){ //stylus
//e.getPressure() for pressure, range 0 to 1, float
else if (e.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER){ //stylus eraser
}else{ //finger
}
}else{
if (e.getMetaState() == 512){ //stylus
}else if (e.getMetaState() == 1024){ //stylus eraser
}else{ //finger
}
}
return true;
} else if (e.getAction() == MotionEvent.ACTION_UP) {
if (sw_androidoverfour){ //for android 4.0+
if (e.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS){ //stylus
}else if (e.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER){ //stylus eraser
}else{ //finger
}
}else{
if (e.getMetaState() == 512){ //stylus
}else if (e.getMetaState() == 1024){ //stylus eraser
}else{ //finger
}
}
return true;
} else if (e.getAction() == MotionEvent.ACTION_MOVE) {
if (/*use history for higher density input*/){
int N = e.getHistorySize();
for (int i=0; i<=N; i++) {
int ex,ey;
if (i == N){
ex = (int)e.getX();
ey = (int)e.getY();
}else{
ex = (int)e.getHistoricalX(i);
ey = (int)e.getHistoricalY(i);
}
}
//use ex and ey for position
if (sw_androidoverfour){ //for android 4.0+
if (e.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS){ //stylus
}else if (e.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER){ //stylus eraser
}else{ //finger
}
}else{
if (e.getMetaState() == 512){ //stylus
}else if (e.getMetaState() == 1024){ //stylus eraser
}else{ //finger
}
}
}else{
if (sw_androidoverfour){ //for android 4.0+
if (e.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS){ //stylus
}else if (e.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER){ //stylus eraser
}else{ //finger
}
}else{
if (e.getMetaState() == 512){ //stylus
}else if (e.getMetaState() == 1024){ //stylus eraser
}else{ //finger
}
}
}
return true;
}
}[/code]
スタイラス処理はandroid 4.0以降はe.getToolTypeを使用し、それより古いバージョンではe.getMetaStateを使用する。その為最初にAndroidのバージョンをBuild.VERSION.SDK_INTでチェックしている。
e.getToolTypeを記述していると古いバージョン用にビルド出来ないため、SuppressLintを関数前に記述している。
e.getToolTypeがTOOL_TYPE_STYLUSならスタイラス、TOOL_TYPE_ERASERなら消しゴム、これら以外なら指、e.getMetaStateが512ならスタイラス、1024なら消しゴム、これら以外なら指と判断する。スタイラスもしくは消しゴムの場合e.getPressureで筆圧を取得する。
筆圧は基本0~1の間の浮動小数点で返るが、機種やスタイラス自体によって返す値の範囲が異なる。筆者が試した所、Galaxy Noteの場合本体付属の標準ペンで0~0.6あたり、別売りの互換ペンの場合0~1.0であった。絵描きソフト等に使うのであれば、PhotoshopやPainterの様に、ユーザーに試し書きさせて調整出来るようにしておくべきだろう。
上記サンプルコードではe.getHistorySizeをサンプルとして入れているが、ACTION_MOVEの呼び出し間隔よりもより細かいスタイラスの座標軌跡が取れる場合、getHistoricalXやgetHistoricalYでその中間情報を取得する事が出来る。
This post is also available in: 英語
GOYARDはフランスのブランドで、1853年、フランソワ?GOYARD氏に創設されました。 GOYARD氏はパリに行き、パリでハードトランクを作りはじめました。 GOYARDの本店はパリのサントレノ通り233番地にあります。当然、GOYARDのバッグはパリで大人気です。