Android 实现View滑动功能

最近在做直播的时候,需要对小视频窗口实现滑动/拖动功能。

PS:需求的技术点(先不考虑直播时候小窗视频实现方式)

1.固定区域内滑动

实现View滑动的方式

  1. layout()
  2. offsetLeftAndRight()和offsetTopAndBottom()
  3. LayoutParams
  4. scrollBy()和 scrollTo()
  5. 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:待续。

发布了57 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37492806/article/details/100299442