suiyuan 发表于 2022-6-19 05:31:18

随缘_多核播放器悬浮窗关键代码(支持窗体放大位移)

package com.suiyuan.play.view;

import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;

import com.suiyuan.play.util.CurrentDirectionParameter;


public class FloatingOnTouchListener implements View.OnTouchListener {
    private int x;
    private int y;
    private int maxWidth;
    private int minWidth;
    private Context context;
    private boolean isMove;
    private CurrentDirectionParameter parameter;

    private float mFirstDistance;
    private WindowManager.LayoutParams mLastLayoutParams;
    privatefloat mDefaultAspectRatio;
    private WindowManager mWindowsManager;

    public FloatingOnTouchListener(Context context, WindowManager.LayoutParams layoutParams,
                                 float defaultAspectRatio, int maxWidth, int minWidth, CurrentDirectionParameter parameter, WindowManager wm) {
      super();
      this.mLastLayoutParams = layoutParams;
      this.mDefaultAspectRatio = defaultAspectRatio;
      this.maxWidth = maxWidth;
      this.minWidth = Math.min(minWidth, maxWidth);
      this.parameter = parameter;
      this.context = context;
      mWindowsManager = wm;


    }

    public void setmDefaultAspectRatio(float mDefaultAspectRatio) {
      this.mDefaultAspectRatio = mDefaultAspectRatio;
    }

    public void setMove(boolean move) {
      isMove = move;
    }

    private static final int NONE = 0;
    private static final int ZOOM = 2;
    private int mode = NONE;

    private int mStartX, mStartY;
    private int mlpX, mlpY;

    @Override
    public boolean onTouch(View view, MotionEvent event) {
      int fingerCount = event.getPointerCount();
      if (1 == fingerCount) {
            int defaultX = (int) event.getX();
            int defaultY = (int) event.getY();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                  isMove = false;
                  x = (int) event.getRawX();
                  y = (int) event.getRawY();
                  mStartX = defaultX;
                  mStartY = defaultY;
                  mlpX = mLastLayoutParams.x;
                  mlpY = mLastLayoutParams.y;
                  break;
                case MotionEvent.ACTION_MOVE:
                  int nowX = (int) event.getRawX();
                  int nowY = (int) event.getRawY();
                  int movedX = nowX - x;
                  int movedY = nowY - y;
                  x = nowX;
                  y = nowY;
                  mLastLayoutParams.x = mLastLayoutParams.x + movedX;
                  mLastLayoutParams.y = mLastLayoutParams.y + movedY;
                  mWindowsManager.updateViewLayout(view, mLastLayoutParams);
                  float deltaX = defaultX - mStartX;
                  float deltaY = defaultY - mStartY;
                  if (Math.abs(deltaX) >= 5 || Math.abs(deltaY) >= 5) {
                        //不允许点击
                        isMove = true;
                  }
                  break;
                case MotionEvent.ACTION_UP:
                  if (mode == ZOOM) {
                        if (!parameter.isHorizontalScreen()) {
                            if (mLastLayoutParams.height == parameter.getHeight()) {
                              mLastLayoutParams.y = 0;
                              if (mLastLayoutParams.width > parameter.getWidth()) {
                                    mLastLayoutParams.x = -(mLastLayoutParams.width - parameter.getWidth()) / 2;
                              } else {
                                    mLastLayoutParams.x = mlpX;
                              }
                            } else {
                              if (mLastLayoutParams.width > maxWidth) {
                                    mLastLayoutParams.width = maxWidth;
                              } else if (mLastLayoutParams.width < minWidth) {
                                    mLastLayoutParams.width = minWidth;
                              }
                              mLastLayoutParams.height = (int) (mLastLayoutParams.width / mDefaultAspectRatio);
                            }
                            mWindowsManager.updateViewLayout(view, mLastLayoutParams);
                        }else if (mLastLayoutParams.height!=parameter.getHeight() && mLastLayoutParams.width>maxWidth){
                            mLastLayoutParams.width = maxWidth;
                            mLastLayoutParams.height = (int) (maxWidth/mDefaultAspectRatio);
                        }
                        mode = NONE;
                  }
                  if (!parameter.isHorizontalScreen()) {
                        validityXY();
                        computeX();
                        computeY();
                  }
                  mWindowsManager.updateViewLayout(view, mLastLayoutParams);
                default:
                  break;
            }
            view.performClick();
      } else if (2 == fingerCount) {
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_POINTER_DOWN:
                  mFirstDistance = getDistance(event);
                  break;
                case MotionEvent.ACTION_MOVE:
                  mode = ZOOM;
                  isMove = true;
                  float distance = getDistance(event);
                  float scale = distance / mFirstDistance;
                  int width = (int) (mLastLayoutParams.width * scale);
                  int height = (int) (width / mDefaultAspectRatio);
                  if (!parameter.isHorizontalScreen()) {//竖屏限制高
                        if (height <= parameter.getHeight()) {
                            mLastLayoutParams.width = width;
                            mLastLayoutParams.height = height;
                        } else {
                            mLastLayoutParams.width = (int) (parameter.getHeight() * mDefaultAspectRatio);
                            mLastLayoutParams.height = parameter.getHeight();
                        }
                        if (mLastLayoutParams.width > parameter.getWidth()) {
                            mLastLayoutParams.x = -(mLastLayoutParams.width - parameter.getWidth()) / 2;
                            mLastLayoutParams.y = (parameter.getHeight() - mLastLayoutParams.height) / 2;
                        }
                  } else if (height >=parameter.getHeight()) {//横屏限制高
                        mLastLayoutParams.width = (int) (parameter.getHeight()*mDefaultAspectRatio);
                        mLastLayoutParams.height = parameter.getHeight();
                        mLastLayoutParams.x = -(mLastLayoutParams.width - parameter.getWidth()) / 2;
                        mLastLayoutParams.y =0;
                  } else if (width < minWidth) {
                        mLastLayoutParams.width = minWidth;
                        mLastLayoutParams.height = (int) (minWidth / mDefaultAspectRatio);
                  } else {
                        mLastLayoutParams.width = width;
                        mLastLayoutParams.height = height;
                  }
                  mWindowsManager.updateViewLayout(view, mLastLayoutParams);
                  mFirstDistance = distance;
                  break;
                default:
                  break;
            }
      }
      return isMove;
    }

    private void computeX() {
      if (mLastLayoutParams.width <= parameter.getWidth()) {
            if (mLastLayoutParams.x < 0) {
                //靠左边
                mLastLayoutParams.x = -(parameter.getWidth() - mLastLayoutParams.width) / 2;
            } else if ((mLastLayoutParams.x + mLastLayoutParams.width) > parameter.getWidth()) {
                //靠右边
                mLastLayoutParams.x = (parameter.getWidth() - mLastLayoutParams.width) / 2;
            }
      }
    }

    private void computeY() {
      if (mLastLayoutParams.height < parameter.getHeight()) {
            if (mLastLayoutParams.y < 0) {
                //靠顶边
                mLastLayoutParams.y = 0;
            } else if ((mLastLayoutParams.y + mLastLayoutParams.height) > parameter.getHeight()) {
                //靠底边
                mLastLayoutParams.y = (parameter.getHeight() - mLastLayoutParams.height);
            }
      } else {
            mLastLayoutParams.y = 0;
      }
    }

    private void validityXY() {
      if (mLastLayoutParams.height == parameter.getHeight()) {
            int x = (mLastLayoutParams.width - parameter.getWidth()) / 2;
            if (mLastLayoutParams.x < 0) {
                if (-(mLastLayoutParams.x) >= mLastLayoutParams.width / 2) {
                  //居右
                  mLastLayoutParams.x = -x;
                }
            } else {
                if (mLastLayoutParams.x >= mLastLayoutParams.width / 2) {
                  //居左
                  mLastLayoutParams.x = x;
                }
            }
      }
    }


    private float getDistance(MotionEvent event) {
      float x1 = event.getX();
      float y1 = event.getY();
      float x2 = event.getX(1);
      float y2 = event.getY(1);

      return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }
}

3269229105 发表于 2022-6-19 18:16:01

顶楼主顶楼主顶楼主顶楼主顶楼主顶楼主

pq9999 发表于 2022-6-20 07:07:29

的是广东省分公司发噶

吾甚吊丶耐何 发表于 2022-6-25 17:29:29

层次不够 够不着

pq9999 发表于 2022-6-29 07:10:28

股份的股东身份的的

易8643501 发表于 2023-4-12 23:34:11

易如意中文编程学习交流论坛有你更精彩~

ssfgjl 发表于 2024-7-27 10:25:50

易8643501 发表于 2023-4-12 23:34
易如意中文编程学习交流论坛有你更精彩~

看不懂{:4_105:}
页: [1]
查看完整版本: 随缘_多核播放器悬浮窗关键代码(支持窗体放大位移)