Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.1 ) |
- 名前:管理人 日時:2022/01/28 02:23
少し調べた限りでは、割と容易にワコムタブレット対応ができそうなのですが
やはり現物が無いと実装は難しそうです( 動作テストが一切できないので… )
なるべく安価でお勧めのAndroidに接続可能なワコムタブレットがありましたら
ご紹介いただけないでしょうか? (^ ^;
( 一番安価な CTL-4100/K0 でも機能的に問題ないでしょうか…? )
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.2 ) |
- 名前:大和団次郎 日時:2022/01/28 14:52
Wacom One CTL-672
というタブレットをもってます。5500円くらい
Wacom One シリーズが一番やすいみたいです。ペンと筆圧対応だけならこれでOKです。
CTL-4100/K0には、ペンの反対側に消しゴムボタンがあって
タブレットにショートカットキーボタンが4個ついてます。
ボタンを押すとキーイベントや、マウスイベントが発行されますが、これは、Wacomの設定アプリで設定すればよいので、DxLib で対応しなくてもよいかも。
消しゴム対応をテストする場合、CTL-4100/K0 のほうがよいかもしれません。
機能が追加されたらすぐ使います。
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.3 ) |
- 名前:管理人 日時:2022/01/29 01:05
ご返答ありがとうございます
消しゴム対応も簡単にできそうですので、CTL-4100/K0 を購入しました
タブレットが届いて実装が終わるまで少し日数が掛かると思いますので、
申し訳ありませんが暫くお待ちください m(_ _)m
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.4 ) |
- 名前:管理人 日時:2022/01/30 21:37
CTL-4100/K0 が届いたので早速対応しているのですが、一つご質問です
タブレットはペンを板に接触させなくても『ペンが板に近づいている』ことを
座標付きで検出できるのですが、その情報は取得できなくても良いでしょうか?
( Android の場合マウスカーソルが強制的に表示されるので
『その情報を取得して画面に自前でカーソルを描画する』
という処理を加える必要はないので、無くても問題はなさそうですが… )
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.5 ) |
- 名前:大和団次郎 日時:2022/01/31 18:45
ペンをさわらない状態で、座標が取得できるというのは、ホバーという機能で、
マウスボタンを押さない状態で、マウスを移動させて、座標を取得するのに対応します。
これは、取得できれば、非常にうれしいです。
マウスでは、ボタンを押す前に、選択される図形がなにかがわかるので、表示を変更する
たとえば、図形が2つ重なっているときに、どちらの図形が選択されるか、という処理を
ホバー座標をつかって実装しています。
つまり、カーソルの場所の座標が取得できれば、アプリでもそれに対応した処理がやりたいです。
Apple ペンシルには、ホバー座標を取得するAPIがないみたいです。
ところが、Appleは、OSでは、ホバー座標をつかっていて、ボタンが押される前に、ボタンの表示をかえる
といった処理につかってます。
ということで、もしできるならほしいです。
マウスと同じようなAPIになっていると、使いやすいです。
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.6 ) |
- 名前:管理人 日時:2022/01/31 22:38
> マウスでは、ボタンを押す前に、選択される図形がなにかがわかるので、表示を変更する
> たとえば、図形が2つ重なっているときに、どちらの図形が選択されるか、という処理を
> ホバー座標をつかって実装しています。
なるほど、そのような用途が…
今の所 GetTouchInputLog で取得できる TOUCHINPUTDATA構造体の中の TOUCHINPUTPOINT構造体に
Pressure という圧力( 筆圧 )のメンバー変数を追加して対応しようとしているのですが、
Pressure が 0.0f だったらホバー状態と判定していただく、という形でも問題ないでしょうか?
> マウスと同じようなAPIになっていると、使いやすいです。
タブレットペン用の関数を追加するイメージはありませんでした
GetTouchInputLog に機能追加する形だと不便でしょうか? (・・;
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.7 ) |
- 名前:大和団次郎 日時:2022/02/01 07:45
・GetTouchInputLog への Pressure 追加でもよいです。
・Pressure 0 のとき、ホバー状態と判断でよいです。
・座標が得られたとき、それが指タッチなのか、ペンなのかの区別は必要です。
指、ペン、消しゴム・・
のような種類の区別でよいかも・・
・Pressure の値ですが、タブレットの種類によって数値の範囲が違っているかもしれません。
最大値をきめてもらって、DxLibで正規化(一番強くおすと最大値)してもらえるとうれしいです。
なるべく実装が簡単でメンテしやすい方法で実現してもらえるとよいです。
できるようになるだけでうれしいです。
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.8 ) |
- 名前:管理人 日時:2022/02/01 22:59
ご返答ありがとうございます
早速実装してみましたので、よろしければこちらをダウンロードしてください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版
TOUCHINPUTPOINT構造体のメンバー変数に以下のものを追加しました
float Pressure ; // 圧力( 0.0f 〜 1.0f )
float Orientation ; // 画面の上端に対する接点の方位角( ? 〜 ? )
float Tilt ; // 画面の垂線に対する接点の高度角( ? 〜 ? )
int ToolType ; // ツールタイプ( DX_TOUCHINPUT_TOOL_TYPE_UNKNOWN など )
Pressure は筆圧で、0.0f 〜 1.0f の間の値が代入されています
ただ、教えていただいた API の解説ページによるとデバイスによっては 1.0f を超える値が
代入されることもあるかもしれないとのことです
Orientation と Tilt はペンの角度なのですが、なんとこちら 3万円以上する Wacom Intuos Pro では
ないとペンの角度が取得できないらしく、今回購入した CTL-4100/K0 では値が取得できず
実際にどのような値が代入されるかは不明です
ToolType で指、ペン、消しゴムの判定ができ、代入される値は以下の何れかになります
#define DX_TOUCHINPUT_TOOL_TYPE_UNKNOWN (0) // 不明
#define DX_TOUCHINPUT_TOOL_TYPE_FINGER (1) // 指
#define DX_TOUCHINPUT_TOOL_TYPE_STYLUS (2) // スタイラスペン
#define DX_TOUCHINPUT_TOOL_TYPE_MOUSE (3) // マウス
#define DX_TOUCHINPUT_TOOL_TYPE_ERASER (4) // 消しゴム
因みに消しゴムも Wacom Intuos Pro のみに対応した消しゴム付きペンでしか対応していないので、
Intuos Pro で消しゴムを使用した際に正しく消しゴムの判定ができるかは試していないのでわかりません ( ̄▽ ̄;
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.9 ) |
- 名前:大和団次郎 日時:2022/02/03 11:24
ペンタブレットの座標、ホバー座標、筆圧が、GetTouchInputLogOne で取得できることを確認しました。
ペンだけで操作する場合は、うまく組み込みできました。太さが変わる線も描画できました。(^^)/
今、指タッチやマウスと混在した場合、ペンアップ、ペンダウンの取得に苦戦してます。
GetTouchInputLogOne ではログから削除するのと、削除しないオプションがありますが
この関数をつかうと、いままでタッチ座標を取得していた
GetTouchInput や GetTouchInputNum に影響するでしょうか
ペンがはなれたときの検出が難しいです。
ペンからイベントがきているときは、指タッチを無視するようにしています。
ホバー座標取得の状態から、ペンがタブレットからはなれた状態を検出したいのですが
よい方法はないでしょうか、
マウスのボタンの状態を取得する GetMouseInput のような関数はできないでしょうか
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.10 ) |
- 名前:管理人 日時:2022/02/04 00:51
> ペンだけで操作する場合は、うまく組み込みできました。太さが変わる線も描画できました。(^^)/
ひとまず正常に動作したようで何よりです (^ ^;
因みに手元のスマホ( SO-04J )では指タッチの圧力も取得できましたので、指タッチも
GetTouchInputLogOne で取得したほうが良いかもしれません( 若しくは GetTouchInput の引数に
圧力を取得する引数を追加すべきかも… )
> GetTouchInputLogOne ではログから削除するのと、削除しないオプションがありますが
> この関数をつかうと、いままでタッチ座標を取得していた
> GetTouchInput や GetTouchInputNum に影響するでしょうか
いえ、GetTouchInputLogOne を使用しても GetTouchInput の結果には影響はありません
> ペンがはなれたときの検出が難しいです。
すみません、ペンが離れたときは GetTouchInputLogOne の戻り値の TOUCHINPUTDATA構造体のメンバー変数
PointNum が 0 になり、それで判定できるようになっています
if( GetTouchInputLogNum() > 0 )
{
TOUCHINPUTDATA Touch = GetTouchInputLogOne();
if( Touch.PointNum == 0 )
{
// ペンが離れた
}
}
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.11 ) |
- 名前:大和団次郎 日時:2022/02/05 08:33
だいたい、望み通りの動き(マウス、指、ペンの混在)ができるようになりました。
今の関数だけでつかえるみたいです。感謝です。
ただ、正しい呼び方をしているか確認したいので質問します
lognum = GetTouchInputLogNum() の lognum は、GetTouchInputLogOne で取得できる数なのかと思ったのですが、あっているでしょうか。
その場合、lognum の数だけ、GetTouchInputLogOne(FALSE-->削除) を行わないと、ログがどんどんたまっていきますか?
毎回、Touch = GetTouchInputLogOne();を1回だけやっていると、タイミングがずれてきたりしますか?
TOUCHINPUTDATA Touch = GetTouchInputLogOne(); の
Touch.PointNum は、点データの数かと思ったのですが、この値が0になれるということは、
なにもデータがなくても、データなしというログがどんどん追加されていくということでしょうか?
それとも1つだけ追加しておわり?
GetTouchInputLogOne(FALSE-->削除)を行うと、GetTouchInputLogNum()の値は1減りますか
もしそうだとすると、以下のような、呼び方は正しいですか?
for( ;GetTouchInputLogNum() > 0; )
{
TOUCHINPUTDATA Touch = GetTouchInputLogOne();
if( Touch.PointNum == 0 ){
// ペンが離れた
}else{
for(i=0; i<Touch.PointNum ; i++){
// 各点のToolTypeの種類によって処理をわける
}
}
}
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.12 ) |
- 名前:管理人 日時:2022/02/06 05:55
望まれる処理が実装できたようで何よりです
> その場合、lognum の数だけ、GetTouchInputLogOne(FALSE-->削除) を行わないと、ログがどんどんたまっていきますか?
はい
> 毎回、Touch = GetTouchInputLogOne();を1回だけやっていると、タイミングがずれてきたりしますか?
1フレームにログが1つしか溜まらない保証は無いので、場合によってはずれてくる可能性はあります
> TOUCHINPUTDATA Touch = GetTouchInputLogOne(); の
> Touch.PointNum は、点データの数かと思ったのですが、この値が0になれるということは、
> なにもデータがなくても、データなしというログがどんどん追加されていくということでしょうか?
> それとも1つだけ追加しておわり?
Touch.PointNum が 0 のログは全てのタッチやペンが画面から離れたときに1つだけ追加されますので、
『何もしなくても Touch.PointNum が 0 のログがどんどん追加される』ということはありません
> GetTouchInputLogOne(FALSE-->削除)を行うと、GetTouchInputLogNum()の値は1減りますか
はい
> もしそうだとすると、以下のような、呼び方は正しいですか?
はい、正しいです( 私も while( GetTouchInputLogNum() > 0 ){} という処理をよく書きます )
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.13 ) |
- 名前:大和団次郎 日時:2022/02/08 00:19
マウスと、ペンタブレットを、同時サポートした場合に、不思議な動作をするみたいです。
以下のプログラムを実行した場合、
1.Wacom筆圧ペンをつかってプログラムを起動した場合、
筆圧の取得や、描画が、正しく動作するのですが、そのあと、マウスが応答しなくなるみたいです。
GetMouseInput() のボタン取得ができなくなるみたいです。
2.同じアプリを、マウスで起動し、最初からマウスで操作すると、正しく描画できます。
筆圧ペンも動作し、マウスと筆圧ペンの両方が使えます。
筆圧ペンから先に起動したときに、なにかマウスに必要な処理どが、ぬけるといったことが
おこっていないでしょうか
テスト機は、Chromebook で、タッチパッドでも、USBマウスでも起こります。
下のプログラムを試してみていただけないでしょうか
<テストプログラム>
画面をタッチすると、赤か黄色の線がひけます。左上すみのタッチで終了
#include "DxLib.h"
int penDown; //1=前回ペンダウン、0=前回ペンアップ -1=終了
int penColor; //ペンの色
int penSize; //ペンサイズ
int msBtn; //前回のマウスボタン
// プログラムは android_main から始まります
int android_main( void )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
DrawBox( 220, 140, 420, 340, GetColor( 255,255,255 ), TRUE ) ; // 四角形を描画する
penDown = 0;
penColor = GetColor( 255,255,255 ); //白色
penSize = 10;
DrawBox( 0, 0, 50, 50, penColor, FALSE ) ; // 左上すみの四角
//イベントループ
while( ProcessMessage() == 0 && penDown >=0 )
{
TOUCHINPUTDATA tid;
TOUCHINPUTPOINT tip;
int ii,xx,yy;
switch(GetMouseInput()){ //マウスチェック
case MOUSE_INPUT_LEFT:case MOUSE_INPUT_RIGHT:
GetMousePoint(&xx, &yy);
if( penDown==0 ){ //タッチ検出(前回がペンアップ)
if( xx < 50 && yy < 50 ) //左上すみタッチ
{
penDown = -1;//終了
continue;
}
if( xx >= 220 && xx <420 && yy >= 140 && yy <340 ) penColor = GetColor( 255,0,0 ); //内側赤
else penColor = GetColor( 255,255,0 ); //外側 黄色
}
DrawCircle( xx , yy , penSize=10, penColor , TRUE ); //TRUEは塗りつぶし
penDown = 1;
msBtn = GetMouseInput();
continue;
default:
if(msBtn != GetMouseInput()){
penDown = 0;
}
msBtn = GetMouseInput();
}
if(GetTouchInputLogNum()==0) continue;//ログの個数
tid=GetTouchInputLogOne( FALSE ) ; //ログを読み出す。FALSEは削除
if(tid.PointNum == 0)
{
penDown = 0; //ペンアップ検出
}
for(ii=0; ii < tid.PointNum; ii++) //座標入力あり
{
tip = tid.Point[ii];
switch (tip.ToolType) {
case DX_TOUCHINPUT_TOOL_TYPE_STYLUS://ペン
case DX_TOUCHINPUT_TOOL_TYPE_ERASER://消しゴム
penSize = tip.Pressure * 20; //ペンサイズ
if(tip.Pressure==0) //ペンが離れた
{
penDown = 0;
continue;
}
break;
case DX_TOUCHINPUT_TOOL_TYPE_FINGER://指
penSize = 10;
break;
case DX_TOUCHINPUT_TOOL_TYPE_MOUSE://マウス
default: continue;
}
xx = tip.PositionX; //X 座標
yy = tip.PositionY; //Y 座標
if( penDown==0 ){ //タッチ検出(前回がペンアップ)
if( xx < 50 && yy < 50 ) //左上すみタッチ
{
penDown = -1;
break;
}
if( xx >= 220 && xx <420 && yy >= 140 && yy <340 ) penColor = GetColor( 255,0,0 ); //内側赤
else penColor = GetColor( 255,255,0 ); //外側 黄色
}
DrawCircle( xx , yy , penSize, penColor , TRUE ); //TRUEは塗りつぶし
penDown = 1;
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.14 ) |
- 名前:管理人 日時:2022/02/09 02:53
スマホにUSBハブを繋いで、USBハブにマウスとタブレットを接続した状態で
載せていただいたプログラムを実行し、1, 2 の手順を試した所、私の手元でも
1 の手順の場合マウスのボタンが反応しない現象が発生しました
原因を調べた所、タブレットのペンはマウスデバイスとしても認識されているため、
先にペンを使用するとペン( マウスデバイス0 )・マウス( マウスデバイス1 )となり、
GetMouseInput ではマウスデバイス0のボタン入力しか見ていなかったため
1 の手順の場合はマウスのボタンを押しても反応が無い、という状態になってしまっていました
( 「マウスを二つも接続する事は無いだろう」と思ってデバイス0を決め打ちで見る処理にしていました orz )
処理を『全てのマウスデバイスのボタン入力状態を合成する』というものに変更することで
1 の手順でもマウスの入力が取得できるようにできましたので、
お手数で申し訳ありませんが、よろしければこちらの修正版をお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.15 ) |
- 名前:大和団次郎 日時:2022/02/09 10:22
なるほどです。原因調査と修正ありがとうございます。
ダウンロードしたのですが、前のライブラリと同じ内容でした。
前回のキャッシュを読んでいるかもしれないので、
できれば名前を変更してもらえないでしょうか。
-2 をつけるとか・・
ぜひ使いたいです
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.16 ) |
- 名前:管理人 日時:2022/02/10 01:21
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.17 ) |
- 名前:大和団次郎(解決) 日時:2022/02/11 18:26
ありがとうございました。これをつかったアプリを公開しました。
今回の筆圧ペンつき DxLib をつかった AndroidStudio アプリの作り方を記事にしました。
//qiita.com/danjiro/items/7c7fae8bc8db916b3818
|
Re: Android版に、ワコムタブレット用APIはできないでしょうか ( No.18 ) |
- 名前:管理人(解決) 日時:2022/02/12 14:26
> 今回の筆圧ペンつき DxLib をつかった AndroidStudio アプリの作り方を記事にしました。
動画付きの凄くしっかりとした解説で驚きました!
Windows版の開発で使用する Visual Studio と比較すると Android Studio はあまり使用しなくて
使い方を失念してしまったりすることがあるので、そんな時にこちらの解説を拝見させていただきます (^ ^;
|