切换风格

默认Lavender Sky Flowers Wizard Snow Beige California City Dragon Black London Sunset glow Pink Cloud

31

主题

239

积分

0

精华

用户组 

易积分
815
热心
0
好评
1
随缘_多核播放器悬浮窗关键代码(支持窗体放大位移)[复制链接]
发表于 2022-6-19 05:31:18 | 显示全部楼层 |阅读模式
  1. package com.suiyuan.play.view;

  2. import android.content.Context;
  3. import android.view.MotionEvent;
  4. import android.view.View;
  5. import android.view.WindowManager;

  6. import com.suiyuan.play.util.CurrentDirectionParameter;


  7. public class FloatingOnTouchListener implements View.OnTouchListener {
  8.     private int x;
  9.     private int y;
  10.     private int maxWidth;
  11.     private int minWidth;
  12.     private Context context;
  13.     private boolean isMove;
  14.     private CurrentDirectionParameter parameter;

  15.     private float mFirstDistance;
  16.     private WindowManager.LayoutParams mLastLayoutParams;
  17.     private  float mDefaultAspectRatio;
  18.     private WindowManager mWindowsManager;

  19.     public FloatingOnTouchListener(Context context, WindowManager.LayoutParams layoutParams,
  20.                                    float defaultAspectRatio, int maxWidth, int minWidth, CurrentDirectionParameter parameter, WindowManager wm) {
  21.         super();
  22.         this.mLastLayoutParams = layoutParams;
  23.         this.mDefaultAspectRatio = defaultAspectRatio;
  24.         this.maxWidth = maxWidth;
  25.         this.minWidth = Math.min(minWidth, maxWidth);
  26.         this.parameter = parameter;
  27.         this.context = context;
  28.         mWindowsManager = wm;


  29.     }

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

  33.     public void setMove(boolean move) {
  34.         isMove = move;
  35.     }

  36.     private static final int NONE = 0;
  37.     private static final int ZOOM = 2;
  38.     private int mode = NONE;

  39.     private int mStartX, mStartY;
  40.     private int mlpX, mlpY;

  41.     @Override
  42.     public boolean onTouch(View view, MotionEvent event) {
  43.         int fingerCount = event.getPointerCount();
  44.         if (1 == fingerCount) {
  45.             int defaultX = (int) event.getX();
  46.             int defaultY = (int) event.getY();
  47.             switch (event.getAction()) {
  48.                 case MotionEvent.ACTION_DOWN:
  49.                     isMove = false;
  50.                     x = (int) event.getRawX();
  51.                     y = (int) event.getRawY();
  52.                     mStartX = defaultX;
  53.                     mStartY = defaultY;
  54.                     mlpX = mLastLayoutParams.x;
  55.                     mlpY = mLastLayoutParams.y;
  56.                     break;
  57.                 case MotionEvent.ACTION_MOVE:
  58.                     int nowX = (int) event.getRawX();
  59.                     int nowY = (int) event.getRawY();
  60.                     int movedX = nowX - x;
  61.                     int movedY = nowY - y;
  62.                     x = nowX;
  63.                     y = nowY;
  64.                     mLastLayoutParams.x = mLastLayoutParams.x + movedX;
  65.                     mLastLayoutParams.y = mLastLayoutParams.y + movedY;
  66.                     mWindowsManager.updateViewLayout(view, mLastLayoutParams);
  67.                     float deltaX = defaultX - mStartX;
  68.                     float deltaY = defaultY - mStartY;
  69.                     if (Math.abs(deltaX) >= 5 || Math.abs(deltaY) >= 5) {
  70.                         //不允许点击
  71.                         isMove = true;
  72.                     }
  73.                     break;
  74.                 case MotionEvent.ACTION_UP:
  75.                     if (mode == ZOOM) {
  76.                         if (!parameter.isHorizontalScreen()) {
  77.                             if (mLastLayoutParams.height == parameter.getHeight()) {
  78.                                 mLastLayoutParams.y = 0;
  79.                                 if (mLastLayoutParams.width > parameter.getWidth()) {
  80.                                     mLastLayoutParams.x = -(mLastLayoutParams.width - parameter.getWidth()) / 2;
  81.                                 } else {
  82.                                     mLastLayoutParams.x = mlpX;
  83.                                 }
  84.                             } else {
  85.                                 if (mLastLayoutParams.width > maxWidth) {
  86.                                     mLastLayoutParams.width = maxWidth;
  87.                                 } else if (mLastLayoutParams.width < minWidth) {
  88.                                     mLastLayoutParams.width = minWidth;
  89.                                 }
  90.                                 mLastLayoutParams.height = (int) (mLastLayoutParams.width / mDefaultAspectRatio);
  91.                             }
  92.                             mWindowsManager.updateViewLayout(view, mLastLayoutParams);
  93.                         }else if (mLastLayoutParams.height!=parameter.getHeight() && mLastLayoutParams.width>maxWidth){
  94.                             mLastLayoutParams.width = maxWidth;
  95.                             mLastLayoutParams.height = (int) (maxWidth/mDefaultAspectRatio);
  96.                         }
  97.                         mode = NONE;
  98.                     }
  99.                     if (!parameter.isHorizontalScreen()) {
  100.                         validityXY();
  101.                         computeX();
  102.                         computeY();
  103.                     }
  104.                     mWindowsManager.updateViewLayout(view, mLastLayoutParams);
  105.                 default:
  106.                     break;
  107.             }
  108.             view.performClick();
  109.         } else if (2 == fingerCount) {
  110.             switch (event.getAction() & MotionEvent.ACTION_MASK) {
  111.                 case MotionEvent.ACTION_POINTER_DOWN:
  112.                     mFirstDistance = getDistance(event);
  113.                     break;
  114.                 case MotionEvent.ACTION_MOVE:
  115.                     mode = ZOOM;
  116.                     isMove = true;
  117.                     float distance = getDistance(event);
  118.                     float scale = distance / mFirstDistance;
  119.                     int width = (int) (mLastLayoutParams.width * scale);
  120.                     int height = (int) (width / mDefaultAspectRatio);
  121.                     if (!parameter.isHorizontalScreen()) {  //竖屏限制高
  122.                         if (height <= parameter.getHeight()) {
  123.                             mLastLayoutParams.width = width;
  124.                             mLastLayoutParams.height = height;
  125.                         } else {
  126.                             mLastLayoutParams.width = (int) (parameter.getHeight() * mDefaultAspectRatio);
  127.                             mLastLayoutParams.height = parameter.getHeight();
  128.                         }
  129.                         if (mLastLayoutParams.width > parameter.getWidth()) {
  130.                             mLastLayoutParams.x = -(mLastLayoutParams.width - parameter.getWidth()) / 2;
  131.                             mLastLayoutParams.y = (parameter.getHeight() - mLastLayoutParams.height) / 2;
  132.                         }
  133.                     } else if (height >=parameter.getHeight()) {//横屏限制高
  134.                         mLastLayoutParams.width = (int) (parameter.getHeight()*mDefaultAspectRatio);
  135.                         mLastLayoutParams.height = parameter.getHeight();
  136.                         mLastLayoutParams.x = -(mLastLayoutParams.width - parameter.getWidth()) / 2;
  137.                         mLastLayoutParams.y =0;
  138.                     } else if (width < minWidth) {
  139.                         mLastLayoutParams.width = minWidth;
  140.                         mLastLayoutParams.height = (int) (minWidth / mDefaultAspectRatio);
  141.                     } else {
  142.                         mLastLayoutParams.width = width;
  143.                         mLastLayoutParams.height = height;
  144.                     }
  145.                     mWindowsManager.updateViewLayout(view, mLastLayoutParams);
  146.                     mFirstDistance = distance;
  147.                     break;
  148.                 default:
  149.                     break;
  150.             }
  151.         }
  152.         return isMove;
  153.     }

  154.     private void computeX() {
  155.         if (mLastLayoutParams.width <= parameter.getWidth()) {
  156.             if (mLastLayoutParams.x < 0) {
  157.                 //靠左边
  158.                 mLastLayoutParams.x = -(parameter.getWidth() - mLastLayoutParams.width) / 2;
  159.             } else if ((mLastLayoutParams.x + mLastLayoutParams.width) > parameter.getWidth()) {
  160.                 //靠右边
  161.                 mLastLayoutParams.x = (parameter.getWidth() - mLastLayoutParams.width) / 2;
  162.             }
  163.         }
  164.     }

  165.     private void computeY() {
  166.         if (mLastLayoutParams.height < parameter.getHeight()) {
  167.             if (mLastLayoutParams.y < 0) {
  168.                 //靠顶边
  169.                 mLastLayoutParams.y = 0;
  170.             } else if ((mLastLayoutParams.y + mLastLayoutParams.height) > parameter.getHeight()) {
  171.                 //靠底边
  172.                 mLastLayoutParams.y = (parameter.getHeight() - mLastLayoutParams.height);
  173.             }
  174.         } else {
  175.             mLastLayoutParams.y = 0;
  176.         }
  177.     }

  178.     private void validityXY() {
  179.         if (mLastLayoutParams.height == parameter.getHeight()) {
  180.             int x = (mLastLayoutParams.width - parameter.getWidth()) / 2;
  181.             if (mLastLayoutParams.x < 0) {
  182.                 if (-(mLastLayoutParams.x) >= mLastLayoutParams.width / 2) {
  183.                     //居右
  184.                     mLastLayoutParams.x = -x;
  185.                 }
  186.             } else {
  187.                 if (mLastLayoutParams.x >= mLastLayoutParams.width / 2) {
  188.                     //居左
  189.                     mLastLayoutParams.x = x;
  190.                 }
  191.             }
  192.         }
  193.     }


  194.     private float getDistance(MotionEvent event) {
  195.         float x1 = event.getX();
  196.         float y1 = event.getY();
  197.         float x2 = event.getX(1);
  198.         float y2 = event.getY(1);

  199.         return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  200.     }
  201. }
复制代码


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

使用道具 举报

0

主题

20

积分

0

精华

用户组 

易积分
74
热心
0
好评
0
发表于 2022-6-19 18:16:01 | 显示全部楼层
顶楼主顶楼主顶楼主顶楼主顶楼主顶楼主
易如意中文编程学习交流论坛有你更精彩~
回复

使用道具 举报

0

主题

42

积分

0

精华

用户组 

易积分
295
热心
0
好评
0
发表于 2022-6-20 07:07:29 | 显示全部楼层
的是广东省分公司发噶
易如意中文编程学习交流论坛有你更精彩~
回复

使用道具 举报

0

主题

0

积分

0

精华

用户组 

易积分
7
热心
0
好评
0
发表于 2022-6-25 17:29:29 | 显示全部楼层
层次不够 够不着
易如意中文编程学习交流论坛有你更精彩~
回复

使用道具 举报

0

主题

42

积分

0

精华

用户组 

易积分
295
热心
0
好评
0
发表于 2022-6-29 07:10:28 | 显示全部楼层
股份的股东身份的的
易如意中文编程学习交流论坛有你更精彩~
回复

使用道具 举报

7

主题

557

积分

0

精华

用户组 

易积分
296
热心
0
好评
0
发表于 2023-4-12 23:34:11 | 显示全部楼层
易如意中文编程学习交流论坛有你更精彩~
易如意中文编程学习交流论坛有你更精彩~
回复

使用道具 举报

QQ|sitemap|免责声明|RGB颜色对照表|手机版|小黑屋| 易如意 - E4A中文编程学习交流论坛

GMT+8, 2024-5-3 15:36 , Processed in 0.046539 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2018 eruyi.cn

返回顶部