画像の場所にブレークポイントを置き、デバッグを起動させました。
私が取得したい値は, 「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はいじらずに実装したいと考えています。