1 /*参考データ 2 3 4 */ 5 public class TouchTestActivity extends Activity { 6 7 @Override 8 public void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 11 } 12 13 //簡単なタッチイベント処理 14 @Override 15 public boolean onTouchEvent(MotionEvent event) { 16 switch ( event.getAction() ) { 17 18 case MotionEvent.ACTION_DOWN: 19 //画面がタッチされたときの動作 20 break; 21 22 case MotionEvent.ACTION_MOVE: 23 //タッチしたまま移動したときの動作 24 break; 25 26 case MotionEvent.ACTION_UP: 27 //タッチが離されたときの動作 28 break; 29 30 case MotionEvent.ACTION_CANCEL: 31 //他の要因によってタッチがキャンセルされたときの動作 32 break; 33 34 } 35 36 return super.onTouchEvent(event); 37 } 38 39 } 40 /* xUI.Touch(e) 41 引数: e タッチイベント 42 戻値: UI制御用 43 タッチ動作 44 タッチ処理を集中的にコントロールするファンクション 45 46 関連プロパティ 47 xUI.touchStart 48 xUI.touchEnd 49 xUI.touchEnd 50 xUI.edmode 51 0 : 通常編集 52 1 : ブロック編集 53 2 : セクション編集 54 3 : セクション編集フローティング 55 モード変更はxUI.mdChg関数を介してい行う 56 57 モード別テーブルセル編集操作一覧 58 59 60 61 */ 62 xUI.Touch=function(e){ 63 xUI.touchStart 64 xUI.touchEnd 65 66 67 console.log(e.target.id); 68 if(e.target.id=='dialogEdit'){return false}; 69 if((this.edmode==3)&&(e.target.id=='sheet_body')&&(e.type=='mouseout')){ 70 xUI.sectionUpdate(); 71 this.mdChg(2); 72 this.Touch.action=false; 73 return false; 74 }; 75 if(dbg) dbgPut(e.target.id+":"+e.type.toString()); 76 //document.getElementById("iNputbOx").focus(); 77 78 if(this.edchg){ this.eddt= document.getElementById("iNputbOx").value }; 79 //IEのとき event.button event.srcElement 80 // if(MSIE){TargeT = event.srcElement ;Bt = event.button ;}else{}; 81 82 var TargeT=e.target;var Bt=e.which;//ターゲットオブジェクト取得 83 // dbgPut(TargeT.id); 84 //IDの無いエレメントは処理スキップ 85 if(! TargeT.id){ 86 xUI.Touch.action = false; 87 // if (this.edmode==3){this.Touch()} 88 return false; 89 } 90 //カラム移動処理の前にヘッダ処理を追加 2010/08 91 if(TargeT.id.match(/^L([0-9]+)_(-?[0-9]+)_([0-9]+)$/)) { 92 var tln=1*RegExp.$1;var pgn=1*RegExp.$2;var cbn=1*RegExp.$3;//timeline(column)ID/pageID/columnBlockID 93 switch(e.type){ 94 case "dblclick": 95 reNameLabel((tln).toString()); 96 break; 97 case "mousedown": 98 if(this.edmode==0)xUI.changeColumn(tln,2*pgn+cbn); 99 break; 100 } 101 xUI.Touch.action = false; 102 return ; 103 } 104 //-------------------ヘッダ処理解決 105 106 // if(TargeT.id.split("_").length>2){return false};//判定を変更 107 //ページヘッダ処理終了 108 //=============================================モード別処理 109 if(this.edmode==3){ 110 /* 111 セクション編集フローティング 112 113 フローティング移動中 114 115 */ 116 117 var hottrack=TargeT.id.split('_')[0]; 118 var hotpoint=TargeT.id.split('_')[1]; 119 switch (e.type){ 120 case "dblclick" : 121 case "mousedown" : 122 document.getElementById("iNputbOx").focus(); 123 break; 124 case "click" : 125 case "mouseup" ://終了位置で解決 126 //[ctrl][shift]同時押しでオプション動作 127 xUI.sectionUpdate(); 128 this.mdChg(2); 129 this.Touch.action=false; 130 131 // this.floatTextHi(); 132 break; 133 case "mouseover" : 134 if((hottrack!=xUI.Select[0])||(! xUI.Touch.action)) { 135 if(TargeT.id && TargeT.id.match(/r?L\d/)){ 136 xUI.sectionUpdate(); 137 this.mdChg(2); 138 this.Touch.action=false; 139 } 140 return false 141 }; 142 if(! this.Touch.action){ 143 return false; 144 145 if(this.Touch.action){ 146 if (TargeT.id && xUI.Touch.rID!=TargeT.id ){ 147 this.selection(TargeT.id); 148 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 149 return false; 150 }else{ 151 return true; 152 }; 153 }; 154 }else{ 155 this.sectionPreview(hotpoint); 156 } 157 break; 158 default : return true; 159 }; 160 return false; 161 162 }else if(this.edmode==2){ 163 document.getElementById("iNputbOx").focus(); 164 var hottrack=TargeT.id.split('_')[0]; 165 var hotpoint=TargeT.id.split('_')[1]; 166 /* 167 モード遷移は他の状態からコール 168 セクション編集モード 169 トラック内限定で区間編集を行う。 170 モード変更コマンドの発行はemode==0の際のみ有効 171 モード変更のトリガは、ダブルクリック 172 基本操作 173 3種のターゲットがある 174 body 175 セクション全体がトラック内を前後に移動する 176 フローティングムーブに準ずる処理 ホットポイントオフセットが存在する 177 head 178 tail 179 トラック内でセクションが伸縮 180 他のノードを固定してヘッドまたはテールノードが移動することでセクションを伸縮する 181 182 edmode==3 中は、タッチオーバーでセクション body||head||tail 移動 183 リリースで移動(=編集)を解決 1回毎に更新回数を記録 184 ダブルクリックまたは対象トラック外をクリックで解決してモード解除 185 エスケープまたは対象トラック外右クリックで変更を廃棄して編集前に戻す 186 187 キーボード操作(1フレームづつ移動なので要注意) 188 モード遷移・確定 [ctrl]+[shift]+[ENTER] 189 ボディ移動 [↑]/[↓] 190 ヘッド移動 [ctrl]+[↑]/[↓] 191 テール移動 [shift]+[↑]/[↓] 192 [shift]+[ctrl]+[↑]/[↓] 193 編集破棄+モード解除 194 [esc] 195 196 セクション操作オフセットをxUIのプロパティで設定する 197 値が0なら前方伸長 値が末尾なら後方伸長それ以外は移動 198 継続時間が1の場合は末尾として扱う 199 解決順が 末尾>先頭>以外になれば操作種別を1種にできる 200 すべてsectionMove(start,duration)に集約できそう 201 202 */ 203 switch (e.type){ 204 case "dblclick" : 205 //セクション操作モードを抜けて確定処理を行う 206 //確定処理はmdChg メソッド内で実行 207 this.mdChg("normal"); 208 break; 209 case "mousedown" : 210 //サブモードを設定 211 if(( 212 Math.abs(hotpoint -(xUI.Select[1]+(xUI.Selection[1]/2))) > 213 Math.abs(xUI.Selection[1]/2) 214 )&&(hottrack == xUI.Select[0]) 215 ){ 216 //レンジ外 217 if (e.shiftKey){ 218 //近接端で移動 219 xUI.sectionManipulateOffset[1] = (hotpoint<xUI.Select[1])? 0:this.Selection[1]; 220 xUI.sectionManipulateOffset[0] = 'body'; 221 }else if((e.ctrlKey)||(e.metaKey)){ 222 //近接端で延伸 223 xUI.sectionManipulateOffset[1] = (hotpoint<xUI.Select[1])? 0:this.Selection[1]; 224 xUI.sectionManipulateOffset[0] = (hotpoint<xUI.Select[1])? 'head':'tail'; 225 }else{ 226 return xUI.mdChg(0);//モード解除 227 } 228 this.sectionPreview(hotpoint); 229 this.sectionUpdate(); 230 }else{ 231 //フロートモードへ遷移 232 xUI.sectionManipulateOffset[1] = hotpoint-this.Select[1]; 233 xUI.sectionManipulateOffset[0] = 'body'; 234 if(xUI.sectionManipulateOffset[1]==xUI.Selection[1]){ 235 xUI.sectionManipulateOffset[0] = 'tail'; 236 } else if(xUI.sectionManipulateOffset[1]==0){ 237 xUI.sectionManipulateOffset[0] = 'head'; 238 } 239 } 240 xUI.mdChg(3); 241 xUI.Touch.action=true; 242 // console.log([xUI.edmode,hotpoint,xUI.sectionManipulateOffset,xUI.Touch.action]); 243 break; 244 case "click" :;//クリックしたセルで解決 (any):body/+[ctrl]:head/+[shift]:tail 245 if(hottrack!=xUI.Select[0]) { 246 //対象トラック外なら確定して解除 247 this.mdChg("normal"); 248 } 249 break; 250 251 case "mouseup" ://終了位置で解決 252 //[ctrl]同時押しで複製処理 253 // this.mdChg(0,(e.ctrlKey)); 254 this.Touch.action=false; 255 this.floatTextHi(); 256 break; 257 case "mouseover" : 258 259 //トラックが異なる場合 NOP return 260 // var sectionRegex=new RegExp('^'+String(xUI.Select[0])+'_([0-9]+)$'); 261 // if((!(TargeT.id.match(sectionRegex)))||(! xUI.Touch.action)){return false};//ターゲットトラック以外を排除 262 if((hottrack!=xUI.Select[0])||(! xUI.Touch.action)) {return false}; 263 if(! this.Touch.action){ 264 return false; 265 266 if(this.Touch.action){ 267 if (TargeT.id && xUI.Touch.rID!=TargeT.id ){ 268 this.selection(TargeT.id); 269 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 270 return false; 271 }else{ 272 return true; 273 }; 274 }; 275 }else{ 276 this.sectionPreview(hotpoint); 277 } 278 break; 279 default : return true; 280 }; 281 return false; 282 283 }else if(this.edmode==1){ 284 //return false; 285 //ブロックムーブ(フローティングモード) 286 /* 287 基本動作: 288 タッチオーバーでセクションを移動 289 リリースで移動を解決してモード解除 290 ダブルクリック・クリック等は基本的に発生しないので無視 291 */ 292 switch (e.type){ 293 case "dblclick" : 294 // this.mdChg("section"); 295 // this.floatTextHi();//導入処理 296 // this.selectCell(TargeT.id); 297 // this.floatDestAddress=this.Select.slice(); 298 299 case "mousedown" : 300 case "click" : 301 case "mouseup" ://終了位置で解決 302 // console.log("<<<<<<") 303 //[ctrl]同時押しで複製処理 304 this.mdChg(0,((e.ctrlKey)||(e.metaKey))); 305 this.floatTextHi(); 306 break; 307 case "mouseover" ://可能な限り現在位置で変数を更新 308 if(!(TargeT.id.match(/^([0-9]+)_([0-9]+)$/))){return false};//シートセル以外を排除 309 //オフセットを参照して .Select .Selection を操作する 310 /* 311 312 */ 313 if(false){ 314 if(this.Touch.action){ 315 if (TargeT.id && xUI.Touch.rID!=TargeT.id ){ 316 this.selection(TargeT.id); 317 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 318 return false; 319 }else{ 320 return true; 321 }; 322 }; 323 }else{ 324 this.selectCell(TargeT.id); 325 this.floatDestAddress=this.Select.slice(); 326 } 327 break; 328 default : return true; 329 }; 330 return false; 331 } 332 //=============================================カラム移動処理 333 if(!(TargeT.id.match(/^([0-9]+)_([0-9]+)$/))){return false};//シートセル以外を排除 334 335 switch (e.type){ 336 case "dblclick" : 337 //ダブルクリック時はモード保留して(解除か?)タイムラインセクション編集モードに入る 338 this.mdChg("section",TargeT.id); 339 this.Touch.action=false; 340 return false; 341 break; 342 case "mousedown" : 343 //document.getElementById("iNputbOx").value=("mouseDown") 344 if (this.edchg){this.put(this.eddt);}//更新 345 346 this.Touch.rID=this.getid("Select");// 347 this.Touch.sID=TargeT.id; 348 this.Touch.action=true; 349 350 // if(TargeT.id==this.getid("Select")) 351 // { }else{ }; 352 353 if(this.Selection[0]!=0||this.Selection[1]!=0){ 354 //選択範囲が存在した場合 355 //if(dbg) dbgPut(this.edmode+":"+this.getid("Select")+"=="+TargeT.id); 356 // var CurrentSelect=TargeT.id.split("_"); 357 /* 358 var CurrentAction=this.actionRange(); 359 if( 360 (CurrentAction[0][0]<=CurrentSelect[0] && CurrentAction[1][0]>=CurrentSelect[0])&& 361 (CurrentAction[0][1]<=CurrentSelect[1] && CurrentAction[1][1]>=CurrentSelect[1]) 362 ){} 363 */ 364 if(TargeT.id==this.getid("Select")){ 365 //フォーカスセルにタッチダウンしてブロック移動へモード遷移 366 //クリック時とダブルクリック時の判定をしてスキップしたほうが良い 367 // if(TargeT.id!=this.floatDestAddress.join("_")){} 368 this.mdChg('block'); 369 this.floatTextHi(); 370 this.selectCell(TargeT.id); 371 this.floatDestAddress=this.Select.slice(); 372 373 this.Touch.action=false; 374 return false; 375 }else{ 376 if(e.shiftKey){ 377 this.selection(TargeT.id); 378 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 379 return false;//マルチセレクト 380 }else{ 381 this.selection();//セレクション解除 382 this.Touch.action=false; 383 this.selectCell(TargeT.id);//セレクト移動 384 } 385 return false; 386 } 387 }else{ 388 //選択範囲が存在しない場合 389 this.selection();//セレクション解除 390 }; 391 392 if(e.shiftKey){ 393 this.selection(TargeT.id); 394 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 395 return false;//マルチセレクト 396 }else{ 397 if ((! e.ctrlKey)&&(! e.metaKey)){this.selection()};//コントロールなければ選択範囲の解除 398 399 //this.Touch.action=false; 400 this.selectCell(TargeT.id); 401 }; 402 break; 403 case "mouseup" : 404 //document.getElementById("iNputbOx").value=("mouseUp") 405 this.Touch.action=false; 406 if( this.Touch.sID!=TargeT.id){ 407 if(e.shiftKey){ 408 this.selection(TargeT.id); 409 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 410 return false;//マルチセレクト 411 }else{ 412 return false;//セレクトしたまま移動 413 }; 414 }; 415 break; 416 case "click" : 417 418 break; 419 case "mouseover" : 420 if(this.Touch.action){ 421 if (TargeT.id && xUI.Touch.rID!=TargeT.id ){ 422 this.selection(TargeT.id); 423 if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update"); 424 return false; 425 }else{ 426 return true; 427 }; 428 }; 429 default : return true; 430 }; 431 return false; 432 }; 433