0

パッドにonTouchListenerを設定した後、MotionEvent.ACTION_MOVEの8方向ジョイスティック(ノブとパッドで構成)、 を持っています。position_x、position_y、距離、角度を計算して方向を取得しています-8]。方向[1-8]が与えられた場合、特定の動きを継続的に実行したいと思います。 MotionEvent.ACTION_MOVEは、指が動いている間にのみ実行されます。仮想ジョイスティックを使って緯度と経度の座標を移動するにはどうすればいいですか?

緯度経度の動きを連続的に実行するにはどうすればよいですか?

--Lat/LNG運動(D =方向) -

private void movement(int d, double lat, double lng) { 
     if (d==1) { //up 
      lat = lat + 0.0000002;} 
     else if (d==2){ //upright 
      lat = lat + 0.0000001; 
      lng = lng + 0.0000001; 
     } 
     else if (d==3) { //right 
      lng = lng + 0.0000002; 
     } 
     else if (d==4) { //downright 
      lng = lng + 0.0000001; 
      lat = lat - 0.0000001; 
     } 
     else if (d==5) { //down 
      lat = lat - 0.0000002; 
     } 
     else if (d==6) { //downleft 
      lat = lat - 0.0000001; 
      lng = lng - 0.0000001; 
     } 
     else if (d==7) { //left 
      lng = lng - 0.0000002; 
     } 
     else if (d==8) { //upleft 
      lat = lat + 0.0000001; 
      lng = lng - 0.0000001; 
     } 
} 

--action_move、getangle、direction--

case MotionEvent.ACTION_MOVE: { 

        position_x = (int) (pad.getX() + pad.getWidth()/2 - knob.getWidth()/2 * -1 - knob.getX() - pad.getPivotX()); 
        position_y = (int) (pad.getY() + pad.getHeight()/2 - knob.getHeight()/2 * -1 - knob.getY() - pad.getPivotY()); 
        distance = (float) Math.sqrt(Math.pow(position_x, 2) + Math.pow(position_y, 2)); 
        angle = (float) getangle(position_x, position_y); 
        knob.setX(event.getX() + pad.getX() - knob.getWidth()/2); 
        knob.setY(event.getY() + pad.getY() - knob.getHeight()/2); 
        direction(); 
        movement(direction(), lat, lng); 


private double getangle(float x, float y) { 
    if (x >= 0 && y >= 0) return Math.toDegrees(Math.atan(y/x)); 
    else if (x < 0 && y >= 0) return Math.toDegrees(Math.atan(y/x)) + 180; 
    else if (x < 0 && y < 0) return Math.toDegrees(Math.atan(y/x)) + 180; 
    else if (x >= 0 && y < 0) return Math.toDegrees(Math.atan(y/x)) + 360; 
    return 0; 
} 

private int direction() { 
    if (distance > 50) { 
     if (angle >= 67.5 && angle < 112.5) return 1; 
     else if (angle >= 112.5 && angle < 157.5) return 2; 
     else if (angle >= 157.5 && angle < 202.5) return 3; 
     else if (angle >= 202.5 && angle < 247.5) return 4; 
     else if (angle >= 247.5 && angle < 292.5) return 5; 
     else if (angle >= 292.5 && angle < 337.5) return 6; 
     else if (angle >= 337.5 || angle < 22.5) return 7; 
     else if (angle >= 22.5 && angle < 67.5) return 8; 
    } else if (distance <= 50) { //knob at rest in middle 
      return 0; 
    } 
    return 0; 
} 

答えて

0

あなたは、次の質問のトップの答えをチェックし、適用することができます同じロジックをスレッドを使用して、あなたのUIスレッドでwhileループを持っている。

Continuous "Action_DOWN" in Android

+0

ありがとうございます。ハンドラーが仕事を終えているようだ – FlingLandHo

関連する問題