背景是需要一个悬浮的播放器,有按键可以控制上一曲下一曲
需要解决的问题
- 可以拖动
- 和子view点击时间不存在冲突
第一点监听移动位置。第二点,dispatchTouchEvent接收到move 的时候标记,在onInterceptTouchEvent进行拦截。
效果:
video-floating
package com.example.bannerdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.FrameLayout;
/**
* 浮动的ViewGroup
*/
public class FloatingViewGroup extends FrameLayout {
//是否在拖动
boolean isDragging = false;
//按下的xy
float downX, downY;
public FloatingViewGroup(Context context) {
this(context, null);
}
public FloatingViewGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FloatingViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.e("ssssssss", "onFling ev.getX()" + ev.getX());
isDragging = true;
float fx = ev.getX() - downX + getX();
float fY = ev.getY() - downY + getY();
if (fx + getWidth() > 1280) {
fx = 1280 - getWidth();
}
if (fx < 0) {
fx = 0;
}
if (fY + getHeight() > 566) {
fY = 566 - getHeight();
}
if (fY < 0) {
fY = 0;
}
setX(fx);
setY(fY);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
isDragging = false;
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return isDragging;
}
}