Reputation: 147
My first time writing an Android app. I created a floating window to display current milliseconds in a textview (id is fShowtime).
It works, however, with something weird: Whenever I want to move this floating textview arround, it will always drop down a little bit before moving along with my finger.
I don't really understand why, please offer me some suggestion, thanks.
Here are my codes:
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, null);
Rect frame = new Rect();
fShowtime.getWindowVisibleDisplayFrame(frame);
statusBarHeight = frame.top;
measuredHeight=fShowtime.getMeasuredHeight()/2;
measuredWidth=fShowtime.getMeasuredWidth()/2;
fShowtime.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
wmParams.x = (int) (event.getRawX() - measuredWidth);
wmParams.y = (int) (event.getRawY() - measuredHeight - statusBarHeight);
mWindowManager.updateViewLayout(mFloatLayout, wmParams);
break;
case MotionEvent.ACTION_UP:
break;
}
return true; //I don't need OnClickListener
}
});
Upvotes: 0
Views: 226
Reputation: 1459
What is
wmParams.y = (int) (event.getRawY() - measuredHeight - statusBarHeight);
Follow this Please see the best method for touch:
chatHead.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(chatHead, params);
return true;
}
return false;
}
});
Upvotes: 2