我正在尝试使用Flutter来模糊视频。
BackdropFilter在android上工作,但在ios设备上不工作,也许是因为videoView本身使用UiKitView。因此,我尝试使用UiKitView制作自己的模糊小部件,并成功地模糊了视频,但是现在我想使用“半径”值动态更改模糊级别。
我使用Slider和setState进行了测试,但它不会更改模糊级别。有什么办法可以从Flutter方面重建UiKitView?
这是我使用Stack的主屏幕
child: Stack(
children: <Widget>[
videoView(),
blurView(),
radiusSlider(),
],
),
T 他是动态更改半径值的滑块
Widget radiusSlider() {
return Slider(
activeColor: Colors.indigoAccent,
min: 0.0,
max: 30.0,
onChanged: (newVal) {
setState(() => radius = newVal.toInt());
},
value: radius.toDouble(),
);
}
这是具有平台视图的模糊小部件。我想用半径值动态更改此小部件
Widget blurView() {
if (radius <= 15) {
return Positioned.fill(
child: Container(
child: UiKitView(
viewType: 'BlurVideo',
creationParams: <String, dynamic>{
"radius": 10,
},
creationParamsCodec: StandardMessageCodec(),
),
),
);
} else {
return Positioned.fill(
child: Container(
child: UiKitView(
viewType: 'BlurVideo',
creationParams: <String, dynamic>{
"radius": 30,
},
creationParamsCodec: StandardMessageCodec(),
),
),
);
}
}
这是我的AppDelegate.swift文件
import UIKit
import Flutter
import VisualEffectView
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let viewFactory = BlurViewFactory()
registrar(forPlugin: "Blur").register(viewFactory, withId: "BlurVideo" )
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
public class BlurViewFactory: NSObject, FlutterPlatformViewFactory {
public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
return FlutterStandardMessageCodec.sharedInstance()
}
public func create(
withFrame frame: CGRect,
viewIdentifier viewId: Int64,
arguments args: Any?
) -> FlutterPlatformView {
return BlurView(frame, viewId: viewId, args: args)
}
}
public class BlurView : NSObject, FlutterPlatformView {
let frame: CGRect
let viewId: Int64
let radius: CGFloat
init(_ frame: CGRect, viewId: Int64, args: Any?) {
self.frame = frame
self.viewId = viewId
let params = args as! NSDictionary
self.radius = params["radius"] as! CGFloat
}
public func view() -> UIView {
let view = UIView()
let visualEffectView = VisualEffectView(frame: view.bounds)
visualEffectView.blurRadius = self.radius
visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(visualEffectView)
return view
}
}