2016-12-19 14 views
0

画面上で指で触れる場所から画像を移動するときに問題があります。それは私がそれに触れるとき、ボタンの中心で言えばそれを動かすことを意味する、それは私がボタンの上隅を残して、そしてその点から、それを周り、上、左、右およびように...私は、ユーザーがボタンImageView onTouchが正しく動かない

コードの上に指を入れてどこからでもボタンを移動する可能性がしたい:

public class Joystick extends RelativeLayout implements View.OnTouchListener { 

    private Context context; 
    private ImageView backgroundImageView; 
    private ImageView buttonImageView; 
    float xx = 0; 
    float yy = 0; 
    private static final String TRANSLATIONX = "setTranslationX"; 



    public Joystick(Context context) { 
     super(context); 
     this.context = context; 
     initSlider(); 
     if(buttonImageView != null) { 
      buttonImageView.setOnTouchListener(this); 
     } 
     this.setClipChildren(false); 

    } 

    public ImageView setView (String imageName) { 

     ImageView image = new ImageView(context); 

       LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); 
       image.setLayoutParams(layoutParams); 

       // load image 
       try { 
        // get input stream 
        InputStream ims = getContext().getAssets().open(imageName); 
        // load image as Drawable 
        Drawable d = Drawable.createFromStream(ims, null); 
        // set image to ImageView 
        image.setImageDrawable(d); 
       } catch (IOException ex) { 



       } 


     return image; 

    } 

    public void initSlider() { 

     backgroundImageView = setView("background.png"); 
     buttonImageView = setView("jostick.png"); 

     addView(backgroundImageView); 
     addView(buttonImageView); 

    } 


    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 


     float x = motionEvent.getRawX(); 
     float y = motionEvent.getRawY(); 

     float cx = buttonImageView.getWidth()/2.f; 
     float cy = buttonImageView.getHeight()/2.f; 

     float w = backgroundImageView.getWidth(); 
     float h = backgroundImageView.getHeight(); 

     double r = cx/2.; 
     double dx = x - cx; 
     double dy = y - cy; 
     double hypot = Math.hypot(dx, dy); 
     double cos = dx/hypot; // cos 
     double sin = dy/hypot; // sin 

     double rcos = r * cos; 
     double rsin = r * sin; 
     double rdx = Math.abs(dx) < Math.abs(rcos) ? dx : rcos; // if,else 
     double rdy = Math.abs(dy) < Math.abs(rsin) ? dy : rsin; 

     Log.d("VALUES", "RAW X:" + motionEvent.getRawX() + ", X:" + motionEvent.getX() + ", CX:" + cx + ", CY:" + cy + ", dx:" + dx + ", dy:" + dy + ", Hypo:" + hypot + ", cos:" + cos + ", sin" + sin); 


     switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 

       break; 

      case MotionEvent.ACTION_UP: 


       view.setX(xx); 
       view.setY(yy); 
       break; 

      case MotionEvent.ACTION_POINTER_DOWN: 
       break; 

      case MotionEvent.ACTION_POINTER_UP: 
       break; 

      case MotionEvent.ACTION_MOVE: 

       float transX = (float) (cx + rdx - w/2.); 
       float transY = (float) (cy + rdy - h/2.); 

       buttonImageView.setTranslationX(transX); 
       buttonImageView.setTranslationY(transY); 

       Log.d(TRANSLATIONX,"X:" + transX + ", Y:" + transY); 

       break; 

     } 
     return true; 

    } 
} 

どこかの小さなバグです。私はどんな助けも願っています。誰もが興味を持ったりJoystick Buttonがボックス内に移動するようにする方法をいくつかの答えを探している場合おかげ

+0

'rdx' /' rdy'には何が必要ですか? – pskink

+0

トップボタン(buttonImageView)をサークルボトム(backgroundImageView)の外側に移動しないように設定します。制約のように。もっと良い解決策はありますか? –

+0

view.setX(xx)のように私に見えます;とview.setY(yy); xx &&yyが両方とも0であるため、ビューを左上に移動しています。 –

答えて

0

は、私は解決策を見つけた:

private Point calculate (float x, float y) { 

    float cx = buttonImageView.getWidth()/2.f; 
    float cy = buttonImageView.getHeight()/2.f; 

    double r = cx/2.; // vrednost radius 
    double dx = x; 
    double dy = y; 
    double hypot = Math.hypot(dx, dy); // izracun hipotenuze 
    double cos = dx/hypot; // cos 
    double sin = dy/hypot; // sin 

    double rcos = r * cos; 
    double rsin = r * sin; 

    double rdx = Math.abs(dx) < Math.abs(rcos) ? dx : rcos; // if,else 
    double rdy = Math.abs(dy) < Math.abs(rsin) ? dy : rsin; 

    return new Point((int)rdx, (int)rdy); 

} 

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 


    final float x = motionEvent.getRawX(); // x točko 
    final float y = motionEvent.getRawY(); // y točka 

    //Log.d("VALUES", "RAW X:" + motionEvent.getRawX() + ", RAW Y:" + motionEvent.getRawY() + ", X:" + motionEvent.getX() + ", CX:" + cx + ", CY:" + cy + ", dx:" + dx + ", dy:" + dy + ", Hypo:" + hypot + ", cos:" + cos + ", sin" + sin); 


    switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 

      xDelta = view.getX() - x; 
      yDelta = view.getY() - y; 

      break; 

     case MotionEvent.ACTION_UP: 

      doBounceAnimation(buttonImageView); 
      doVibration(); 

      view.setX(xx); 
      view.setY(yy); 
      break; 

     case MotionEvent.ACTION_POINTER_DOWN: 
      break; 

     case MotionEvent.ACTION_POINTER_UP: 
      break; 

     case MotionEvent.ACTION_MOVE: 

      final float transX = (float) x; 
      final float transY = (float) y; 

      thread = new Thread() { 
       @Override 
       public void run() { 

        Point newPoint = calculate(transX+ xDelta,transY + yDelta); 
        buttonImageView.setX(newPoint.x); 
        buttonImageView.setY(newPoint.y); 
       } 
      }; 
      thread.start(); 




      Log.d(TRANSLATIONX,"X:" + transX + ", Y:" + transY); 

      break; 

    } 
    return true; 

} 

はコーディングをお楽しみください!

関連する問題