Flutter 如何使用flifter实现画中画?
有没有什么方法可以用Flitter应用程序实现画中画?就像YouTube在你观看视频并导航到另一个应用程序时所做的那样 他们在这里谈论: 我搜索了它,但找不到任何关于它的信息。这个功能叫做“PiP模式”,谷歌应该比“画中画”容易得多。 有一个flatter软件包,但我还没有尝试过(不幸的是,它似乎也是android的)Flutter 如何使用flifter实现画中画?,flutter,Flutter,有没有什么方法可以用Flitter应用程序实现画中画?就像YouTube在你观看视频并导航到另一个应用程序时所做的那样 他们在这里谈论: 我搜索了它,但找不到任何关于它的信息。这个功能叫做“PiP模式”,谷歌应该比“画中画”容易得多。 有一个flatter软件包,但我还没有尝试过(不幸的是,它似乎也是android的) 导入“包装:颤振/材料.省道”; 导入“dart:async”; 导入“包:flifter/services.dart”; 导入“包:flatter_android_pip/f
导入“包装:颤振/材料.省道”;
导入“dart:async”;
导入“包:flifter/services.dart”;
导入“包:flatter_android_pip/flatter_android_pip.dart”;
void main()=>runApp(新的MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>new_MyAppState();
}
类MyAppState扩展了状态{
字符串_platformVersion='未知';
@凌驾
void initState(){
super.initState();
//initPlatformState();
}
/*
//平台消息是异步的,所以我们用异步方法初始化。
Future initPlatformState()异步{
字符串平台版本;
//平台消息可能会失败,因此我们使用try/catch PlatformException。
试一试{
platformVersion=等待IDIP.platformVersion;
}平台异常{
platformVersion='获取平台版本失败';
}
//如果在异步平台运行时从树中删除了小部件
//消息正在传输中,我们希望放弃回复而不是呼叫
//设置state以更新我们不存在的外观。
如果(!已安装)返回;
设置状态(){
_平台版本=平台版本;
});
}*/
@凌驾
小部件构建(构建上下文){
返回新材料PP(
家:新脚手架(
appBar:新的appBar(
标题:const Text(“插件示例应用程序”),
),
正文:新中心(
孩子:新升起的按钮(
儿童:新文本(“新闻”),
已按下:(){
flatterandroidpip.enterPictureInPictureMode;
},
),
),
),
);
}
}
您所要求的内容在颤振中不可用,您必须仅在本机中实现它。
我已经做了一个应用程序,使pip只适用于android
为此,首先在flattermain.dart中声明一个通道
比如:-
然后在按钮中单击写入:-
await platform.invokeMethod('showNativeView');
哪个调用mainActivity.java中的方法
在mainActivity.java中编写以下代码:
package com.kovafood;
import io.flutter.embedding.android.FlutterActivity;
import android.app.PictureInPictureParams;
import android.content.Context;
import android.graphics.Point;
import android.os.Build;
import android.util.Rational;
import android.view.Display;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import androidx.multidex.MultiDex;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import androidx.annotation.NonNull;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "flutter.rortega.com.channel";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("showNativeView")){
Display d = getWindowManager()
.getDefaultDisplay();
Point p = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
d.getSize(p);
}
int width = p.x;
int height = p.y;
Rational ratio
= null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ratio = new Rational(width, height);
}
PictureInPictureParams.Builder
pip_Builder
= null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
pip_Builder = new PictureInPictureParams.Builder();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
pip_Builder.setAspectRatio(ratio).build();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
enterPictureInPictureMode(pip_Builder.build());
}
} else {
result.notImplemented();
}
}
);
}
}
在androidManifest.xml中,在第一个活动添加
android:supportsPictureInPicture="true"
package com.kovafood;
import io.flutter.embedding.android.FlutterActivity;
import android.app.PictureInPictureParams;
import android.content.Context;
import android.graphics.Point;
import android.os.Build;
import android.util.Rational;
import android.view.Display;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import androidx.multidex.MultiDex;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import androidx.annotation.NonNull;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "flutter.rortega.com.channel";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("showNativeView")){
Display d = getWindowManager()
.getDefaultDisplay();
Point p = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
d.getSize(p);
}
int width = p.x;
int height = p.y;
Rational ratio
= null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ratio = new Rational(width, height);
}
PictureInPictureParams.Builder
pip_Builder
= null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
pip_Builder = new PictureInPictureParams.Builder();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
pip_Builder.setAspectRatio(ratio).build();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
enterPictureInPictureMode(pip_Builder.build());
}
} else {
result.notImplemented();
}
}
);
}
}
android:supportsPictureInPicture="true"