AndroidでOnTouchListenerを使ったタッチ処理サンプル@tryOnTouch...

OnTouchListenerのonTouchを使ってタッチに対する処理をする。
OnTouchListenerの場合onTouchEventとは違ってコントロール個別の
(Button,SurfaceViewとか)タッチを検知できる。

動的にコントロールを配置してレイアウトを作る
main.xmlは使わない。
動的にGLSurfaceViewをはめ込む。
画面いっぱいにボタンを配置

●大事なところ
setOnTouchListenerを忘れない。

●関連項目
 onTouch
 MotionEvent
 getHistoricalX
 getHistoricalY
 getX
 getY
 getHistorySize
 getPointerCount

開発環境
Eclipse IDE バージョン: 3.7 Indigo Service Release 1
ターゲットプラットフォーム: 2.3.3
API レベル: 10

1package trial.sample.tryontouchlistener00; 2 3import android.app.Activity; 4import android.graphics.Color; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.MotionEvent; 8import android.view.SurfaceView; 9import android.view.View; 10import android.view.Window; 11import android.view.View.OnTouchListener; 12import android.widget.Button; 13import android.widget.LinearLayout; 14import android.widget.TextView; 15 16public class TryOnTouchListener00Activity extends Activity 17 // OnTouchを使うために。 18 // 別のクラスでイベントを受け取りたいときはそっち側にこれを 19 // 書いてそっちでonTouchを書く。 20 // OnTouchEventはActivity全体のタッチ処理だけど 21 // OnTouchListenerを使った場合は個別のViewに対してタッチを 22 // 受け取ることができるってことか! 23 // 例えばSurfaceViewだけのタッチに対する処理をする...とか。 24 implements OnTouchListener { 25 26 27 /** Called when the activity is first created. */ 28 @Override 29 public void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 // タイトルは無しで。 32 this.requestWindowFeature(Window.FEATURE_NO_TITLE); 33 34 // レイアウトを作って設定 35 LinearLayout layout = new LinearLayout(this); 36 layout.setBackgroundColor(Color.rgb(255, 255, 0)); 37 layout.setLayoutParams(new LinearLayout.LayoutParams( 38 LinearLayout.LayoutParams.FILL_PARENT, 39 LinearLayout.LayoutParams.FILL_PARENT)); 40 layout.setOrientation(LinearLayout.VERTICAL); 41 this.setContentView(layout); 42 43 // テキストボックス表示する 44 final TextView text = new TextView(this); 45 // テキストサイズを大きめに 46 text.setTextSize(45); 47 text.setText("確認はLogCatで!ここはタッチの範囲じゃないです。"); 48 layout.addView(text); 49 50 // テキストボックス表示する 51 final Button btn = new Button(this); 52 btn.setText("これはボタンです。OnTouchListenerは登録されてません。タッチは検知されません。"); 53 layout.addView(btn); 54 55 // GLSurfaceViewを作る 56 final SurfaceView surfaceView = new SurfaceView(this); 57 surfaceView.setLayoutParams(new LinearLayout.LayoutParams( 58 LinearLayout.LayoutParams.MATCH_PARENT, 59 LinearLayout.LayoutParams.WRAP_CONTENT)); 60 surfaceView.setOnTouchListener(this); 61 surfaceView.setBackgroundColor(Color.CYAN); 62 layout.addView(surfaceView); 63 } 64 65 //////////////////////////////////////////////////////////// 66 // タッチされたイベントが全部こっちにくる 67 public boolean onTouch(View v, MotionEvent event) { 68 69 String currAction = ""; 70 71 //////////////////////////////////////////////////////////// 72 // イベントの状態を調べる 73 switch (event.getAction() & MotionEvent.ACTION_MASK) { 74 case MotionEvent.ACTION_DOWN: 75 currAction = "DOWN"; 76 break; 77 case MotionEvent.ACTION_MOVE: 78 currAction = "MOVE"; 79 break; 80 case MotionEvent.ACTION_UP: 81 currAction = "UP"; 82 break; 83 case MotionEvent.ACTION_CANCEL: 84 currAction = "CANCEL"; 85 break; 86 } 87 88 //////////////////////////////////////////////////////////// 89 // タッチされている箇所を全部表示 90 91 // タッチされている箇所(人差し指と親指で触ってるとか) 92 int touchedPointCount = event.getPointerCount(); 93 94 // タッチされている座標 95 for (int i = 0; i < touchedPointCount; i++) { 96 Log.v(currAction + " TOUCH[" + i + "]", 97 "(" + event.getX(i) + "," + event.getY(i) + ")"); 98 } 99 100 101 //////////////////////////////////////////////////////////// 102 // MOVEイベントの履歴(画面を指でスライドさせてるとき) 103 104 // MOVEイベントが起こった数 105 int moveHistoryCount = event.getHistorySize(); 106 107 // 新しい順に取り出す(最新は一番後ろ) 108 for (int i = moveHistoryCount - 1; 0 <= i; i--) { 109 110 for (int j = 0; j < touchedPointCount; j++) { 111 Log.v(currAction + " HISTORY[" + i + "]", "(" + event.getHistoricalX(j, i) + "," + event.getHistoricalY(j, i) + ")"); 112 } 113 } 114 // false返すと初回タッチだけ検知するみたい 115 // 一度指を話すまではonTouchメッセージが飛ばない 116 // ゲームのキー入力で言うトリガみたいなもんだと思う。 117 // キー入力の判定が終わった時にfalseを返すようにすればいいのか 118 // trueしてる場合はView::onTouchEventと同じようなことになる 119 return true; 120 } 121}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )