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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android

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

Q&A

2回答

1019閲覧

Android Studio において, デバッグに記載してある内容を参照する方法が分かりません。

takusuke

総合スコア16

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android

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

0グッド

1クリップ

投稿2020/01/17 09:21

編集2020/01/24 08:04

画像の場所にブレークポイントを置き、デバッグを起動させました。
私が取得したい値は, 「cImageView[0].getX()」からVariablesの最も下にある変数「View.mLeft」を引いた値なのです(つまりは「cImageView[0].getX()」から'42'を引き算したいと言うことです)。

しかし, 自分なりに色々と試行錯誤したのですがうまくいきません。

どのようなコードを書けば良いか教えて頂けるとありがたいです。
よろしくお願いします。

<以下追記>
Variablesにある「View.mLeft」は「View.java」という場所にあり、それの参照方法が分かりません。。。

<詳細コードの追記>

java

1textView[0].setOnTouchListener(new View.OnTouchListener() { 2 @Override 3 public boolean onTouch(View v, MotionEvent event) { 4 // x,y 位置取得 5 6 7 8 int newbuttonX = (int)event.getRawX(); 9 int newbuttonY = (int)event.getRawY(); 10 11 12 switch (event.getAction()) { 13 // タッチダウンでdragされた 14 case MotionEvent.ACTION_MOVE: 15 // ACTION_MOVEでの位置 16 // performCheckを入れろと警告が出るので 17 v.performClick(); 18 19 x = (newbuttonX - buttonX); 20 y = (newbuttonY - buttonY); 21 22 23 dx = cImageView[0].getLeft() + x; 24 dy = cImageView[0].getTop() + y; 25 26 imgW = dx + cImageView[0].getWidth(); 27 imgH = dy + cImageView[0].getHeight(); 28 29 //ボタンの定義 30 button_dx = button[0].getLeft() + x; 31 button_dy = button[0].getTop() + y; 32 buttonW = button_dx + button[0].getWidth(); 33 buttonH = button_dy + button[0].getHeight(); 34 35 //単位の定義 36 unit_dx = unit[0].getLeft() + x; 37 unit_dy = unit[0].getTop() + y; 38 unitW = unit_dx + unit[0].getWidth(); 39 unitH = unit_dy + unit[0].getHeight(); 40 41 //非表示ボタンの定義 42 dbutton_dx = syoukyo[0].getLeft() + x; 43 dbutton_dy = syoukyo[0].getTop() + y; 44 dbuttonW = dbutton_dx + syoukyo[0].getWidth(); 45 dbuttonH = dbutton_dy + syoukyo[0].getHeight(); 46 47 // Viewの位置を設定する 48 cImageView[0].layout(dx, dy, imgW, imgH); 49 button[0].layout(button_dx, button_dy, buttonW, buttonH); 50 unit[0].layout(unit_dx, unit_dy, unitW, unitH); 51 syoukyo[0].layout(dbutton_dx, dbutton_dy, dbuttonW, dbuttonH); 52 53 //String str = "dx="+dx+"\ndy="+dy; 54 //textViewXY.setText(""+read_x+""); 55 //Log.d("onTouch","ACTION_MOVE: dx="+dx+", dy="+dy); 56 break; 57 case MotionEvent.ACTION_DOWN: 58 break; 59 case MotionEvent.ACTION_UP: 60 break; 61 default: 62 break; 63 } 64 65 editor = prefs.edit(); 66 //このcImageView[0].getX()で毎回値が'42'足されてしまう 67 //どうにかして'42'を参照し、引き算できたらと考えている。 68 editor.putFloat("oldx1", cImageView[0].getX()); 69 editor.apply(); 70 71 read_oldx[0] = prefs.getFloat("oldx1", 0); 72 73 editor = prefs.edit(); 74 //ここでは21値が毎回ズレてしまうので無理やり21で引き算をしている 75 //端末によってこの値は変わってしまうため、どの端末でも動作できるように実装したい・・・。 76 editor.putFloat("oldy1", cImageView[0].getY()-21); 77 editor.apply(); 78 79 read_oldy[0] = prefs.getFloat("oldy1", 0); 80 81 82 // タッチした位置を古い位置とする 83 buttonX = newbuttonX; 84 buttonY = newbuttonY; 85 86 87 return true; 88 } 89 });

私が実装しようとしている機能は、Viewをドラッグし、その位置をprefsで保存し、画面遷移した後、Viewのある画面に戻ってきても位置が保持されている機能です。
しかし、このコードであると遷移後戻ってきた際に少しだけ値がずれてしまっています。
そもそも何故値が足されていくのでしょうか・・・。

<改変後のコードの追記>

java

1textView[0].setOnTouchListener(new View.OnTouchListener() { 2 @Override 3 public boolean onTouch(View v, MotionEvent event) { 4 // x,y 位置取得 5 6 7 8 int newbuttonX = (int)event.getRawX(); 9 int newbuttonY = (int)event.getRawY(); 10 11 12 switch (event.getAction()) { 13 // タッチダウンでdragされた 14 case MotionEvent.ACTION_MOVE: 15 // ACTION_MOVEでの位置 16 // performCheckを入れろと警告が出るので 17 //v.performClick(); 18 19 x = (newbuttonX - buttonX); 20 y = (newbuttonY - buttonY); 21 22 23 dx = textView[0].getLeft() + x; 24 dy = textView[0].getTop() + y; 25 26 imgW = dx + textView[0].getWidth(); 27 imgH = dy + textView[0].getHeight(); 28 29 //ボタンの定義 30 button_dx = button[0].getLeft() + x; 31 button_dy = button[0].getTop() + y; 32 buttonW = button_dx + button[0].getWidth(); 33 buttonH = button_dy + button[0].getHeight(); 34 35 //単位の定義 36 unit_dx = unit[0].getLeft() + x; 37 unit_dy = unit[0].getTop() + y; 38 unitW = unit_dx + unit[0].getWidth(); 39 unitH = unit_dy + unit[0].getHeight(); 40 41 //非表示ボタンの定義 42 dbutton_dx = syoukyo[0].getLeft() + x; 43 dbutton_dy = syoukyo[0].getTop() + y; 44 dbuttonW = dbutton_dx + syoukyo[0].getWidth(); 45 dbuttonH = dbutton_dy + syoukyo[0].getHeight(); 46 47 // Viewの位置を設定する 48 textView[0].layout(dx, dy, imgW, imgH); 49 button[0].layout(button_dx, button_dy, buttonW, buttonH); 50 unit[0].layout(unit_dx, unit_dy, unitW, unitH); 51 syoukyo[0].layout(dbutton_dx, dbutton_dy, dbuttonW, dbuttonH); 52 53 //String str = "dx="+dx+"\ndy="+dy; 54 //textViewXY.setText(""+read_x+""); 55 //Log.d("onTouch","ACTION_MOVE: dx="+dx+", dy="+dy); 56 break; 57 case MotionEvent.ACTION_DOWN: 58 break; 59 case MotionEvent.ACTION_UP: 60 break; 61 default: 62 break; 63 } 64 65 editor = prefs.edit(); 66 editor.putFloat("oldx1", textView[0].getX()-v.getLeft()); 67 editor.apply(); 68 69 read_oldx[0] = prefs.getFloat("oldx1", 0); 70 71 editor = prefs.edit(); 72 editor.putFloat("oldy1", textView[0].getY()-v.getTop()); 73 editor.apply(); 74 75 read_oldy[0] = prefs.getFloat("oldy1", 0); 76 77 78 // タッチした位置を古い位置とする 79 buttonX = newbuttonX; 80 buttonY = newbuttonY; 81 82 83 return true; 84 } 85 });

これで実行しますと、ドラッグ自体はうまく動作するのですが、ドラッグ前の位置が保存されドラッグ後の位置保存がうまくいきません。

<2020/01/24追記>
皆様のご回答を元にLogを辿ったり色々試してみた結果、以下のことが判明いたしました。

・ドラッグ後の座標取得自体はうまくいっている
・OnCreate()でsetX()を使用しているが, この関数はxmlで指定した位置からの座標移動であるため座標がずれてしまう
・実現するには, setX()を使用する前にViewを画面上の(0, 0)座標に初期化しなければいけない

画面上の(0, 0)座標にViewを指定するやり方がわからず困っています。。。
XMLはいじらずに実装したいと考えています。

Android Studio におけるデバッグ時の画面

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

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

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

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

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

takusuke

2020/01/17 09:54

ご意見ありがとうございます。 ここで言う任意の値とはどの値のことなんでしょうか。 View.mLeftを表示させることに関連しているんですかね・・・。 初心者ですみません。
m.ts10806

2020/01/17 11:36

コードは基本的にテキストでマークダウンのcode機能にてご提示ください。 また「初心者アイコン」があるのでわざわざタイトルに含む必要はありません。
takusuke

2020/01/17 11:43

すみません、ご指摘ありがとうございます。 次回から気をつけて投稿致します。
m.ts10806

2020/01/17 11:48

質問は編集できますので適宜ご対応ください。
guest

回答2

0

特定のオブジェクトを選択する事で、Variables が表示されていると思います。

なので、選択したオブジェクトの変数名を仮に imageView だとすると

imageView.getLeft() で参照できます。

投稿2020/01/18 11:29

kamikaze.cappa

総合スコア558

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

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

takusuke

2020/01/18 19:41

ご回答ありがとうございます。 以前も回答して頂き非常に感謝しております。 選択したオブジェクトは「v="com.example.tokoroshingo.myapplication.CustomImageView{20fba42 V.ED..... ........ 42,21-116,72 #7f070051 app:id/ch_textView1}"」 のなかにあるものだと思うのです。 これは public boolean onTouch(View v, MotionEvent event) { ・・・ にて定義されている変数だと思います。 「v.getLeftX」だとコンパイルはうまくいき、実行できるのですが、私が欲しい値の「View.mLeft(=42)」を取得することができません。。。
kamikaze.cappa

2020/01/19 15:15

メソッド名は、getLeft() です。 getLeftX() というメソッドは、標準ではないので、typo だとは、思いますが... View.java のソースを見る限り mLeft を返しているのが確認できます。 public final int getLeft() { return mLeft; }
takusuke

2020/01/20 02:44

すみません。うち間違えていました。 このmLeftはgetLeft()関数を使用した際に返ってくるということですよね。 v.getLeft()を使用しても'42'という値が返ってこないのです。
kamikaze.cappa

2020/01/20 04:34

ソースを見る限り、v.getLeft() は使用されていないようです。 v.performClick() の呼び出しも不自然な感じがします。 v.perfromClick() で、メソッドが実行される事で、状況が変わる事も考えられます。 textView[0] のイベントで、cImageView や button を操作しているのも、このソースでは関係性がよく分かりません。 イベントの発生するオブジェクトと操作するオブジェクトの関係性が間違っていませんか? このソースで実現したい事が出来なくて悩むなら、単体のオブジェクトを使用して移動位置が保存できるか確認する方が問題を解決する近道かと思います。 「そこで「cImageView[0].getX()-cImageView[0].getLeft()」をしたのですがうまくいきません。」 ここだけ見ると、「cImageView[0].getX()-v.getLeft()」となります。
takusuke

2020/01/20 07:50

何度もご回答ありがとうございます。 「v.performClick()」はコメントアウトいたしました。 コードをよく見てみると、「textView[0]」、「cImageView[0]」は同一のオブジェクトであったため、全て「cImageView[0]」を「textView[0]」に変えました。 単体のオブジェクトでも同じ結果になってしまいます。 「cImageView[0].getX()-v.getLeft()」の式で動作させると、ドラッグ前の座標が保存されてしまいました。
kamikaze.cappa

2020/01/21 14:07

結局のところ、TextView[0] を選択した状態で、mLeft は、42なのに v.getLeft() は、42になっていないと言う事でしょうか? もしも違うと言う事であれば、確認方法に問題があるかもしれません。 プリファレンスの保存は出来ていても読み込みが間違っていたりする事もあります。 読み込みが成功していても、View の移動の設定が間違っている事も有ります。 ソースを見る限り、Log メソッドが使用されていないようなので、Log メソッドで確認した方がデバック効率が上がるかと思います。
takusuke

2020/01/22 07:33

返信が遅くなり申し訳ありません。 「mLeft は、42なのに v.getLeft() は、42になっていないと言う事でしょうか?」とのことですが、その通りです。 Logメソッドは使用したことがないため、使用してみようと思います。 ありがとうございます。
guest

0

デバッガは, 停止している時点での各変数の値を表示しているだけでしょう.

私が取得したい値は, 「cImageView[0].getX()」からVariablesの最も下にある変数「View.mLeft」を引いた値なのです

でしたらそのような式をコードに書けばよろしいのではないでしょうか.

投稿2020/01/17 10:59

jimbe

総合スコア12646

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

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

takusuke

2020/01/17 11:42

回答ありがとうございます! そうしたいところなのですが、「View.mLeft」と記載するとエラーが出てしまうんですよね。。。 どうやらAndroidStudioに元から?ある「View.java」という場所にその変数があるっぽいのですが、どのように参照すれば良いのかわからないのです。
jimbe

2020/01/17 13:46 編集

表示されているのはどのオブジェクトの変数でしょうか
takusuke

2020/01/18 08:52

表示されている変数とはどの変数のことをおっしゃっているのですかね。 理解力なくて申し訳ありません。
jimbe

2020/01/18 13:12

ご質問についている画像の Variables に表示されている全ての変数は, 表示のされ方からして何かのオブジェクトのフィールド値です. ファイルフォルダのように階層になっていると思いますので, Variables を上にスクロールすると, オブジェクト名かクラス名が出てくるのではないでしょうか.
takusuke

2020/01/18 19:32

詳しく教えて頂きありがとうございます。 「v="com.example.tokoroshingo.myapplication.CustomImageView{20fba42 V.ED..... ........ 42,21-116,72 #7f070051 app:id/ch_textView1}"」 というオブジェクト名の中に入っていました。 これは public boolean onTouch(View v, MotionEvent event) { ・・・ にて定義されている変数だと思います。
jimbe

2020/01/19 02:33

この CustomImageView がコード中の cImageView[0] だとすれば, cImageView[0].getLeft() で取り出せるのではないでしょうか.
takusuke

2020/01/20 03:09 編集

回答ありがとうございます。 確かに「cImageView[0].getLeft()」のみでコードを書くと取り出すことはできました。 「cImageView[0].getX()」を呼びだした際に'42'が足されていってしまうためにそれを引き算したいと思っていたのです。 そこで「cImageView[0].getX()-cImageView[0].getLeft()」をしたのですがうまくいきません。 コードを質問に追記しました。
jimbe

2020/01/20 03:22 編集

``` // Viewの位置を設定する cImageView[0].layout(dx, dy, imgW, imgH); button[0].layout(button_dx, button_dy, buttonW, buttonH); unit[0].layout(unit_dx, unit_dy, unitW, unitH); syoukyo[0].layout(dbutton_dx, dbutton_dy, dbuttonW, dbuttonH); ``` と設定しているのですから, この各値を保存すれば良いのではないでしょうか.
takusuke

2020/01/20 08:36

何度もご回答ありがとうございます。 今それを試してみたのですが、うまくいきません。 座標が(0,0)になってしまいます。。。
jimbe

2020/01/20 09:57

それはつまりこのコードでは座標を設定できていないということでしょうか.
takusuke

2020/01/22 07:36

返信が遅くなり申し訳ありません。 このコードは、ドラッグ時にのみ使用されているのかな、と考えています。 このコードが無ければドラッグ自体できなくなるためです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問