event.getX()を取得する際の挙動について

1,512 views
Skip to first unread message

ジャック

unread,
Aug 4, 2011, 2:18:36 AM8/4/11
to 日本Androidの会
お世話になります。
ジャックです。

画面上にアイコンを表示し
そのアイコンをタッチすることで
画面上を自由に移動できるように
タッチイベントを取得しようと思っています。

アイコンのオブジェクトを取得後
item1.setOnTouchListener(new OnTouchListener () {
  public boolean onTouch(View v, MotionEvent event) {

   switch (event.getAction()) {

      case MotionEvent.ACTION_MOVE:
    final View thisView = v;
         System.out.println(event.getX());
     break;
     }
  }
});

このような形でevent.getX()を取得すると
値が一定にならずカクカクした座標が取れてしまいます。

event.getX()を使用するにあたっての
注意点等ありましたら、ご教授頂けないでしょうか。

よろしくお願いいたします。

teas

unread,
Aug 4, 2011, 4:01:54 AM8/4/11
to android-g...@googlegroups.com
teasです。

もしかするとfloatでとらずにintにキャストしてあげるとうまくいくかも。
System.out.println((int) event.getX()); 

yoshiyuki kanno

unread,
Aug 4, 2011, 9:31:01 AM8/4/11
to android-g...@googlegroups.com
菅野です。

ACTION_MOVEイベントはリソース効率を良くする為に、毎回コールバックされる訳ではなく
ある一定の間隔でコールバックされます。
このため、コールバック間で発生した全イベントは
getHistoricalX(int, int)、getHistoricalY(int, int)
を通して取得する事ができます。
これを利用すれば、スムーズな座標を取得できると思います。

http://developer.android.com/reference/android/view/MotionEvent.html

2011年8月4日15:18 ジャック <y.e...@maplesystems.co.jp>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
Stoic Corp.
CEO Yoshiyuki Kanno
web: http://www.stoic.co.jp/
mailto:yoshiyu...@stoic.co.jp

ジャック

unread,
Aug 4, 2011, 9:39:50 PM8/4/11
to 日本Androidの会
返信ありがとうございます。
ジャックです。

getHistoricalX(int, int)
試してみました。

取れてくる値は滑らかになるのですが、
取れるタイミングが指で触っているタイミングとずれてしまい
値も比較的大きく飛んだ値になりました。

ドラッグしている指についてくるくらいの
精度、頻度で値を取得する方法はコツがあるものでしょうか。

近似値を計算しつつ出す方法になるのかな。。。
と考えているのですが。。
> mailto:yoshiyuki.ka...@stoic.co.jp

しかじろう

unread,
Aug 4, 2011, 9:59:18 PM8/4/11
to android-g...@googlegroups.com
しかじろうです。

ちょっと話がずれちゃうかもしれませんが、SurfaceViewは使われていますか?
アイコンが移動する画面描画で処理が遅れたりしてるかもしれません。

あと、setOnTouchListenerでリスナーを登録するのではなくて、onTouchEventをoverrideしたほうが精度が高かったような。
うろ覚えですいません。

2011/8/5 ジャック <y.e...@maplesystems.co.jp>:

--
/**
* @name : しかじろう【渡辺 慎二郎】
* @twitter : http://twitter.com/shikajiro
* @mail : shik...@gmail.com
* @profile http://www.google.com/profiles/shikajiro
*/

しかじろう

unread,
Aug 4, 2011, 10:36:21 PM8/4/11
to android-g...@googlegroups.com
ActivityのonTouchEventをoverrideされている感じですかね?

半年前の僕は、動かしたい対象の座標とeventの座標を比較して、一致したものを動かしてました。
これはちょっと泥臭いやり方ですね。

未経験ですが、ViewにもonTouchEventがあるので、
ViewをextendしたHogeViewを作って、onTouchEventをoverrideしたらできるかもしれません。


2011/8/5 ジャック <y.e...@maplesystems.co.jp>:
> 返信ありがとうございます。
> ジャックです。
>

> SurfaceViewは使っていません。
> ゲーム等の処理ほどではないし。。。
> といった理由なので使ってみようかなと思います。
>
> また、onTouchEventをoverrideしたほうが精度が高かったような。
> これズバリなんです。
>
> 精度が全然違いました。
> ただメソッドの引数がeventのみだったので
> 画面全体のタッチイベントを取得してしまい、
> 動かしたいアイコンのみのタッチイベントには
> どうすればいいのかが分からず、各オブジェクトに対して
> リスナーを貼っています。
>
> 画面全体に反応せず各オブジェクト毎に
> onTouchEventを振り分けることは可能でしょうか。
>
> タッチ一つとっても
> 挙動の振り分けがなかなか難しいですね。
> 楽しいんですが^^

>> * @mail : shikaj...@gmail.com
>> * @profilehttp://www.google.com/profiles/shikajiro
>> */

teas

unread,
Aug 4, 2011, 10:57:48 PM8/4/11
to android-g...@googlegroups.com
teasです。
ViewでのonTouchEventもSurfaceViewと遜色ないですよ。

ジャック

unread,
Aug 5, 2011, 12:11:43 AM8/5/11
to 日本Androidの会
ジャックです。

しかじろう様、teas様

ActivityのonTouchEventをoverrideしていました。
ViewのonTouchEventをoverride試してみます。

汎用的に作るのが難しそうですが、
やってみたいと思います。

いまやってみたいと思っているのが、
アイコンを移動させると、そのアイコンに続いて
他のアイコンも同じ軌道を追いかけてくるような
機能を作ってみようと思っています。



On 8月5日, 午前11:57, teas <aste...@redcave.net> wrote:
> teasです。
> ViewでのonTouchEventもSurfaceViewと遜色ないですよ。

ソフトレット山崎

unread,
Aug 5, 2011, 12:50:43 AM8/5/11
to android-g...@googlegroups.com
ジャックさん

ソフトレットの山崎と申します。

>取れてくる値は滑らかになるのですが、
>取れるタイミングが指で触っているタイミングとずれてしまい
>値も比較的大きく飛んだ値になりました。

System.out.println() は結構処理コスト(時間)を占有すると思いますので
連続でタッチイベントが来ると、その分printして、その後来るイベントは
間引かれると思います。
なので・・・ある程度値が取れる確認ができたら、System.out.println() は
コメントアウトした方がイベントがガンガン来てくれて、結果的に滑らかに
なると思います。

※的違いの内容でしたらすみません。


以上。
2011年8月5日13:11 ジャック <y.e...@maplesystems.co.jp>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>
>
>

--
------------------------------------------------
株式会社 SofToLet (http://www.softolet.com/)
[住所] 大阪市中央区平野町1-5-9 井上ビル2F
[TEL/FAX] 06-6222-3218
[携帯] 090-7878-1480
山崎誠 (mailto:m_yam...@softolet.com)
------------------------------------------------

Reply all
Reply to author
Forward
0 new messages