本篇文章给大家分享的是有关怎么在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是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。
以上就是怎么在Android中实现微信文章悬浮窗效果,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。