Android,使APK透明,能够直接看到下层视频(由其他进程直接硬件绘画)

本文介绍了一种在Android设备上实现小窗口播放码流的方法。通过使用SurfaceView并将其设置为透明背景,可以展示底层硬件解码后的画面。这种方式允许应用程序在不干扰其他操作的情况下播放视频。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在开发机顶盒或者电视等产品中,经常可以看到小窗口播放码流的UI设计,这是如何实现的呢?

      电视芯片一般采用硬解码的方式直接解码后显示在UI的最底层,可以通过相关的底层接口来控制其播放、调整大小、分辨率等参数等。而Android的APK无法控制其显示的逻辑,只有改变自己,才能达到小窗口播放的效果。

      基本原理是通过布局一个SurfaceView,并将SurfaceView设置为透明色,此时SurfaceView所处的位置看到的即时底层的画面,如果底层无活动时,则为黑色。代码如下:

package com.androidstudy;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

    SurfaceHolder mHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //setting windows params: FULLSCREEN
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //create surfaceview
        SurfaceView mView = new SurfaceView(this);
        mView.setBackgroundColor(android.R.style.Theme_Translucent);
        setContentView(mView);
        mHolder = mView.getHolder();
        mHolder.addCallback(new SurfaceCallback());
    }

    class SurfaceCallback implements Callback {

        private SurfaceThread thread;

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            //set surfaceview to Trasnparent
            holder.setFormat(PixelFormat.TRANSPARENT);
            if (thread == null) {
                thread = new SurfaceThread();
            }
            thread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            System.out.println("format:"+format+" width:"+width+" height:"+height);
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            thread.terminate();
        }
    }


    class SurfaceThread extends Thread {

        private boolean bIsRun = false;


        @Override
        public synchronized void start() {
            bIsRun = true;
            super.start();
        }

        void terminate()
        {
            bIsRun = false;
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (bIsRun) {

                Canvas canvas = mHolder.lockCanvas();

                //Add a logo "DTVTest" at the upper left corner
                Paint paint = new Paint();
                paint.setFakeBoldText(true);
                paint.setColor(Color.BLUE);
                paint.setTextSize(50);
                paint.setTextAlign(Align.LEFT);
                canvas.drawText("DTVTest", 100, 100, paint);

                mHolder.unlockCanvasAndPost(canvas);
                
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值