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

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

专注于为中小企业提供网站制作、成都网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业昭化免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

1、权限

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

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到Window

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

@SuppressLint("CheckResult")
private void showWindow(Context context) {
 mWindowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
 mView = LayoutInflater.from(context).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(context).load(imageUrl).apply(requestOptions).into(ivImage);

 initListener(context);

 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、View的拖拽实现

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

//设置触摸滑动事件
mView.setOnTouchListener(new View.OnTouchListener() {
 int startX, startY; //起始点
 boolean isMove; //是否在移动
 long startTime;
 int finalMoveX; //最后通过动画将mView的X轴坐标移动到finalMoveX
 @Override
 public boolean onTouch(View v, MotionEvent event) {
  switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    startX = (int) event.getX();
    startY = (int) event.getY();
    startTime = System.currentTimeMillis();
    isMove = false;
    return false;
   case MotionEvent.ACTION_MOVE:
    mLayoutParams.x = (int) (event.getRawX() - startX);
    mLayoutParams.y = (int) (event.getRawY() - startY);
    updateViewLayout(); //更新mView 的位置
    return true;
   case MotionEvent.ACTION_UP:
    long curTime = System.currentTimeMillis();
    isMove = curTime - startTime > 100;
    //判断mView是在Window中的位置,以中间为界
    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 animation) -> {
     mLayoutParams.x = (int) animation.getAnimatedValue();
     updateViewLayout();
    });
    animator.start();
    return isMove;
  }
  return false;
 }
});

4、注意

为了让Window与Activity脱离,这里我们采用Service来做,通过Service来添加和移除View;在权限申请成功之后我们需要通知Service(其实是Activity,可能会有保存数据等操作)作相应改变(提供一个接口给Service),然后在Service中使用广播来通知Activity;最后一个需要注意的地方就是我们需要判断应用程序是否在前台还是后台来添加或移除Window,这里通过使用ActivityLifecycleCallbacks来监听Activity在前台的数量来判断应用程序是在前台还是后台

class ApplicationLifecycle : Application.ActivityLifecycleCallbacks {
 private var started: Int = 0
 override fun onActivityPaused(activity: Activity?) {
 }
 override fun onActivityResumed(activity: Activity?) {
 }
 override fun onActivityStarted(activity: Activity?) {
  started++
  if (started == 1) {
   Log.e("TAG", "应用在前台了!!!")
  }
 }
 override fun onActivityDestroyed(activity: Activity?) {
 }
 override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
 }
 override fun onActivityStopped(activity: Activity?) {
  started--
  if (started == 0) {
   Log.e("TAG", "应用在后台了!!!")
  }
 }
 override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
 }
}

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

以上就是怎么在Android中实现微信文章悬浮窗效果,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网站栏目:怎么在Android中实现微信文章悬浮窗效果
转载注明:http://myzitong.com/article/jgecii.html