Dave Xu
Dave Xu

Reputation: 147

Why updateViewLayout always results in a drop before moving along with my finger?

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

Answers (1)

kemdo
kemdo

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

Related Questions