最近在做直播的时候,需要对小视频窗口实现滑动/拖动功能。
PS:需求的技术点(先不考虑直播时候小窗视频实现方式)
1.固定区域内滑动
实现View滑动的方式
- layout()
- offsetLeftAndRight()和offsetTopAndBottom()
- LayoutParams
- scrollBy()和 scrollTo()
- setX()和setY()
直接上代码,使用setX和setY。
public class ScrollViewFrameLayout extends FrameLayout {
private float mOriginalRawX;
private float mOriginalRawY;
private float mOriginalX;
private float mOriginalY;
private int mScreenWidth;
private int mScreenHeight;
//上下边距
public static final int MARGIN_EDGE_V = 5;
public ScrollViewFrameLayout(@NonNull Context context) {
super(context);
}
public ScrollViewFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ScrollViewFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mScreenHeight = getScreenHeight();
mScreenWidth = getScreenWidth();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mScreenHeight = getScreenHeight();
mScreenWidth = getScreenWidth();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mOriginalX = getX();
mOriginalY = getY();
mOriginalRawX = event.getRawX();
mOriginalRawY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
updateViewPosition(event);
break;
}
return true;
}
private void updateViewPosition(MotionEvent event) {
// 限制不可超出屏幕宽度(左)
float desX = mOriginalX + event.getRawX() - mOriginalRawX;
if (desX <= 0) {
desX = 0;
}
// 限制不可超出屏幕宽度(右)
if (desX + getWidth() >= mScreenWidth) {
desX = mScreenWidth - getWidth();
}
setX(desX);
// 限制不可超出屏幕高度
float desY = mOriginalY + event.getRawY() - mOriginalRawY;
if (desY <= ScreenUtils.dpToPx(MARGIN_EDGE_V)) {
desY = ScreenUtils.dpToPx(MARGIN_EDGE_V);
}
if (desY > mScreenHeight - getHeight() - ScreenUtils.dpToPx(MARGIN_EDGE_V)) {
desY = mScreenHeight - getHeight() - ScreenUtils.dpToPx(MARGIN_EDGE_V);
}
setY(desY);
}
/**
* 得到屏幕宽度
*
* @return
*/
private int getScreenWidth() {
WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.widthPixels;
}
/**
* 得到屏幕高度
*
* @return
*/
private int getScreenHeight() {
WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.heightPixels;
}
}
PS:待续。