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

Stella981
• 阅读 3331

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

package trial.sample.tryontouchlistener00;
 
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class TryOnTouchListener00Activity extends Activity 
    // OnTouchを使うために。
    // 別のクラスでイベントを受け取りたいときはそっち側にこれを
    // 書いてそっちでonTouchを書く。
    // OnTouchEventはActivity全体のタッチ処理だけど
    // OnTouchListenerを使った場合は個別のViewに対してタッチを
    // 受け取ることができるってことか!
    // 例えばSurfaceViewだけのタッチに対する処理をする...とか。
    implements OnTouchListener {
     
     
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // タイトルは無しで。
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
         
        // レイアウトを作って設定
        LinearLayout layout = new LinearLayout(this);
        layout.setBackgroundColor(Color.rgb(255, 255, 0));
        layout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT));
        layout.setOrientation(LinearLayout.VERTICAL);
        this.setContentView(layout);
         
        // テキストボックス表示する
        final TextView text = new TextView(this);
        // テキストサイズを大きめに
        text.setTextSize(45);
        text.setText("確認はLogCatで!ここはタッチの範囲じゃないです。");
        layout.addView(text);
         
        // テキストボックス表示する
        final Button btn = new Button(this);
        btn.setText("これはボタンです。OnTouchListenerは登録されてません。タッチは検知されません。");
        layout.addView(btn);
         
        // GLSurfaceViewを作る
        final SurfaceView surfaceView = new SurfaceView(this);
        surfaceView.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));
        surfaceView.setOnTouchListener(this);
        surfaceView.setBackgroundColor(Color.CYAN);
        layout.addView(surfaceView);
    }
 
    ////////////////////////////////////////////////////////////
    // タッチされたイベントが全部こっちにくる
    public boolean onTouch(View v, MotionEvent event) {
         
        String currAction = "";
         
        ////////////////////////////////////////////////////////////
        // イベントの状態を調べる
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            currAction = "DOWN";
            break;
        case MotionEvent.ACTION_MOVE:
            currAction = "MOVE";
            break;
        case MotionEvent.ACTION_UP:
            currAction = "UP";
            break;
        case MotionEvent.ACTION_CANCEL:
            currAction = "CANCEL";
            break;
        }
         
        ////////////////////////////////////////////////////////////
        // タッチされている箇所を全部表示
 
        // タッチされている箇所(人差し指と親指で触ってるとか)
        int touchedPointCount = event.getPointerCount();
 
        // タッチされている座標
        for (int i = 0; i < touchedPointCount; i++) {
            Log.v(currAction + " TOUCH[" + i + "]",
                    "(" + event.getX(i) + "," + event.getY(i) + ")");
        }
 
 
        ////////////////////////////////////////////////////////////
        // MOVEイベントの履歴(画面を指でスライドさせてるとき)
 
        // MOVEイベントが起こった数
        int moveHistoryCount = event.getHistorySize();
 
        // 新しい順に取り出す(最新は一番後ろ)
        for (int i = moveHistoryCount - 1; 0 <= i; i--) {
 
            for (int j = 0; j < touchedPointCount; j++) {
                Log.v(currAction + " HISTORY[" + i + "]", "(" + event.getHistoricalX(j, i) + "," + event.getHistoricalY(j, i) + ")");
            }
        }
        //  false返すと初回タッチだけ検知するみたい
        // 一度指を話すまではonTouchメッセージが飛ばない
        // ゲームのキー入力で言うトリガみたいなもんだと思う。
        // キー入力の判定が終わった時にfalseを返すようにすればいいのか
        //  trueしてる場合はView::onTouchEventと同じようなことになる
        return true;
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
BAPIを使用のODATA作成
入力: _AIRLINE_!1(https://oscimg.oschina.net/oscnet/7778be1111b2f7657a75301a1655d7fb9cb.jpg)テーブル:_FLIGHT\_LIST_ !2(https://freesapabap.files.wordpress.com/2016/09/230.jpg?
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这