タッチイベントアプリ作成

タッチイベントアプリの作成

touchイベントを使って
スクリーンにタッチして絵を描くペイントソフトをつくる

touchイベントがマルチタッチを捕らえることに注目し
タッチした指で色が変わるようにする

とりあえず、headでは、必要なライブラリーの読み込み

bodyでは画面の作成

<div data-role="page" id="touchpaint">

<div data-role="header">
<h1>タッチイベント</h1>
</div>

<div data-role="content">
<div id="canvas"></div>
</div>

処理はJavascript


//指が増えるごとに色を変化
color = [
'rgb(255,0,0)',
'rgb(0,255,0)',
'rgb(0,0,255)',
'rgb(255,255,0)',
'rgb(255,0,255)'
];

$(document).on("pageshow","#touchpaint",function(){

//html()で動的に追加
$("#canvas").html('<canvas id="drawable" width="'+window.innerWidth+'"height="'+window.innerHeight+'" />');
canvas = $("#drawable")[0];
ctx = canvas.getContext('2d');

//追加領域での操作
$(this).on("touchmove","#drawable",function(e){

ratioX = canvas.height / canvas.clientHeight;
ratioY = canvasWidth / canvas.clientWidth;

//ブラウザーの基本動作無効化
e.preventDefault();

$.each(e.originalEvent.touches, function(idx){
//座標取得
x =(this.pageX - canvas.offsetLeft) * ratioX;
y = (this.pageY - canvas.offsetTop) * ratioY;

//描画
ctx.beginPath();
ctx.fillStyle= color[idx];
ctx.arc(x,y,10, 0* Math.PI / 180,  360 * Math.PI / 180, true);
ctx.fill();

});
});
});

$.each()については
http://qiita.com/YusukeHirao/items/8d1089c2bf86e7dc05ef
の解説がわかりやすいとおもいます

この$.each()は配列を扱う関数
引数には、
配列
コールバック関数
となっている

arc()については
http://www.html5.jp/canvas/ref/method/arc.html
を参考に

構文は
arc(
中心のx座標,
中心のy座標,
半径,
開始地点,
終了地点,
回る向きでtrueなら時計回り
)

となる

つまり
ctx.arc(x,y,10, 0* Math.PI / 180, 360 * Math.PI / 180, true);
なら

ctx.arc(

//x座標
x,

//y座標
y,1

//半径
0,

//開始地点
0* Math.PI / 180,

//終了地点
360 * Math.PI / 180,

//回る向き
true);
となる

Androidでジェスチャー

Androidでジェスチャー

http://okamototk.github.io/jquery-touch-plugin/
にデモがあったので体験

これはjQuery touchプラグインを使うことにより
Androidでも擬似的にジェスチャーが使えるようになるプラグイン

ジェスチャーの使い方は

$(document).on("touchmove","#drawable",function(e){
org = e.originalEvent;
scale = org.scale;
rotation = org.rotation;
});

scaleは、ズーム率
2つの指でスクリーンにタッチして指を動かして間隔が変化した時に
最初の状態と、動かした状態の状態でどれくらい変化したか
という倍率を取得する

倍率なので、変わらないなら1
半分なら0.5
倍なら2.0

rotationは、2本の指で画面にタッチして
指を回転したときの回転角度を
時計回りを正として取得する

例えば、右に指が90度回転すれば
値は90
左周りだとマイナスの値になる

相対座標の取得

相対座標の取得

タッチイベントの座標として
要素からの相対座標にしたいとき

たとえは、お絵かきアプリとか手書きアプリとかで
枠の中をタッチしたときに
画面の左上ではなく
枠の左上の座標を
0,0 にしたいときなどに
この相対座標の指定を行う

これも、どのスマートフォンでも使える
pageX
pageY
を使う

$(document).on("touchmove","#canvas",function(e){
canvas = $("#canvas");
org =  e.originalEvent;
x = e.originalEvent.touches[0].pageX - canvas.offset

});

android で google map 使うには meta-data が必要

android で google map 使うには meta-data が必要

codezin のソースでは

<meta-data
  android:name="com.google.android.gms.version"
  android:value="@integer/google_play_services_version" />

が載っていなくて

最近購入したポケットリファレンスでは、このコードが載っていたため
検索して調べてみたら
GooglePlay Services Rev12 から
manifest の application タグにこれを書く必要があるそうです

codezine のソースは
2013年の10月

参考にさせていただいた
http://www.notice.co.jp/archives/2050

2013年の11月

やはりAPI関連は twitter や facebook のように
仕様変更があるため
違いがでるようです

Webブラウザーのタッチイベントの種類

Webブラウザーのタッチイベントの種類

touchstart
スクリーンに指が触れたとき

touchend
スクリーンから指が離れたとき

touchmove
スクリーンに指が触れた状態で動かしたとき

touchcancel
スクリーンに触れた状態で、ロックボタンやメニューボタンを押したとき

jQueryMobileでタッチイベントを取得するには

$(document).on("touchmove","#drawable",function(e){
//ブラウザーのデフォルト動作無効化
e.preventDefault();

org = e.originalEvent;

//1本目の指の座標
x1 = org.touches[0].pageX;
y1 = org.touches[0].pageY;

//2本目の指の座標
x2 = org.touches[1].pageX;
y2 = org.touches[1].pageY;

})

タッチ座標の取得には
pageX
pageY
以外でもできるけど、OSごとの挙動がかわるため
pageX
pageY
が一番無難

気をつけるところは
タッチイベントで取得する座標は
スクリーンの物理座標じゃなくて
論理座標であること

jQueryValidateのカスタムルール追加方法

jQueryValidationのカスタムルール作成

自分で追加した検証ルール、
カスタムルールを使うには
$.validate.addMethod()
を使う

この構文は

$.validate.addMethod(
ルール名,
検証ルール関数,
デフォルトのエラーメッセージ
);

となる

検証ルール関数は

function(value, e){
  //検証内容
}

作成する検証ルール関数では
第一引数には、フィールドの入力値

第2引数には、検証を行ったフィールドの要素
が入る

実際に定義したルールを使うには
class=”ルール名”
として
input などに付ける

入力されたのが
本で使われるISBNコード
ISBN10形式なのか検証するなら

$.validate.addMethod("isbn10",function(value,e){
if(/^(¥d{9}) [¥d|X]$/.test(value)){

var check=0;
for(var n=0; n<value.length-1; n++){
 check += parseInt(value.charAt(n), 10) * (10-n);
}

checkdigit = 11 - (check % 11);
checkdigit = (checkdigit == 10)? 'X': checkdigit;

return checkdigit == value.charAt(9);

}else{
return false;
}

},
'正しいISBNを入力してください');

ルールの適用のソースは

<input type="text"  name="isbn" id="isbn" class="isbn10"/>

とすればok

jQueryValidationチェックルールその4

jQueryValidationチェックルールその4

チェックボックスの入力チェック

チェックボックスの入力チェックは
基本的にはラジオボタンと同じ

違いは、
minlength=””
を指定することで、最低チェック数の指定ができること

<div data-role="fieldcontain">
<fieldset data-role="controlgroup">
<legend>初回限定特典</legend>
<input type="checkbox" name="prize[]" id="test1" required minlength="2"/>
<label for="test1">サントラディスク</label>

<input type="checkbox" name="prize[]" id="test2"/>
</label for="test2">原画ディスク</label>

<input type="checkbox" name="prize[]" id="test3"/>
<label for="test3">短編ディスク</label>

<input type="checkbox" name="prize[]" id="test4"/>
<label for="test4">おまけディスク</label>

<label for="prize[]"  class="error" style="display:none;">
2つ以上選択してください</label>

</fieldset>
</div>

というようになる

jQueryValidationのチェックルールその3

jQueryValidationのチェックルールその3

ラジオボタンのチェック

radioボタンが選択かれているかチェックする
これは、アンケートなどに使う

<div data-role="fieldcontain">
<fieldset data-role="controlgroup">
<legend>今回のゲームの評価</legend>

<input type="radio" name="review" id="good" value="1" required/>
<label for="good">良かった</label>

<input type="radio" name="review" id="normal" value="2" />
<label for="normal">普通</label>

<input type="radio" name="review" id="bad" value="3"/>
<label for="bad">いまいち</label>

<label for="review" class="error" style="display:none;"/>チェックしてください</label>

</fieldset>
</div>

ラジオボタンの name=””は同じにして
id=”” は識別できるようにバラバラにする

label の for=”” には、それぞれ対応するラジオボタンの id=”” の中身を指定

エラーメッセージの label だけは
ラジオボタンの for=”” の中身を指定

このように
ラジオボタンのどれか1つに
requiredをつければ必須チェックがかかる

また、デフォルトだとボタンの上にメッセージがでてしまうため
class=”error”
で、エラーメッセージの位置を変更している

jQueryValidationのチェックルールその2

jQueryValidationのチェックルールその2

文字列長のチェック

minlength=””
で最小文字列

maxlength=””
で最大文字数を指定することが可能

例えば、Twitterみたいに140文字までにするなら

<input type="text" minlength="1" maxlength="140"/>

入力値が一致しているかチェック

これは、ログインのパスワードとか
確認のため、もう一回入力という、あらかじめ値があるものときに使う

これには、
equalTo=””
を使う

パスワード: <input type="password" value="" id="password"/>

パスワード(確認): <input type="password" value="" id="confirmpasswd" equalTo="#password"/>

というように使う

#password
は、id=”password” なので、これと比較している

会員登録でよくある
メールアドレス
パスワード
など、間違えると後々すごく困るものに使う

エラーメッセージの内容と、表示場所の変更

エラーメッセージの変更関連は
label要素を使う

<input type="email" id="userid" name="userid" class="required"/>
<label for="userid" class="error" style="display:none;">
メールアドレスを入力してください
</label>

label要素の
for=”” には、検証したいフィールド
今回なら input要素

id=””
もしくは
name=””
の中身を指定する

そして、class=”error”を指定しておく

最初に画面を開いたときには
このエラーメッセージは出したくないので
style=”display:none;”
としておくことで非表示になる

あと、今回は
input の下へ label を書いたから下にエラーメッセージがでるけど
入力欄の上にエラーメッセージを出したいのなら

<label for="userid" class="error" style="display:none;">
メールアドレスを入力してください
</label>
<input type="email" id="userid" name="userid" class="required"/>

とすれば
上にエラーメッセージが表示される

jQueryValidationのチェックルール

jQueryValidationの入力チェックルール

まず、
input の中で type=”” で指定
このルールは、jQueryValidationを読み込んでおくことで反映される

type=””による入力チェックが使えるのは
type=”email”
メールアドレス

type=”url”
URL

type=”date”
日付

type=”number”
自然数

次に、クラス名でのエラーチェック
これは、カスタムクラスを使えばできる

もし、メールアドレスを必須チェックにしたいのなら

<input type="text" class="required email">

というように、class=””へ
チェック項目を入力する

チェックできる項目は
required
必須チェック

email
メールアドレス

url
URL

date
日付型

dateISO
ISO型

number
自然数

digit
数字

creditcard
クレジットカード番号