Android ピクチャーインピクチャー (PIP) モードの使用法

他の人からより良く学び、

より良いものになりますように。

—— 「ウェイカ・ジーシャン」

21b9ae1a266b55b0e0e9e39a00a5f28d.jpeg

この記事の長さは 1679ワードで、読むのにかかる時間は 6分です。

序文

現在、携帯電話の主要なビデオ アプリは基本的にフローティング ウィンドウ ビデオ モードを備えており、以前の記事「Android がフローティング ウィンドウ コントロールを使用して画面録画プログラムのデモを作成する」と「Android が移動可能なフローティング ウィンドウを実現する」でフローティング ウィンドウの使用方法を紹介しました。 , ピクチャーインピクチャーモードは Android 8.0 で開始されました, 現在のアクティビティを縮小して他のアクティビティの上に表示することです. 使い方も非常に簡単です. この記事では, ピクチャーインを試していきます-ピクチャーモードはAndroid 8.0以降で開始されました。

46b77aef5685e9462d9fdf79e837445d.png

効果を達成する

3e63f35a814aacb90938e264ce287026.gif

e7b38eb3d102e16bf6f98c8004939301.jpeg

コード

0887132b2eeb0d7e941c3737593ef748.png

マイクロカード志祥

ピクチャーインピクチャー設定

マニフェストのアクティビティにピクチャー・イン・ピクチャー構成を追加する

f34d515ec61114953a6a8f7bd5752acf.png

<activity
            android:name=".MainActivity"
            android:supportsPictureInPicture="true"
            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
            android:exported="true">

ここで configchanges にパラメーターを追加しない場合、ピクチャーインピクチャーを開始するとアクティビティが破棄されてから再構築されるため、ピクチャーインピクチャーで UI を更新する一部の構成は機能しません。

ピクチャー・イン・ピクチャー・モードに入ることができるかどうかを決定する

665ec7b7ddf5ee729e87085b2f0f620b.png

私のプロジェクトで作成したminsdkが27(android8.1)なので、現在のSDKバージョンの判定を追加しませんでしたが、それより小さいバージョンであれば、この判定を追加できます。

ピクチャーインピクチャーモードを有効にする

aafcbb3b388c6d5c00ac0ef179637026.png

上記はデフォルトの構築モードであり、これがピクチャ イン ピクチャ モードを有効にする最も簡単な方法です。

ピクチャーインピクチャーモードのステータスを監視する

b2d08b5c7cb45ee30fcd3d75e0e98f9b.png

onPictureInPictureModeChanged 関数を書き換えます。中の isInPictureInPictureMode パラメータは、現在の状態がピクチャ イン ピクチャ モードかどうかを判断するためのものです。ここでのコードは、ピクチャ イン ピクチャ モードに入ったときに、ピクチャ イン ピクチャ モードがTextView に表示され、同時にピクチャーインピクチャーボタンが非表示になります。戻るとテキストが通常モードに変わり、ボタンが再び表示されます。

6d1fc84e897646adebecc5bab588c5b8.png

a49dd70baac832d959f00887abdcfea0.png

ノーマルモード

1731911b84dfda4514b00278213e4a9f.png

bba156e15835533f84015ca0b1a00264.png

da81f10bb098ff8b5e83c4bf4b345bc0.png

ピクチャーインピクチャーモード

1e1d3a12389a2ce7afed0befc6d1e254.png

ピクチャーインピクチャーを開始するボタン

5c3ea8c9a5fef81ef5e239794b3e4408.png

onCreateイベントにボタンイベントを追加し、ボタンをクリックするとピクチャーインピクチャーモードが起動する、というシンプルなピクチャーインピクチャーが実現されており、確かに本来のフローティングウィンドウよりもはるかにシンプルです。

マイクロカード志祥

PiP ビルダーのパラメータの問題

上記のピクチャインピクチャの構築パラメータは起動時にデフォルトで設定されていますが、構築パラメータを設定することでアスペクト比やウィンドウ制御の効果を実現することができますので、コードを修正してみましょう。

aa306264496c9d902eb4f99b6764dbbf.png

アクションボタンを追加してピクチャーインピクチャーモードに入り、クリックすると通常モードに戻り、表示比率をデフォルトの横画面から縦画面に変更しました。

setActions はコントロールを設定します。これは基本的にボタンの操作コントロールです。

setAspectRatio は、ピクチャ イン ピクチャのアスペクト比を設定します。最初のパラメータは分子で、2 番目のパラメータは分母です。指定されたアスペクト比は 2.39:1 または 1:2.39 の間でなければなりません。それ以外の場合は、IllegalArgumentException がスローされます。

Android 12 では、setSeamlessResizeEnabled フラグが追加され、ピクチャ イン ピクチャ ウィンドウ内の非ビデオ コンテンツのサイズを変更するときに、よりスムーズなクロスフェード アニメーションが提供されます。以前は、ピクチャー・イン・ピクチャー・ウィンドウで非ビデオ・コンテンツのサイズを変更すると、迷惑な視覚的アーティファクトが発生していました。下位互換性を確保するために、setSeamlessResizeEnabled フラグはデフォルトで true に設定されます。ビデオ コンテンツの場合は true に設定したままにし、ビデオ以外のコンテンツの場合は false に変更します。

Android 12 以降では、setAutoEnterEnabled フラグを使用すると、ジェスチャー ナビゲーション モードで上にスワイプしてホーム画面に移動するときに、ピクチャー イン ピクチャー モードへの移行をよりスムーズに行うことができます。そのため、上図ではSDKのバージョン設定を判定するためのパラメータを追加しています。

パラメータ変更後の効果

以下の2枚の画像はパラメータ変更後の効果ですが、元の横画面が縦画面に変更され、クリック後の下部にボタンが追加されていることがわかります。

0d472b1b18b9d72a8af3dc24cfb0420b.png

dec392c9830615eff26f3c065272e9dd.png

完全なコード

package dem.vaccae.androidpipdemo


import android.app.PendingIntent
import android.app.PictureInPictureParams
import android.app.RemoteAction
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.graphics.drawable.Icon
import android.opengl.Visibility
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Rational
import android.view.View
import android.widget.Toast
import dem.vaccae.androidpipdemo.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {


    private lateinit var binding: ActivityMainBinding


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)


        binding.textView.text = "正常模式"
        binding.btnpip.setOnClickListener {
            if (isCanPipModel()) {
                enterPipModel()
            } else {
                Toast.makeText(this, "无法进入PIP模式", Toast.LENGTH_SHORT)
                    .show()
            }
        }
    }


    //判断是否可以进入画中画模式
    private fun isCanPipModel(): Boolean {
        return packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
    }


    private fun enterPipModel() {
        val builder = PictureInPictureParams.Builder()
        //设置Actions
        val pIntent = PendingIntent.getActivity(this,100,
            intent,PendingIntent.FLAG_UPDATE_CURRENT)
        val remoteAction = RemoteAction(Icon.createWithResource(this,
            R.mipmap.ic_launcher), "画中画","Vaccae",pIntent)
        builder.setActions(arrayListOf(remoteAction))
        //设置宽高比例,第一个是分子,第二个是分母,指定宽高比,必须在 2.39:1或1:2.39 之间,否则会抛出IllegalArgumentException异常。
        val rational= Rational(3,7)
        builder.setAspectRatio(rational)
        
        //Android12下加入的画中画配置,对于非视频内容停用无缝大小调整
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            builder.setSeamlessResizeEnabled(false)
            builder.setAutoEnterEnabled(true)
        }


        enterPictureInPictureMode(builder.build())
    }




    override fun onPictureInPictureModeChanged(
        isInPictureInPictureMode: Boolean,
        newConfig: Configuration?
    ) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
        if (isInPictureInPictureMode) {
            binding.textView.text = "画中画模式"
            binding.btnpip.visibility = View.GONE
        } else {
            binding.textView.text = "正常模式"
            binding.btnpip.visibility = View.VISIBLE
        }
    }


}

以上

155ef72d8014213dc984f2f41a17f20d.png

92c83dc0c7ca6f2e77e9454cd8a342d8.png

過去の素晴らしいレビュー

20aeb5c9aa87dd92fc2a1676fe26e95d.jpeg

C++ OpenCV は透視変換のために画像を手動でインターセプトします


89c217f42825b8bc4e611e2ddf7f168f.jpeg

Androidフォアグラウンドサービスの利用(2) ~LiveEventBusを利用してプロセス間通信を実現~(ソースコード付き)

c195d9e13bfbb62f4c16c2f562f0ad0f.jpeg

Androidフォアグラウンドサービスの利用(1)


おすすめ

転載: blog.csdn.net/Vaccae/article/details/127385205