La meilleure chose à faire est de déclarer une vue qui sera votre zone de contact. Ici, je mets tout l'écran, je mets l'événement sur la mise en page match_parent il est donc tout l'écran:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button btn = (Button)findViewById(R.id.second);
final RelativeLayout layout = (RelativeLayout)findViewById(R.id.layout);
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
btn.setX(event.getX());
btn.setY(event.getY());
return true;
}
});
btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int[] pos = new int[2];
layout.getLocationOnScreen(pos);
btn.setX(event.getRawX());
btn.setY(event.getRawY() - pos[1]);
return true;
}
});
}
xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:id="@+id/layout">
<Button
android:text="OK"
android:id="@+id/second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_red_dark" />
</RelativeLayout>
Mais encore si l'on clique sur le bouton et commencer à glisser, il se comporte mal . N'est-ce pas? – Aman
J'ai édité ma réponse. getRawX() vous obtiendra le x et y basés sur le périphérique;). – king
Le seul problème est que c'est en ajoutant la barre d'action et la hauteur de la barre de notification que vous devez trouver un moyen de les récupérer et de les soustraire. Comme obtenir la hauteur de l'écran et la hauteur de la vue racine par exemple;) – king