他の人からより良く学び、
より良いものになりますように。
—— 「ウェイカ・ジーシャン」
この記事の長さは 1679ワードで、読むのにかかる時間は 6分です。
序文
現在、携帯電話の主要なビデオ アプリは基本的にフローティング ウィンドウ ビデオ モードを備えており、以前の記事「Android がフローティング ウィンドウ コントロールを使用して画面録画プログラムのデモを作成する」と「Android が移動可能なフローティング ウィンドウを実現する」でフローティング ウィンドウの使用方法を紹介しました。 , ピクチャーインピクチャーモードは Android 8.0 で開始されました, 現在のアクティビティを縮小して他のアクティビティの上に表示することです. 使い方も非常に簡単です. この記事では, ピクチャーインを試していきます-ピクチャーモードはAndroid 8.0以降で開始されました。
効果を達成する
コード
マイクロカード志祥
ピクチャーインピクチャー設定
マニフェストのアクティビティにピクチャー・イン・ピクチャー構成を追加する
<activity
android:name=".MainActivity"
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:exported="true">
ここで configchanges にパラメーターを追加しない場合、ピクチャーインピクチャーを開始するとアクティビティが破棄されてから再構築されるため、ピクチャーインピクチャーで UI を更新する一部の構成は機能しません。
ピクチャー・イン・ピクチャー・モードに入ることができるかどうかを決定する
私のプロジェクトで作成したminsdkが27(android8.1)なので、現在のSDKバージョンの判定を追加しませんでしたが、それより小さいバージョンであれば、この判定を追加できます。
ピクチャーインピクチャーモードを有効にする
上記はデフォルトの構築モードであり、これがピクチャ イン ピクチャ モードを有効にする最も簡単な方法です。
ピクチャーインピクチャーモードのステータスを監視する
onPictureInPictureModeChanged 関数を書き換えます。中の isInPictureInPictureMode パラメータは、現在の状態がピクチャ イン ピクチャ モードかどうかを判断するためのものです。ここでのコードは、ピクチャ イン ピクチャ モードに入ったときに、ピクチャ イン ピクチャ モードがTextView に表示され、同時にピクチャーインピクチャーボタンが非表示になります。戻るとテキストが通常モードに変わり、ボタンが再び表示されます。
ノーマルモード
ピクチャーインピクチャーモード
ピクチャーインピクチャーを開始するボタン
onCreateイベントにボタンイベントを追加し、ボタンをクリックするとピクチャーインピクチャーモードが起動する、というシンプルなピクチャーインピクチャーが実現されており、確かに本来のフローティングウィンドウよりもはるかにシンプルです。
マイクロカード志祥
PiP ビルダーのパラメータの問題
上記のピクチャインピクチャの構築パラメータは起動時にデフォルトで設定されていますが、構築パラメータを設定することでアスペクト比やウィンドウ制御の効果を実現することができますので、コードを修正してみましょう。
アクションボタンを追加してピクチャーインピクチャーモードに入り、クリックすると通常モードに戻り、表示比率をデフォルトの横画面から縦画面に変更しました。
setActions はコントロールを設定します。これは基本的にボタンの操作コントロールです。
setAspectRatio は、ピクチャ イン ピクチャのアスペクト比を設定します。最初のパラメータは分子で、2 番目のパラメータは分母です。指定されたアスペクト比は 2.39:1 または 1:2.39 の間でなければなりません。それ以外の場合は、IllegalArgumentException がスローされます。
Android 12 では、setSeamlessResizeEnabled フラグが追加され、ピクチャ イン ピクチャ ウィンドウ内の非ビデオ コンテンツのサイズを変更するときに、よりスムーズなクロスフェード アニメーションが提供されます。以前は、ピクチャー・イン・ピクチャー・ウィンドウで非ビデオ・コンテンツのサイズを変更すると、迷惑な視覚的アーティファクトが発生していました。下位互換性を確保するために、setSeamlessResizeEnabled フラグはデフォルトで true に設定されます。ビデオ コンテンツの場合は true に設定したままにし、ビデオ以外のコンテンツの場合は false に変更します。
Android 12 以降では、setAutoEnterEnabled フラグを使用すると、ジェスチャー ナビゲーション モードで上にスワイプしてホーム画面に移動するときに、ピクチャー イン ピクチャー モードへの移行をよりスムーズに行うことができます。そのため、上図ではSDKのバージョン設定を判定するためのパラメータを追加しています。
パラメータ変更後の効果
以下の2枚の画像はパラメータ変更後の効果ですが、元の横画面が縦画面に変更され、クリック後の下部にボタンが追加されていることがわかります。
完全なコード
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
}
}
}
以上
過去の素晴らしいレビュー
C++ OpenCV は透視変換のために画像を手動でインターセプトします
Androidフォアグラウンドサービスの利用(2) ~LiveEventBusを利用してプロセス間通信を実現~(ソースコード付き)