Flutter 如何使用flifter实现画中画?

Flutter 如何使用flifter实现画中画?,flutter,Flutter,有没有什么方法可以用Flitter应用程序实现画中画?就像YouTube在你观看视频并导航到另一个应用程序时所做的那样 他们在这里谈论: 我搜索了它,但找不到任何关于它的信息。这个功能叫做“PiP模式”,谷歌应该比“画中画”容易得多。 有一个flatter软件包,但我还没有尝试过(不幸的是,它似乎也是android的) 导入“包装:颤振/材料.省道”; 导入“dart:async”; 导入“包:flifter/services.dart”; 导入“包:flatter_android_pip/f

有没有什么方法可以用Flitter应用程序实现画中画?就像YouTube在你观看视频并导航到另一个应用程序时所做的那样

他们在这里谈论:

我搜索了它,但找不到任何关于它的信息。这个功能叫做“PiP模式”,谷歌应该比“画中画”容易得多。 有一个flatter软件包,但我还没有尝试过(不幸的是,它似乎也是android的)

导入“包装:颤振/材料.省道”;
导入“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"