在开发机顶盒或者电视等产品中,经常可以看到小窗口播放码流的UI设计,这是如何实现的呢?
电视芯片一般采用硬解码的方式直接解码后显示在UI的最底层,可以通过相关的底层接口来控制其播放、调整大小、分辨率等参数等。而Android的APK无法控制其显示的逻辑,只有改变自己,才能达到小窗口播放的效果。
电视芯片一般采用硬解码的方式直接解码后显示在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();
}
}
}
}
}