<実装したいこと>
現在、Viewをxmlにて以下のように位置指定をしております。
この「温度」とsetTextされているTextViewを長押しすると、任意の位置にドラッグし、位置を保存することができる機能を考えております。
具体的には、ドラッグ後にその座標をSharedPreferencesで保存し、画面が遷移した後、再びこの画面に戻ってきても、その座標を読み込み、その位置にViewを表示させるようにしたいです。
<困っていること>
XMLのデフォルトの位置が原因で、ドラッグ後の座標読み取りにズレが生じてしまいます。
具体的な説明を以下に記載します。
上記に記載のTextViewの変数は「TextView[0]」となっています。
ドラッグ時のコードを以下に記載します。
java
1textView[0].setOnTouchListener(new View.OnTouchListener() { 2 @Override 3 public boolean onTouch(View v, MotionEvent event) { 4 // x,y 位置取得 5 6 int newbuttonX = (int)event.getRawX(); 7 int newbuttonY = (int)event.getRawY(); 8 9 switch (event.getAction()) { 10 // タッチダウンでdragされた 11 case MotionEvent.ACTION_MOVE: 12 // ACTION_MOVEでの位置 13 x = (newbuttonX - buttonX); 14 y = (newbuttonY - buttonY); 15 16 dx = textView[0].getLeft() + x; 17 dy = textView[0].getTop() + y; 18 19 imgW = dx + textView[0].getWidth(); 20 imgH = dy + textView[0].getHeight(); 21 22 // Viewの位置を設定する 23 textView[0].layout(dx, dy, imgW, imgH); 24 25 break; 26 case MotionEvent.ACTION_DOWN: 27 break; 28 case MotionEvent.ACTION_UP: 29 // x座標の保存 30 editor = prefs.edit(); 31 editor.putFloat("oldx1",textView[0].getX()); 32 editor.apply(); 33 read_oldx[0] = prefs.getFloat("oldx1", 0); 34 35 // y座標の保存 36 editor = prefs.edit(); 37 editor.putFloat("oldy1", textView[0].getY()); 38 editor.apply(); 39 40 read_oldy[0] = prefs.getFloat("oldy1", 0); 41 // Logで確認 42 Log.d("onTouch","ACTION_MOVE:dx="+textView[0].getX()+"," +" dy="+textView[0].getY()); 43 break; 44 default: 45 break; 46 } 47 // タッチした位置を古い位置とする 48 buttonX = newbuttonX; 49 buttonY = newbuttonY; 50 51 return true; 52 } 53 });
これでドラッグ後の位置は保存できていると思います(Logで辿って確認済)。
問題はここからです。
これを再表示しているコードを以下に示します。
java
1textView[0].setX(read_oldx[0]); 2textView[0].setY(read_oldy[0]);
このようにコードを書くと、XMLでのデフォルトの位置とドラッグ後の座標の位置が足されて表示されてしまいます。具体的に図で説明します。
一番左上のTextView(TextView[0])をドラッグします。
画面遷移後、再びこの画面に戻ってくると以下のように表示されてしまいます。
これは、XMLで設定したデフォルトの位置を(0,0)と認識し、そこから保存した座標取得を読み込んでいるため、ずれてしまうと私は考えています。。。
インターネットで色々と調べても、所属研究室の教授に相談しても解決しないため、最終手段として質問させて頂きます。
卒業がかかっているため、どうかよろしくお願いいたします、、、。
回答2件
あなたの回答
tips
プレビュー