Android: mueva un ImageView en la pantalla (como arrastrar)
Estoy tratando de crear una aplicación que pueda mover unImageView
en su dispositivo como arrastrar y cuando pongo como el 75% de laImageView
fuera de la pantalla muestra unToast
por ejemplo. He estado leyendo sobreMotionEvent
yonTouchListener
y he seguido estopregunta, pero no me convence.
Mi código actual es:
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
int windowwidth;
int windowheight;
private ImageView mImageView;
private ViewGroup mRrootLayout;
private int _xDelta;
private int _yDelta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics displaymetrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
windowwidth = displaymetrics.widthPixels;
windowheight = displaymetrics.heightPixels;
mRrootLayout = (ViewGroup) findViewById(R.id.root);
mImageView = (ImageView) mRrootLayout.findViewById(R.id.im_move_zoom_rotate);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
mImageView.setLayoutParams(layoutParams);
mImageView.setOnTouchListener(this);
}
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
if(X == 0){
Toast.makeText(this, "OUT", Toast.LENGTH_SHORT).show();
}
else if (Y == 0){
Toast.makeText(this, "OUT", Toast.LENGTH_SHORT).show();
}
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
view.setLayoutParams(layoutParams);
break;
}
mRrootLayout.invalidate();
return true;
}
}
Hice esosif
yelse if
solo para saber si elImageView
está saliendo del dispositivo, en el lado izquierdo y derecho del dispositivo parece que está bien, pero me gustaría hacerlo más limpio y no escrito, tampoco entiendoLayoutParams(150,150)
por qué 150? Además, no entiendo por qué tengo que crear unRelativeLayout.LayoutParams
y porque tengo que poner
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
Hice elif/else if
porque quiero eliminar cuando el usuario quiere poner elImageView
fuera del dispositivo, por lo que necesito controlar cuándo lo intenta, en este momento solo lo tengo ARRIBA / IZQUIERDA / DERECHA no hacia abajo, también obtengo las dimensiones de mi dispositivo solo para probar si X o Y es igual a la altura o simplemente mostrar elToast
Pero no lo está haciendo correctamente.
Ahora miImageView
es elic_launcher
pero será más grande (pantalla casi media).
Si conoce otra forma de hacerlo más fácil o más limpio, siéntase libre de ponerlo aquí, no me importa mi código, puedo adaptarlo, solo quiero que sea claro y no codificado.