質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

3357閲覧

円の当たり判定が上手くいかなく、また、当たり判定の座標がずれます

ko20vonobird

総合スコア50

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/01/17 13:39

編集2017/01/18 02:45

###実現したいこと
onDrawで描いた図形に当たり判定を設けて連動させたいです。

###困っていること
なぜか当たり判定が行われるところがずれているのと、円の当たり判定が全くなされないです。

###該当のソースコード
全文です

Java

1import android.app.Activity; 2import android.content.Context; 3import android.content.pm.ActivityInfo; 4import android.graphics.Canvas; 5import android.graphics.Color; 6import android.graphics.Paint; 7import android.graphics.Point; 8import android.graphics.RectF; 9import android.os.Bundle; 10import android.view.Display; 11import android.view.MotionEvent; 12import android.view.View; 13import android.view.WindowManager; 14import android.widget.FrameLayout; 15import android.widget.LinearLayout; 16import android.widget.TextView; 17 18import static java.lang.Math.pow; 19 20public class Main extends Activity { 21 Screen sc; 22 private TextView textView; 23 private int winW, winH; 24 private int winW2,winH2; 25 private int colchk = 0; 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 30 //setContentView(R.layout.activity_main); 31 32 sc = new Screen(this); 33 parts(); 34 } 35 public void parts() { 36 FrameLayout fl = new FrameLayout(this); 37 this.setContentView(fl); 38 fl.addView(sc); 39 LinearLayout ll = new LinearLayout(this); 40 ll.setOrientation(LinearLayout.VERTICAL); 41 fl.addView(ll); 42 String action = "Touch Event"; 43 textView = new TextView(this); 44 textView.setText(action); 45 textView.setTextSize(36.0f); 46 ll.addView(textView); 47 } 48 @Override 49 public boolean onTouchEvent(MotionEvent event) { 50 float tx = event.getX(); 51 float ty = event.getY(); 52 WindowManager wm2 = (WindowManager)getSystemService(WINDOW_SERVICE); 53 Display dp2 = wm2.getDefaultDisplay(); 54 Point po2 = new Point(); 55 dp2.getSize(po2); 56 winW2 = po2.x; 57 winH2 = po2.y; 58 switch (event.getAction() & MotionEvent.ACTION_MASK) { 59 case MotionEvent.ACTION_DOWN: 60 if (pow(tx - (winW - 120),2) + pow(ty - (winH - 110),2) < 2500 || pow(tx - 120,2) + pow(ty - (winH - 110),2) < 2500 || (70 <= tx && tx <= 270) && (winH - 160 <= ty && ty <= winH - 60) || (winW - 270 <= tx && tx <= winW - 70) && (winH - 160 <= ty && ty <= winH - 60)){ 61 sc.colchange(); 62 }else{ 63 sc.colreturn(); 64 } 65 break; 66 case MotionEvent.ACTION_MOVE: 67 if (pow(tx - (winW - 120),2) + pow(ty - (winH - 110),2) < 2500 || pow(tx - 120,2) + pow(ty - (winH - 110),2) < 2500 || (70 <= tx && tx <= 270) && (winH - 160 <= ty && ty <= winH - 60) || (winW - 270 <= tx && tx <= winW - 70) && (winH - 160 <= ty && ty <= winH - 60)){ 68 sc.colchange(); 69 }else{ 70 sc.colreturn(); 71 } 72 break; 73 case MotionEvent.ACTION_UP: 74 sc.colreturn(); 75 break; 76 } 77 textView.setText("x:" + tx + "y:" + ty); 78 textView.setTextSize(14.0f); 79 return super.onTouchEvent(event); 80 } 81 public class Screen extends View { 82 public Screen(Context context) { 83 super(context); 84 } 85 protected void onDraw(Canvas c) { 86 super.onDraw(c); 87 WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); 88 Display dp = wm.getDefaultDisplay(); 89 Point po = new Point(); 90 dp.getSize(po); 91 winW = po.x; 92 winH = po.y; 93 int wxa = winW - 320; 94 int wxb = winW - 20; 95 int wya = winH - 160; 96 int wyb = winH - 60; 97 int r = 50; 98 RectF arear = new RectF(wxa, wya, wxb, wyb); 99 RectF areal = new RectF(20,wya,320,wyb); 100 Paint p = new Paint(); 101 c.drawColor(Color.WHITE); 102 p.setARGB(100,50,215,50); 103 if (colchk == 1){ 104 p.setARGB(100,200,50,50); 105 colchk = 0; 106 } 107 p.setStyle(Paint.Style.FILL); 108 c.drawRoundRect(arear,r,r,p); 109 c.drawRoundRect(areal,r,r,p); 110 } 111 public void colchange() { 112 colchk = 1; 113 invalidate(); 114 } 115 public void colreturn() { 116 colchk = 0; 117 invalidate(); 118 } 119 } 120}

以下で描画しています

Java

1WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); 2 Display dp = wm.getDefaultDisplay(); 3 Point po = new Point(); 4 dp.getSize(po); 5 winW = po.x; 6 winH = po.y; 7 int wxa = winW - 320; 8 int wxb = winW - 20; 9 int wya = winH - 160; 10 int wyb = winH - 60; 11 int r = 50; 12 RectF arear = new RectF(wxa, wya, wxb, wyb); 13 RectF areal = new RectF(20,wya,320,wyb); 14 Paint p = new Paint(); 15 c.drawColor(Color.WHITE); 16 p.setARGB(100,50,215,50); 17 if (colchk == 1){ 18 p.setARGB(100,200,50,50); 19 colchk = 0; 20 } 21 p.setStyle(Paint.Style.FILL); 22 c.drawRoundRect(arear,r,r,p); 23 c.drawRoundRect(areal,r,r,p);

以下が当たり判定の部分です

Java

1if (pow(tx - (winW2 - 120),2) + pow(ty - (winH2 - 110),2) < 2500 || pow(tx - 120,2) + pow(ty - (winH2 - 110),2) < 2500 || 70 <= tx && tx <= 270 && winH2 - 160 <= ty && ty <= winH2 - 60 || winW2 - 270 <= tx && tx <= winW2 - 70 && winH2 - 160 <= ty && ty <= winH2 - 60){ 2 sc.colchange(); 3 }else{ 4 sc.colreturn(); 5 } 6 break; 7 case MotionEvent.ACTION_MOVE: 8 if (pow(tx - (winW2 - 120),2) + pow(ty - (winH2 - 110),2) < 2500 || pow(tx - 120,2) + pow(ty - (winH2 - 110),2) < 2500 || 70 <= tx && tx <= 270 && winH2 - 160 <= ty && ty <= winH2 - 60 || winW2 - 270 <= tx && tx <= winW2 - 70 && winH2 - 160 <= ty && ty <= winH2 - 60){ 9 sc.colchange(); 10 }else{ 11 sc.colreturn(); 12 }

###補足
感覚ですが、四角い当たり判定のゾーンが存在しているのですが、その位置が描かれるものと数十ずれていると思われます。半円の部分が当たり判定されていないので円が当たり判定されていないのかと思われます。

###修正点
・クリック処理を無くしました
・ORとANDにおいて()でくくるべき箇所を()でくくりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2017/01/17 17:04

判定処理はどのクラスのどのメソッドから呼ばれていますか?
ko20vonobird

2017/01/18 01:07

判定処理は、MainクラスのonTouchEventメソッド?から呼ばれているはずです。また、全文を載せました。
guest

回答3

0

ベストアンサー

問題点

  • Screen#onClick内でcolchkが1になっているので、どこでもいいのでクリックしただけで当たったことになっている

  • drawRoundRectということは角丸矩形ですよね?角丸矩形の当たり判定を取りたいならこの判定式は全然成り立っていません。やりかたは色々ありますが、私が思いつく方法としては「角丸部分を除いた四角形が十字型に2つあると過程して判定を取る&角丸部分を円の4分の1であると考えて4隅分4回判定する」となります。

  • 描画のときは画面右下端から320、160の位置から300、100の大きさで書いているのに、当たり判定で使っている数値は右下端から120、110の位置を中心に50の大きさの円、画面左下から70、160の位置から200、100の大きさの矩形、画面右下から270、160の位置から200、100の大きさの矩形のように見えます

  • 当たり判定も条件のORとANDの結合優先度がめちゃくちゃで、各条件がカッコで囲まれていないため全く思ったとおりの判定にはなっていないでしょう

投稿2017/01/18 02:32

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko20vonobird

2017/01/18 02:52

一項目目について、クリック処理に関しましては誤って残したままでしたので削除しました。 二項目目について、確かに角丸ですが、四分の一の円がくっついて半円になるように描画をしているので、円が両脇にくっついている四角形を二個と捉えて判定処理を行わせております。 三項目目について、調査中です。 四項目目について、括弧で囲み修正しました。
ko20vonobird

2017/01/18 03:23

円についても解決しました、ありがとうございました。
guest

0

onTouchEventで取得できるタッチイベントは画面左上が原点の座標系です。
Canvasの描画系のメソッドで使われる座標はViewの左上を原点とした座標系です。
そのため、Viewの左上と画面の左上が一致しない限りタッチイベントと描画の位置は一致しないですよ。

投稿2017/01/18 01:10

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko20vonobird

2017/01/18 01:18

そうなのですか、初めて知りました、ありがとうございます。 Viewの左上が原点とありますが、Viewはスマホのどこを原点にしているのでしょうか? あと、どのみち円の判定がなされていないのですが、この原因は何なのでしょうか?
yona

2017/01/18 01:49

あなたが配置したViewの位置は私にはわかりません。 円の判定については判定処理が誤っているんじゃないですか。各値をコンソールに出力し、想定とどう異なるかを確認してください。
ko20vonobird

2017/01/18 02:03

了解しました。 円について、二乗のところをpow(num,2)としているのですが、そもそもこれが合っているのか疑問です。一応AndroidStudioの指示の通りに書いたのですが。また、==とイコールは二個続けて書きますが不等式は二つ続けたりはしませんよね?
ko20vonobird

2017/01/18 03:23

解決しました、ありがとうございました。
guest

0

四角い当たり判定のゾーンに色を付けて描画してみたら何か分かるんじゃないでしょうか

投稿2017/01/17 14:10

shivar

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko20vonobird

2017/01/17 14:20

後でやってみます。しかし、同じ値を設定しているはずなので文としては納得いきませんよね、、、
ko20vonobird

2017/01/18 03:24

解決しました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問