2016-12-19 2 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; 

    } 
} 

Где-то это небольшая ошибка. Надеюсь на любую помощь. Благодаря

+0

Для чего вам нужен 'rdx' /' rdy' for? – pskink

+0

Чтобы установить верхнюю кнопку (buttonImageView), чтобы не перемещаться за пределы дна круга (backgroundImageView). Как ограничение. У вас есть лучшее решение? –

+0

Выглядит как view.setX (xx); и view.setY (yy); перемещает ваш вид в верхний левый угол, потому что xx && yy равны 0. –

ответ

0

Если кому-то интересно или искать какой-то ответ, как сделать Joystick Button перемещения внутри коробки, я нашел решение:

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; 

} 

Наслаждайтесь кодирования!

Смежные вопросы