У меня проблема с перемещением изображения с места, где я касаюсь его пальцем на экране. Это означает, что когда я касаюсь его, скажем, в центре кнопки и хочу переместить его, он заставит меня оставить верхний угол кнопки, и с этого момента я могу перемещать его вокруг, вверх, влево, вправо и вправо так далее ... Я хочу, чтобы иметь возможность перемещать кнопки из любого места пользователя положить палец на кнопке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;
}
}
Где-то это небольшая ошибка. Надеюсь на любую помощь. Благодаря
Для чего вам нужен 'rdx' /' rdy' for? – pskink
Чтобы установить верхнюю кнопку (buttonImageView), чтобы не перемещаться за пределы дна круга (backgroundImageView). Как ограничение. У вас есть лучшее решение? –
Выглядит как view.setX (xx); и view.setY (yy); перемещает ваш вид в верхний левый угол, потому что xx && yy равны 0. –