Android 排序z order,[Android TV]setZOrderMediaOverlay 调整surfaceView Z-Order使用发现

最近使用了dual decode ,并且dual subtitle.

需要对四个surfaceview进行排序。

好奇怪!

addView的顺序和Z-Order的顺序相反,

即 addView(subtitleView0), addView(videoView1), addView(subtitleView2),addView(videoView3)。

然后dumpsys surfaceFlinger 发现:

Z-Order从小到大排序为:videoView3< subtitleView2< videoView1< subtitleView0。

如果把Z-Order比喻成一座塔的话,就是说先addView进去的就在塔上面,后面addView的在塔下面,因为塔门就在一楼嘛。

然后更奇怪的来了。

我的code是这样:

先addView(subtitleView0),addView(videoView1),然后addView(subtitleView2),然后在这里Call subtitleView2.setZOrderMediaOverlay(true);

接着addView(videoView3),然后在这里Call videoView3.setZOrderMediaOverlay(true);

最后Z-Order 从小到大排序为: videoView1

奇怪不?其实可能不奇怪。

先来看setZOrderMediaOverlay API说明

Android.Views.SurfaceView.SetZOrderMediaOverlay Method

Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself).

Syntax

[Android.Runtime.Register("setZOrderMediaOverlay", "(Z)V", "GetSetZOrderMediaOverlay_ZHandler")]

public virtual void SetZOrderMediaOverlay (bool isMediaOverlay)

Parameters

isMediaOverlay

Documentation for this section has not yet been entered.

Remarks

Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself).

This is typically used to place overlays on top of an underlying media surface view.

Note that this must be set before the surface view's containing window is attached to the window manager.

Calling this overrides any previous call to SurfaceView.SetZOrderOnTop(bool).

看翻译貌似是:把该sufaceview置于其余surfaceview的最上方

但这里奇怪点有三

(0)就是addView的顺序和Z-Order的顺序,可能要看source code,不知道原生的是不是被内部人改了。

(1)我在addView后面使用setZOrderMediaOverlay (true) 也生效!

(2)就是上面排序的地方,对videoView3使用setZOrderMediaOverlay(true),其竟然还是排在第二位!

所以这里在没有追踪source code的情况下猜测:setZOrderMediaOverlay (true)里面也有个排序机制,使用setZOrderMediaOverlay(true)的,只能排在之前使用过setZOrderMediaOverlay(true)的View的下方,这样才能说得过去吧。。QAQ

后面有时间看下source code理清,现在先以此记下此事!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的SurfaceView是一个可以在自己的线程中绘制UI的控件,通常用于实现游戏、视频播放等需要高性能绘制的场景。相较于普通的View,SurfaceView的绘制是在一个独立的缓冲区中进行的,这个缓冲区可以在后台线程中进行绘制,然后在主线程中进行显示,这样可以确保UI的流畅性和性能。 使用SurfaceView的步骤如下: 1.定义SurfaceView 在布局文件中定义SurfaceView,例如: ``` <android.view.SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2.获取SurfaceHolder 在Activity或者Fragment中获取SurfaceView的SurfaceHolder对象,用于控制SurfaceView的绘制: ``` SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder holder = surfaceView.getHolder(); ``` 3.实现SurfaceHolder.Callback接口 实现SurfaceHolder.Callback接口,它包含三个方法:surfaceCreated、surfaceChanged和surfaceDestroyed。其中,surfaceCreated在SurfaceView创建时调用,surfaceChanged在SurfaceView绘制区域大小发生变化时调用,surfaceDestroyed在SurfaceView销毁时调用。在这些方法中,我们可以进行SurfaceView的初始化、绘制、销毁等操作。 ``` holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // 初始化SurfaceView } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // SurfaceView绘制区域大小发生变化 } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 销毁SurfaceView } }); ``` 4.在后台线程中进行绘制 在surfaceCreated方法中,我们可以启动一个后台线程,用于进行SurfaceView的绘制。在这个线程中,我们可以使用Canvas对象进行绘制。在绘制完成后,我们需要调用SurfaceHolder的lockCanvas方法获取到Canvas对象,然后进行绘制,最后调用SurfaceHolder的unlockCanvasAndPost方法提交绘制结果。 ``` Thread drawThread = new Thread(new Runnable() { @Override public void run() { while (true) { Canvas canvas = holder.lockCanvas(); // 绘制操作 holder.unlockCanvasAndPost(canvas); } } }); drawThread.start(); ``` 5.在主线程中更新UI 在surfaceChanged和surfaceDestroyed方法中,我们需要在主线程中更新UI,例如修改控件的可见性、修改控件的属性等操作。可以使用runOnUiThread方法或者Handler来实现。 ``` runOnUiThread(new Runnable() { @Override public void run() { // 在主线程中更新UI } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值