当前位置:文档之家› 安卓TV开发(四) 实现主流智能TV视频播放器UI

安卓TV开发(四) 实现主流智能TV视频播放器UI

安卓TV开发(四) 实现主流智能TV视频播放器UI
安卓TV开发(四) 实现主流智能TV视频播放器UI

安卓TV开发(四)实现主流智能TV

视频播放器UI

在FocusView中需要添加一个FocusItemModle 用于填充父布局,这个FocusItemModle 类似grideView中itemview一样,我们可以这么理解,现在我们就定义一个FocusItemModle 类,代码如下:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class FocusItemModle {

private View mFocusView = null;

/**

* 起点行数

*/

private int mRow = 0;

/**

* view占据行数

*/

private int mRowSpan = 1;

/**

* 起点列数

*/

private int mCol = 0;

/**

* View占据列数

*/

private int mColSpan = 1;

/**

* @param v

* @param row

* @param col

*/

public FocusItemModle(View v, int row, int col) {

this(v, row, 1, col, 1);

}

/**

* @param v

* @param row

* @param rowspan

* @param col

* @param colspan

*/

public FocusItemModle(View v, int row, int rowspan, int col, int colspan) {

mFocusView = v;

setPosition(row, col);

if (rowspan < 1)

throw new IllegalArgumentException("rowspan < 1");

mRowSpan = rowspan;

if (colspan < 1)

throw new IllegalArgumentException("colspan < 1");

mColSpan = colspan;

}

public View getMetroView() {

return mFocusView;

}

public int getRow() {

return mRow;

}

public int getRowSpan() {

return mRowSpan;

}

public int getCol() {

return mCol;

}

public int getColSpan() {

return mColSpan;

}

public void setPosition(int row, int col) {

if (row < 0)

throw new IllegalArgumentException("row < 0");

mRow = row;

if (col < 0)

throw new IllegalArgumentException("col < 0");

mCol = col;

}

此item主要控制focusView显示在第几排第几列,用于返回一个itemView显示在

focusView中。

再写好这些主要view之前,便于以后项目的扩展我们就专门写一个javaBean---,TvModle,也为了迎合mvc设计模式,用来将服务器数据映射到view上。

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class TvModle {

/**

* 图片资源

*/

private int image;

/**

* 标题

*/

private String name;

/**

* url

*/

private String url;

/**

* 简介或信息

*/

private String info;

/**

* 日期

*/

private String date;

/**

* 包括子节目

*/

private List childs;

public TvModle() {

super();

}

public TvModle(int image, String name) {

super();

this.image = image;

https://www.doczj.com/doc/3914379878.html, = name;

}

public int getImage() {

return image;

}

public void setImage(int image) { this.image = image;

}

public String getName() {

return name;

}

public void setName(String name) { https://www.doczj.com/doc/3914379878.html, = name;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public String getInfo() {

return info;

}

public void setInfo(String info) { https://www.doczj.com/doc/3914379878.html, = info;

}

public String getDate() {

return date;

}

public void setDate(String date) { this.date = date;

}

public List getChilds() {

return childs;

}

public void setChilds(List childs) {

this.childs = childs;

}

}

等写好了view和中间层,接下来我们就开始写要显示该UI的activty,这里我们主要是New 一个focusView,通过不断往里面加入一个个不同的itemView。

activty:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.doczj.com/doc/3914379878.html,yout.mian_tv_ui);

FocusView view = (FocusView) findViewById(R.id.focus_ui);

view.setBackgroundColor(Color.WHITE);

view.setGap(5);

view.setVisibleItems(6, 5);

view.setOrientation(OrientationType.Horizontal);

view.setAnimation(R.anim.scale_small, R.anim.scale_big);

/*view.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(FocusView metroView, View view, int col, int row,

https://www.doczj.com/doc/3914379878.html,ng id) {

Toast.makeText(getApplicationContext(),col+"", 1).show();

}

});*/

getData();

// 添加自定义VIEW

view.addFocusItem(

getTvView(mTvLists.get(0).getName(),mTvLists.get(0).getImage(),0, 3, 0, 2));

view.addFocusItem(

getTvView(mTvLists.get(1).getName(),mTvLists.get(1).getImage(),3, 3, 0, 2));

view.addFocusItem(

getTvView(mTvLists.get(2).getName(),mTvLists.get(2).getImage(),0, 2, 2, 1));

view.addFocusItem(

getTvView(mTvLists.get(3).getName(),mTvLists.get(3).getImage(),0, 2, 3, 1));

view.addFocusItem(

getTvView(mTvLists.get(4).getName(),mTvLists.get(4).getImage(),0, 2, 4 ,1));

view.addFocusItem(

getTvView(mTvLists.get(5).getName(),mTvLists.get(5).getImage(),2, 2, 2, 1));

view.addFocusItem(

getTvView(mTvLists.get(6).getName(),mTvLists.get(6).getImage(),2, 2, 3, 1));

view.addFocusItem(

getTvView(mTvLists.get(7).getName(),mTvLists.get(7).getImage(),2, 2, 4 ,1));

view.addFocusItem(

getTvView(mTvLists.get(8).getName(),mTvLists.get(8).getImage(),4, 2, 2, 1));

view.addFocusItem(

getTvView(mTvLists.get(9).getName(),mTvLists.get(9).getImage(),4, 2, 3, 1));

view.addFocusItem(

getTvView(mTvLists.get(10).getName(),mTvLists.get(10).getImage(),4, 2, 4 ,1));

//添加默认logo

view.addFocusItem(getDefView(0, 2, 5, 1));

view.addFocusItem(getDefView(0, 2, 6, 1));

view.addFocusItem(getDefView(0, 2, 7 ,1));

view.addFocusItem(getDefView(0, 2, 8 ,1));

view.addFocusItem(getDefView(0, 2, 9 ,1));

view.addFocusItem(getDefView(2, 2, 5, 1));

view.addFocusItem(getDefView(2, 2, 6, 1));

view.addFocusItem(getDefView(2, 2, 7 ,1));

view.addFocusItem(getDefView(2, 2, 8 ,1));

view.addFocusItem(getDefView(2, 2, 9 ,1));

}

这里的代码比较好理解,只是将我们所要的控件找到,加入多个子item,getdata()是用来模拟获取服务数据的,本次demo暂时写到activity中,企业开发中建议单独写个manager用来

控制网络层获取数据,下面是getDate(); 本文出处:https://www.doczj.com/doc/3914379878.html,/sk719887916 [java] view plain copy print?在CODE上查看代码片派生到我的代码片

// 模拟网络获取数据

mTvLists.add(new TvModle(R.drawable.atm, "阿童木重磅来袭"));

mTvLists.add(new TvModle(R.drawable.sdyjq, "速度与激情大片在线看"));

mTvLists.add(new TvModle(R.drawable.yyt, "音悦台"));

mTvLists.add(new TvModle(https://www.doczj.com/doc/3914379878.html,tv, "中国网络电视台"));

mTvLists.add(new TvModle(R.drawable.shtv, "东方卫视"));

mTvLists.add(new TvModle(R.drawable.hutv, "芒果卫视"));

mTvLists.add(new TvModle(R.drawable.gstv, "甘肃卫视"));

mTvLists.add(new TvModle(https://www.doczj.com/doc/3914379878.html,tv, "江苏卫视"));

mTvLists.add(new TvModle(R.drawable.shtv, "东方卫视"));

mTvLists.add(new TvModle(R.drawable.pptv, "pptv"));

mTvLists.add(new TvModle(R.drawable.aqy, "爱奇艺"));

mTvLists.add(new TvModle(https://www.doczj.com/doc/3914379878.html,tv, "中国网络电视台"));

mTvLists.add(new TvModle(R.drawable.atm, "阿童木重磅来袭"));

mTvLists.add(new TvModle(R.drawable.sdyjq, "速度与激情大片在线看"));

mTvLists.add(new TvModle(R.drawable.bjaqgs, "北京爱情故事"));

mTvLists.add(new TvModle(R.drawable.hutv, "芒果卫视"));

mTvLists.add(new TvModle(R.drawable.gstv, "甘肃卫视"));

mTvLists.add(new TvModle(https://www.doczj.com/doc/3914379878.html,tv, "江苏卫视"));

mTvLists.add(new TvModle(R.drawable.shtv, "东方卫视"));

在上面的初始化方法中,我们会用到添加子控件的view的方法,通过getTview()和getDefView(),前面方法用于指定显示我们所要的itemView,后面方法是显示默认的view

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

/**

* getTvView

* @param title

* @param rouseid

* @param row

* @param rowspan

* @param col

* @param colspan

* @return FocusItemVew

*/

private FocusItemModle getTvView(String title, int rouseid, int row, int rowspan,

int col, int colspan) {

LinearLayout layout = getLinearLayout();

layout.setGravity(Gravity.CENTER);

FrameLayout frameLayout = new FrameLayout(this);

frameLayout.setPadding(PADDING, PADDING, PADDING, PADDING);

TextView mTextView = new TextView(this);

mTextView .setText(title);

mTextView .setGravity(Gravity.CENTER);

mTextView .setTextColor(Color.BLACK);

mTextView .setTextSize(15);

ImageView mLogoView = new ImageView(this);

mLogoView.setLayoutParams(FILL_FILL);

mLogoView.setImageResource(rouseid);

frameLayout.addView(mLogoView, FILL_FILL);

frameLayout.addView(mTextView , WRP_WRP);

layout.addView(https://www.doczj.com/doc/3914379878.html,eLayout);

return new FocusItemModle(layout, row, rowspan, col, colspan);

}

private FocusItemModle getDefView(int row, int rowspan, int col, int colspan) { LinearLayout layout = getLinearLayout();

TextView tv2 = new TextView(this);

tv2.setText("频道"+(i ++));

tv2.setGravity(Gravity.CENTER);

tv2.setTextColor(Color.WHITE);

tv2.setTextSize(15);

layout.addView(tv2, FILL_FILL);

return new FocusItemModle(layout, row, rowspan, col, colspan);

}

再次我们还需要用到填充activty的Layout的xmL,比较简单

[html] view plain copy print?在CODE上查看代码片派生到我的代码片

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/focus_ui"

android:layout_width="fill_parent"

android:layout_height="wrap_content" />

通过上篇文章结合本次文章,我们初步实现了一个在安卓TV上显示,并且可以用遥控器控制上下左右移动的效果UI,但由于只是demo,并非实际项目,所以效果比较粗糙,但是并不影响代码质量,以上的代码在tv上没有任何bug,但是运行在手机上是存有缺陷的,如果需要兼容手机,TV和手机公用一个版本的话,代码需要优化,但我本人不建议手机和电视版本公用一个版本,这样对UI的适配和焦点控制会带来众多麻烦,手机也无需这么大的使徒,但是不仿喜欢的朋友自己去完善和扩展,况且电视的操作体验是比较简单的,并且无法触屏的(但也有触屏的电视,价格不菲)后面我会继续完善本次demo,结合第三方开源视频框架,完成一个简易的tv上的视频播放器。

java视频播放器源代码

import java.awt.*; import java.io.*; import java.util.*; import javax.media.*; import javax.media.format.*; import javax.swing.*; public class VideoPlayer implements ControllerListener { Vector audioCapDevList = null; Vector videoCapDevList = null; CaptureDeviceInfo audioCapDevInfo = null; CaptureDeviceInfo videoCapDevInfo = null; MediaLocator audioCapDevLoc = null; MediaLocator videoCapDevLoc = null; Player audioPlayer; Player videoPlayer; public void initAudioCapDevLoc() { //这里可以填写其它的音频编码格式,具体请看AudioFormat类 audioCapDevList = CaptureDeviceManager.getDeviceList(new AudioFormat( AudioFormat.LINEAR)); if ((audioCapDevList.size() > 0)) { //或许有几个CaptureDevice,这里取第一个 audioCapDevInfo = (CaptureDeviceInfo) audioCapDevList.elementAt(0); audioCapDevLoc = audioCapDevInfo.getLocator(); } else { System.out.println("找不到音频采集设备"); System.exit(0); } } public void initVideoCapDevLoc() { //这里可以填写其它的编码视频格式,具体请看VideoFormat类 videoCapDevList = CaptureDeviceManager.getDeviceList(new VideoFormat( VideoFormat.YUV)); if ((videoCapDevList.size() > 0)) {

各视频格式播放代码

1。avi格式 代码片断如下: <object id="video" width="400" height="200" border="0" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> <param name="ShowDisplay" value="0"> <param name="ShowControls" value="1"> <param name="AutoStart" value="1"> <param name="AutoRewind" value="0"> <param name="PlayCount" value="0"> <param name="Appearance value="0 value="""> <param name="BorderStyle value="0 value="""> <param name="MovieWindowHeight" value="240"> <param name="MovieWindowWidth" value="320"> <param name="FileName" value="/Mbar。avi"> <embed width="400" height="200" border="0" showdisplay="0" showc autostart="1" autorewind="0" playcount="0" moviewindowheight="240" moviewindowwidth="320" filename="/Mbar。avi" src="Mbar。avi"> </embed> </object> 2。mpg格式 代码片断如下: <object classid="clsid:05589FA1-C356-11CE-BF01-00AA0055595A" id="ActiveMovie1" width="239" height="250">

视频播放器通用代码

ASP视频播放器通用代码 1.avi格式 2.mpg格式

几种在网页中播放FLV视频文件的代码

几种在网页中播放FLV视频文件的代码(附FLV播放器) 方法一、js嵌入 直接copy下面代码,修改其中红色部分,即:swf_width、swf_height、texts、files 参数引用 其中: 群英传WEB版宣传视频是标题。 https://www.doczj.com/doc/3914379878.html,/flv/qyzweb.flv是FLV文件地址。 https://www.doczj.com/doc/3914379878.html,/flv/flvplayer.swf 是FLV文件播放器地址(如果你不会制作,可下载别人的然后上传到自己的空间再调用)。

空间播放器代码大全:网页中插入各种格式视频播放代码大全

空间播放器代码大全:网页中插入各种格式视频播放代码大全 疯狂代码 https://www.doczj.com/doc/3914379878.html,/ ?:http:/https://www.doczj.com/doc/3914379878.html,/HtmlJiaoCheng/Article19101.html 1.avi格式 代码片断如下: 2.mpg格式 代码片断如下:

网页视频播放器代码

网页视频播放器代码大全网页mtv播放器代码 一. RM格式(无边框按钮)RealPlayer 代码如下:

二. RM格式(带边框按钮)RealPlayer 代码如下:

三. WMV格式(带边框按钮)Windows Media Player 代码如下:

网页视频播放器代码大全

网页视频播放器代码大全 1.avi格式 代码片断如下: 2.mpg格式 代码片断如下:

视频播放器总结报告

实验10 多媒体与网络编程 【测试题1】 编写代码实现制作一个音频文件播放器。只需要实现如图所示的简单界面,点击打开弹出对话框,打开一个.wav的波形音频文件,点击“播放”按钮开始播放,点击“停止”按钮则停止播放,按“关机”按钮则退出应用程序。 需求分析: 1,项目背景和原因。 波形音频是一种电子数字化的声音,是计算机播放音频的一种重要格式,它存储的是声音的波形信息,当播放波形音频时,不管播放文件的设备是何种类型,都会得到相似的声音,波形音频文件通常wav作为文件扩展名。由于采用波形音频存储电子化声音需要大量的存储空间,因此它一般只用于短时间的声音播放。 通过设计一个简单的波形音频播放器,了解MFC,了解接口类MCI。 2,波形音频播放器的功能 播放器有“打开”,“播放”,“停止”,“关机”三个按钮,同时有一个状态栏,用于显示播放器当前处于的状态。 “打开”按钮用于打开一个波形音频文件; “播放”用于播放选中的波形音频文件; “停止”用于暂停正在播放的音频文件,再次点击“播放”时会从暂停出继续播放; “关机”用于退出播放器。播放器界面如图所示:

3,数据字典 类向导ClassWizard 静态文本Static Text 按钮Command Button ,4,功能列表 “打开”-------------------void CWaverDlg::OnOpen() “播放”-------------------void CWaverDlg::OnPlay() “停止”-------------------void CWaverDlg::OnStop() “关机”-------------------void CWaverDlg::OnExit() 5,具体实现步骤 ,1、首先在VisualC++平台上,选择File->New,新建一个名为WaveAudio.h的头文件。代码如下: #if!defined(WA VE_H_INCLUDED_) #define WA VE_H_INCLUDED_ #include "mmsystem.h" class CWave { public: BOOL m_bPlaying; BOOL m_bOpen; WORD m_wDeviceID; public:

各种网页播放器代码大全

各种网页播放器代码大全 https://www.doczj.com/doc/3914379878.html, 更新日期:2005-03-02 14:54 出处:网页教学网作者: rm文件在线播放 autostart="false" 打开页面时处于候命状态,autostart="true" 打开页面时马上听声音hei ght=25 width=50 有不同数值,播放器面板有些不同 midi、au、avi文件在线播放 autostart="false" 打开页面时处于候命状态,autostar t="true" 打开页面时马上听声音height=25 width=50 有不同数值,播放器面板有些不同asf文件在线播放

收集最常用的网页中嵌入视频代码大全教学内容

收集最常用的网页中嵌入视频代码大全,各种各样的网页视频播放器代码. 网页中嵌入视频代码综合完全版 1.avi格式 代码片断如下: 程序代码

在线视频播放代码

在线视频播放代码 1.avi格式 2.mpg格式

HTML中的视频播放器代码

1.avi格式 代码片断如下: 2.mpg格式 代码片断如下:

视频播放器设计分析

视频播放器设计 1 需求分析 由于计算机的普及,极大地改变了人们的生活。随之带来了开发各种软件的需求。家用型计算机主要用于家用软件、学习软件、游戏软件和多媒体和多媒体软件,以及播放CD、VCD、DVD、MP3等多媒体信息。然而多媒体播放器的开发仍然不能满足人们的需求,多媒体文件格式多样,但却没有一款播放器能够满足所有格式的解码。人们渴望解码能力更强大,功能更完备的多媒体播放器。 “多媒体”是一种新型的信息处理与传播技术。有人认为它是信息及其传输媒介方面的一场根本革命。人们对新技术的渴望和欢迎、新奇感和占有欲、宣传热情和赞美态度,是发自内心的。特别是计算机多媒体技术的功能,令人大开眼界,惊叹不已。它在商业、信息检索、文化娱乐和教育等方面的应用效果明显,前景广阔。 由多媒体播放器的开发现状看来,并没有哪一款播放器能适应所有多媒体文件的解读,随着视频、音频的迅猛发展,媒体文件的格式层出不穷,由过往美国在线(AOL)公司的Nullsoft部门开发的Winamp独占鳌头,到Real Networks公司的Real Player和微软公司的Windows Media Player风靡全球,再到如今播放器开发的百花齐放的竞争时代,多媒体播放器的开发经历了许多风浪和变化,但是,仍然没有出现全能的播放器,始终没有跨越编码格式的局限,随着多媒体技术的不断发展,人们对多媒体软件的要求也不断高涨,所以对多媒体软件的开发也成为当今计算机开发的重要课题。目前的音频、视频格式繁多,研制格式覆盖面广的多媒体播放器前景非常广泛。 随着计算机、家电、通信等技术的不断发展,多媒体技术有着广泛的开发前景,尤其是多媒体播放器的开发,开发格式覆盖面更广,兼容性更好,功能更完备的播放器势在必行。本文主要采用C++ Builder2009作为开发工具,设计并实现一个多媒体播放器。可播放MP3,AVI,WMV,WMA,RM,RMVB,SWF等多种格式的多媒体文件,并且能够控制播放,暂停,停止,快进,后退,音量控制的调节,选择上一曲,选择下一曲,图像的显示,文件的计时,列表文件的添减操作等多种播放控制功能,界面简明,操作简单。 2 系统总体设计 2.1DirectShow概述 DirectShow是一种通过自定义或内置的大量的Filter(过滤器)来处理多媒体 数据的体系结构。这些Filter大致分三类:Source Filter(源过滤器)、Transform Filter(转换过滤器)、Render Filter(呈现过滤器)。源过滤器主要负责获取数据,数据源可以是文件、网络、计算机采集卡或数字摄像机里的,然后数据向下传输到Transform Filter,它主要负责数据的格式转换,然后继续向下传输到Render Filter,它主要负责数据的最终去向,将数据送给显卡声卡进行播放或输出变成文件存储起来,见图2-1。

Android视频播放器代码

package https://www.doczj.com/doc/3914379878.html,.iotek; import java.io.IOException; import java.util.Random; import android.app.Activity; import android.content.Context; import https://www.doczj.com/doc/3914379878.html,NotFoundException; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.os.Handler; import android.view.GestureDetector.OnGestureListener; import android.view.Gravity; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.ImageButton; import android.widget.LinearLayout; import https://www.doczj.com/doc/3914379878.html,youtParams; import android.widget.PopupWindow; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; public class PlayVideo extends Activity implements OnGestureListener, OnClickListener,// 监听 OnBufferingUpdateListener,// 当网络缓冲数据流变化的时候唤起的播放事件 OnCompletionListener,// 当媒体资源在播放的时候到达终点时唤起的播放事件 MediaPlayer.OnPreparedListener, SurfaceHolder.Callback// 回调函数 {

相关主题
文本预览
相关文档 最新文档