怎么在Android中实现微信文章悬浮窗效果

  介绍

本篇文章给大家分享的是有关怎么在Android中实现微信文章悬浮窗效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强> 1,权限

首先我们要考虑的一个问题就是权限问题,因为要适配Android 7.0 - 8.0,添加悬浮窗是需要申请权限的,适配的比较全,可以直接拿来用。这里需要注意的是,为了适配Android 8.0,窗口的类型需要配置一下:

if  (Build.VERSION.SDK_INT 祝辞=,Build.VERSION_CODES.O), {//Android  8.0=,,mLayoutParams.type  WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;   },{else    ,//其他版本=,,mLayoutParams.type  WindowManager.LayoutParams.TYPE_PHONE;   }

<强> 2,添加ViewGroup到窗口

判断好权限之后,直接添加就可以了

@SuppressLint (“CheckResult")   private  void 显示窗口(Context 上下文),{=,mWindowManager  (WindowManager), context.getSystemService (WINDOW_SERVICE);=,,mView  LayoutInflater.from(上下文).inflate (R.layout.article_window, null);      ,ImageView  ivImage =, mView.findViewById (R.id.aw_iv_image);   ,String  imageUrl =, SPUtil.getStringDefault (ARTICLE_IMAGE_URL,,““);   ,RequestOptions  RequestOptions =, RequestOptions.circleCropTransform ();   ,requestOptions.placeholder (R.mipmap.ic_launcher_round) . error (R.mipmap.ic_launcher_round);   ,Glide.with(上下文).load (imageUrl)苹果(requestOptions) .into (ivImage);      ,initListener(上下文);=,,mLayoutParams  new  WindowManager.LayoutParams ();   ,if  (Build.VERSION.SDK_INT 祝辞=,Build.VERSION_CODES.O), {   时间=mLayoutParams.type 才能;WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;   ,}else  {   时间=mLayoutParams.type 才能;WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;   ,}=,,mLayoutParams.format  PixelFormat.RGBA_8888;,//窗口透明=,,mLayoutParams.gravity  Gravity.LEFT  |, Gravity.TOP;,//窗口位置=,,mLayoutParams.flags  WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL  |, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;=,mLayoutParams.width  200;=,mLayoutParams.height  200;=,,mLayoutParams.x  mWindowManager.getDefaultDisplay () .getWidth(),安康;200;=,mLayoutParams.y  0;   ,mWindowManager.addView (mView, mLayoutParams);   }

<强> 3,视图的拖拽实现

借助WindowManager.LayoutParams来实现,mLayoutParams.x和mLayoutParams。y分别表示mView左上角的横纵坐标,所以我们只需要改动这两个值就行了,当ACTION_UP时,计算当前mView的中心点相对窗口的位置,然后将mView动态滑动到窗口左边或者右边:

//设置触摸滑动事件   mView.setOnTouchListener (new  View.OnTouchListener (), {   ,int  startX, startY;,//起始点   ,boolean  isMove;//是否在移动   ,long 开始时间;   ,int  finalMoveX;//最后通过动画将mView的X轴坐标移动到finalMoveX   ,@Override   ,public  boolean  ondraw (View  v, MotionEvent 事件),{   switch 才能;(event.getAction ()), {   ,,case  MotionEvent.ACTION_DOWN:   ,,,startX =, (int), event.getX ();   ,,,startY =, (int), event.getY ();   ,,,startTime =, System.currentTimeMillis ();   ,,,isMove =,假;   ,,,return 假;   ,,case  MotionEvent.ACTION_MOVE:   ,,,mLayoutParams.x =, (int), (event.getRawX(),安康;startX);   ,,,mLayoutParams.y =, (int), (event.getRawY(),安康;startY);   ,,,updateViewLayout();,//更新mView 的位置   ,,,return 真实;   ,,case  MotionEvent.ACTION_UP:   ,,,long  curTime =, System.currentTimeMillis ();   ,,,isMove =, curTime 作用;startTime 祝辞,100;   ,,,//判断mView是在窗口中的位置,以中间为界   ,,,if (时间+ mLayoutParams.x  mView.getMeasuredWidth(),/, 2,祝辞=,mWindowManager.getDefaultDisplay () .getWidth (),/, 2), {   ,,,,finalMoveX =, mWindowManager.getDefaultDisplay () .getWidth(),安康;mView.getMeasuredWidth ();   ,,,},{else    ,,,,finalMoveX =, 0;   ,,,}   ,,,//使用动画移动mView   ,,,ValueAnimator  animator =, ValueAnimator.ofInt (mLayoutParams.x, finalMoveX) .setDuration (Math.abs (mLayoutParams.x 作用;finalMoveX));   ,,,animator.addUpdateListener ((ValueAnimator 动画),→,{   ,,,,mLayoutParams.x =, (int), animation.getAnimatedValue ();   ,,,,updateViewLayout ();   ,,,});   ,,,animator.start ();   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在Android中实现微信文章悬浮窗效果