介绍
本篇文章给大家分享的是有关怎么在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中实现微信文章悬浮窗效果