小程序全局悬浮窗_全局悬浮窗的实现

本文介绍了如何在小程序中实现全局悬浮窗,包括创建SuspensionImage类,设置触摸事件处理,确保视图在屏幕内移动,并提供点击事件的回调功能。通过SuspensionImage的实例方法getTapInfoWithMethod,实现了点击后执行指定的block。
摘要由CSDN通过智能技术生成

最近项目想要展示一个悬浮窗,显示一些广告信息,所以就写了一个简单的样式,在此记录下

//

// SuspensionImage.h

// 全局悬浮窗

//

// Created by 随风流年 on 2019/4/5.

// Copyright © 2019 随风流年. All rights reserved.

//

#import

NS_ASSUME_NONNULL_BEGIN

typedef void (^tapImageBlcok) (void);

@interface SuspensionImage : UIImageView

//block作为属性使用 点击图片方法的block

@property (nonatomic, copy) void(^completeBlock)(void);

//block 作为参数

-(void)getTapInfoWithMethod:(tapImageBlcok)block;

@end

NS_ASSUME_NONNULL_END

具体的实现类

//

// SuspensionImage.m

// 全局悬浮窗

//

// Created by 随风流年 on 2019/4/5.

// Copyright © 2019 随风流年. All rights reserved.

//

#import "SuspensionImage.h"

#import "UIView+Addition.h"

@interface SuspensionImage()

{

CGPoint startLocation;

BOOL shouldPassEvent; // 是否需要传递事件

}

@end

@implementation SuspensionImage

-(instancetype)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];

if (self) {

self.userInteractionEnabled = YES;

}

return self;

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

CGPoint pt = [[touches anyObject] locationInView:self];

startLocation = pt;

shouldPassEvent = YES;

[[self superview] bringSubviewToFront:self];

}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

CGPoint pt = [[touches anyObject]locationInView:self];

float dx = pt.x - startLocation.x;

float dy = pt.y - startLocation.y;

//计算移动后的view中心点

CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);

/* 限制用户不可将视图拖出屏幕 */

float halfx = CGRectGetMidX(self.bounds);

//x坐标左边界

newCenter.x = MAX(halfx, newCenter.x);

//x坐标右边界

newCenter.x = MIN(self.superview.bounds.size.width - halfx, newCenter.x);

//y坐标同理

float halfy = CGRectGetMidY(self.bounds);

// y坐标上边界

newCenter.y = MAX(halfy, newCenter.y);

newCenter.y = MIN(self.superview.bounds.size.height - halfy, newCenter.y);

// 判断是否需要传递事件

shouldPassEvent = CGPointEqualToPoint(newCenter, startLocation);

//移动view

self.center = newCenter;

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

CGPoint point = self.center;

if (point.x > [self superview].width / 2.0) {

[UIView animateWithDuration:0.2 animations:^{

self.left = [self superview].width - self.width;

}];

}else{

[UIView animateWithDuration:0.2 animations:^{

self.left = 0;

}];

}

if (shouldPassEvent) {//点击事件 需要传递点击

[super touchesEnded:touches withEvent:event];

__weak typeof (self)weakSelf = self;

__strong typeof (weakSelf)strongSelf = weakSelf;

//block作为属性使用

if (strongSelf.completeBlock) {

strongSelf.completeBlock();

}

}

}

//对象方法中使用block

-(void)getTapInfoWithMethod:(tapImageBlcok)block{

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

block();//block作为参数使用

});

}

@end

### 回答1: 可以使用 WindowManager 类来实现全局悬浮窗。首先需要获取 WindowManager 对象,然后创建一个 LayoutParams 对象,设置悬浮窗的宽高、位置等属性,最后将悬浮窗的 View 添加到 WindowManager 中即可。需要注意的是,需要在 AndroidManifest.xml 文件中添加 SYSTEM_ALERT_WINDOW 权限才能显示全局悬浮窗。 ### 回答2: 实现全局悬浮窗在Android系统开发中是一个相对复杂的部分。下面是一种实现方法: 首先,需要在AndroidManifest.xml文件中申请悬浮窗权限。在<manifest>标签下加入以下权限声明: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 然后,创建一个Service类用于管理悬浮窗的显示和隐藏。在Service类中,可以通过WindowManager来实现悬浮窗的控制。在onCreate()方法中,可以创建一个悬浮窗视图,并设置其布局和参数。在启动该Service时,调用WindowManager的addView()方法将悬浮窗添加到界面上。 在悬浮窗视图上,可以添加所需的UI组件和逻辑。通过设置触摸事件监听,可以实现拖拽悬浮窗的功能。同时监听点击事件,可以实现悬浮窗的点击响应。 为了实现全局悬浮窗,需要注意在Service中设置悬浮窗的类型为TYPE_SYSTEM_ALERT或TYPE_APPLICATION_OVERLAY。这样可以让悬浮窗在其他应用程序之上显示。 此外,为了提高悬浮窗的交互性,可以通过设置悬浮窗的动画效果,实现悬浮窗的平滑移动和渐变效果。 最后,在完成悬浮窗的开发后,不要忘记在Service的onDestroy()方法中移除悬浮窗,避免资源泄漏。 综上所述,实现全局悬浮窗的方法包括:在Manifest文件中申请权限、创建Service类实现悬浮窗的显示和隐藏、通过WindowManager控制悬浮窗、添加UI组件和逻辑、实现拖拽和点击事件的响应、设置悬浮窗的类型和动画效果、在Service销毁时移除悬浮窗等步骤。 ### 回答3: 要实现Android系统的全局悬浮窗,我们可以按照以下步骤进行: 1. 添加悬浮窗权限:在AndroidManifest.xml文件中添加SYSTEM_ALERT_WINDOW权限,允许应用在其他应用上层显示视图。 2. 创建悬浮窗Service:创建一个继承自Service的类,用于管理悬浮窗的显示和隐藏。在Service的onCreate()方法中,创建悬浮窗视图,并通过WindowManager将其添加到屏幕上。 3. 定义悬浮窗视图:使用自定义的View类创建悬浮窗视图,可以根据需求设计布局和添加控件。通过设置LayoutParams参数,控制悬浮窗位置和大小。 4. 处理触摸事件:为悬浮窗视图添加触摸监听器,实现移动、缩放等手势操作。可以使用MotionEvent类获取触摸坐标,并通过更新LayoutParams参数来实现相应的操作。 5. 处理悬浮窗的生命周期:在Service的onStartCommand()方法中处理悬浮窗的显示和隐藏逻辑。在悬浮窗视图销毁时,需要将其从WindowManager中移除。 6. 处理权限申请:在Android版本为M及以上时,需要动态请求悬浮窗权限。可以通过使用Settings.ACTION_MANAGE_OVERLAY_PERMISSION打开系统设置界面,让用户手动授权。 7. 适配不同Android版本:由于不同Android版本权限管理方式不同,需要在代码中进行适配处理。可以通过Build.VERSION.SDK_INT来判断系统版本,并采取相应的操作。 通过以上步骤,我们可以实现Android系统的全局悬浮窗。在悬浮窗的显示和隐藏逻辑上,可以根据具体需求进行进一步的优化和定制,以满足不同场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值