I have managed to get what i want with @yoah's tip and more research for 10 days. I must add @pingpongboss's (https://github.com/pingpongboss/StandOut) replies to my email helped a lot.
Here is what I came up with and implemented to my call recording app ACR
private WindowManager recButtonWindowManager;
private Button recButton = null;
WindowManager.LayoutParams prms;
boolean touchconsumedbyMove = false;
int recButtonLastX;
int recButtonLastY;
int recButtonFirstX;
int recButtonFirstY;
OnTouchListener recButtonOnTouchListener = new View.OnTouchListener() {
@TargetApi(Build.VERSION_CODES.FROYO)
@Override
public boolean onTouch(View v, MotionEvent event) {
WindowManager.LayoutParams prm = getRecbuttonLayout();
int totalDeltaX = recButtonLastX - recButtonFirstX;
int totalDeltaY = recButtonLastY - recButtonFirstY;
switch(event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
recButtonLastX = (int) event.getRawX();
recButtonLastY = (int) event.getRawY();
recButtonFirstX = recButtonLastX;
recButtonFirstY = recButtonLastY;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (int) event.getRawX() - recButtonLastX;
int deltaY = (int) event.getRawY() - recButtonLastY;
recButtonLastX = (int) event.getRawX();
recButtonLastY = (int) event.getRawY();
if (Math.abs(totalDeltaX) >= 5 || Math.abs(totalDeltaY) >= 5) {
if (event.getPointerCount() == 1) {
prm.x += deltaX;
prm.y += deltaY;
touchconsumedbyMove = true;
recButtonWindowManager.updateViewLayout(getManualRecButton(), prm);
}
else{
touchconsumedbyMove = false;
}
}else{
touchconsumedbyMove = false;
}
break;
default:
break;
}
return touchconsumedbyMove;
}
};
private WindowManager.LayoutParams getRecbuttonLayout() {
if (prms != null) {
return prms;
}
prms = new WindowManager.LayoutParams();
prms.format = PixelFormat.TRANSLUCENT;
prms.flags = LayoutParams.FORMAT_CHANGED; // 8
prms.type = LayoutParams.TYPE_SYSTEM_ALERT;
prms.gravity = Gravity.TOP | Gravity.CENTER;
prms.width = LayoutParams.WRAP_CONTENT;
prms.height = LayoutParams.WRAP_CONTENT;
// Tools.Log("getRecbuttonLayout", "return getRecbuttonLayout()");
return prms;
}
private Button getManualRecButton() {
if (recButton != null) {
return recButton;
}
recButton = new Button(ACR.getContext());
recButton.setText(R.string.start_recording);
recButton.setTypeface(null, Typeface.BOLD);
recButton.setGravity(Gravity.CENTER_VERTICAL);
recButton.setBackgroundColor(Color.parseColor("#65FF0000"));
recButton.setPadding(100, 30, 100, 30);
recButton.setOnClickListener(recButtonOnClickListener);
recButton.setOnTouchListener(recButtonOnTouchListener);
return recButton;
}