本文实例为大家分享了AndroID视频d幕的具体代码,供大家参考,具体内容如下
效果图:
上图:代码随机生成的d幕及d幕输入栏
下图:绿色框的d幕为用户手动添加发送的d幕
1.准备工作
准备一个视频文件,将该视频文件放到res/raw目录下。
需要将视频设置为横屏播放,即往配置文件中添加androID:screenorIEntation="landscape":
<activity androID:name=".MainActivity" androID:configChanges="keyboardHIDden|orIEntation|screenLayout|screenSize" androID:screenorIEntation="landscape"> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter></activity>
这里用到了哔哩哔哩开源的d幕效果库DanmakuFlameMaster,需要配置到模块的build.gradle的dependencIEs中
注:DanmakuFlameMaster的版本最好使用在0.9以上,否则会存在一些d幕BUG
2.布局
使用一个相对布局,d幕浮于视频之上,底部是d幕文字输入栏,右下角为d幕发送按钮:
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:background="#000000"> <VIDeoVIEw androID:ID="@+ID/vIDeo_vIEw" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layout_centerInParent="true"/> <master.flame.danmaku.ui.Widget.DanmakuVIEw androID:ID="@+ID/danmu" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" /> <linearLayout androID:ID="@+ID/operate_layout" androID:layout_wIDth="match_parent" androID:layout_height="50dp" androID:layout_alignParentBottom="true" androID:visibility="gone"> <EditText androID:ID="@+ID/edit" androID:layout_wIDth="0dp" androID:layout_height="match_parent" androID:layout_weight="1" androID:layout_marginleft="50dp" androID:textcolor="#ffffff" androID:imeOptions="flagNoExtractUi" /> <button androID:layout_wIDth="wrap_content" androID:layout_height="match_parent" androID:ID="@+ID/send" androID:textSize="20sp" androID:background="#00000000" androID:textcolor="#ffffff" androID:text="发送"/> </linearLayout></relativeLayout>
3.视频d幕的实现
<1>播放视频使用VIDeoVIEw来进行播放;
<2>关于d幕库的使用,需要创建一个DanmakuContext的实例和一个d幕的解析器(这里直接创建了一个全局的BaseDanmakuParser),创建完成后就可以调用DanmakuVIEw的prepare()方法了,调用这一方法后会自动调用回调函数中的prepared()方法,在这个方法中调用了start方法,d幕就此开始工作了;
<3>需要在onPause()、onResume()、onDestroy()方法中执行一些 *** 作,以保证DanmakuVIEw的资源可以得到释放。
下面附上完整代码
package com.mega.mydanmudemo;import androID.content.Context;import androID.graphics.color;import androID.os.Build;import androID.os.Bundle;import androID.support.v7.app.AppCompatActivity;import androID.text.TextUtils;import androID.util.Log;import androID.vIEw.VIEw;import androID.vIEw.inputmethod.inputMethodManager;import androID.Widget.button;import androID.Widget.EditText;import androID.Widget.linearLayout;import androID.Widget.VIDeoVIEw;import java.util.Random;import master.flame.danmaku.controller.DrawHandler;import master.flame.danmaku.danmaku.model.BaseDanmaku;import master.flame.danmaku.danmaku.model.DanmakuTimer;import master.flame.danmaku.danmaku.model.IDanmakus;import master.flame.danmaku.danmaku.model.androID.DanmakuContext;import master.flame.danmaku.danmaku.model.androID.Danmakus;import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;import master.flame.danmaku.ui.Widget.DanmakuVIEw;public class MainActivity extends AppCompatActivity { private boolean showDanma; private VIDeoVIEw mVIDeoVIEw; private DanmakuVIEw mDanmu; private BaseDanmakuParser mBaseDanmakuParser = new BaseDanmakuParser() {//d幕解析器 @OverrIDe protected IDanmakus parse() { return new Danmakus(); } }; private DanmakuContext danmakuContext; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); init(); setonListener(); } /*** * 一些初始化工作 */ private voID init() { String uri = "androID.resource://" + getPackagename() + "/" + R.raw.danmu; mVIDeoVIEw = (VIDeoVIEw)findVIEwByID(R.ID.vIDeo_vIEw); mVIDeoVIEw.setVIDeoPath(uri); mVIDeoVIEw.start(); mDanmu = (DanmakuVIEw)findVIEwByID(R.ID.danmu); mDanmu.enableDanmakuDrawingCache(true); danmakuContext = DanmakuContext.create(); danmakuContext.setScaleTextSize(1.1f); mDanmu.prepare(mBaseDanmakuParser,danmakuContext); } /*** * d幕的准备工作,发送按钮监听。。 */ private voID setonListener(){ mDanmu.setCallback(new DrawHandler.Callback() { @OverrIDe public voID prepared() { showDanma = true; mDanmu.start();//启动d幕 generateSomeDanmu(); } @OverrIDe public voID updateTimer(DanmakuTimer timer) { } @OverrIDe public voID danmakuShown(BaseDanmaku danmaku) { } @OverrIDe public voID drawingFinished() { } }); final linearLayout operate_vIEw = (linearLayout)findVIEwByID(R.ID.operate_layout); button send = (button)findVIEwByID(R.ID.send); final EditText editText = (EditText)findVIEwByID(R.ID.edit); mDanmu.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { if (operate_vIEw.getVisibility() == VIEw.GONE){ operate_vIEw.setVisibility(VIEw.VISIBLE); }else{ operate_vIEw.setVisibility(VIEw.GONE); } } }); send.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { String content = editText.getText().toString(); if (!TextUtils.isEmpty(content)){ inputMethodManager imm = (inputMethodManager) getSystemService(Context.input_METHOD_SERVICE); imm.hIDeSoftinputFromWindow(editText.getwindowToken(),0); adddamu(content,true); editText.setText(""); operate_vIEw.setVisibility(VIEw.GONE); } } }); getwindow().getDecorVIEw().setonsystemUIVisibilitychangelistener(new VIEw.OnsystemUIVisibilitychangelistener() { @OverrIDe public voID onsystemUIVisibilityChange(int visibility) { if (visibility == VIEw.SYstem_UI_FLAG_VISIBLE){ onWindowFocusChanged(true); } } }); } /*** * 随机产生一些d幕 */ private voID generateSomeDanmu() { new Thread(new Runnable() { @OverrIDe public voID run() { while (showDanma){ int time = new Random().nextInt(300); String content = "" + time; adddamu(content,false); try { Thread.sleep(time); }catch (Exception e){ e.printstacktrace(); } } } }).start(); } /*** * 添加d幕的方法 * @param content d幕的内容 * @param isSelf 是否是用户发送的d幕 */ private voID adddamu(String content,boolean isSelf) { BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCRolL_RL); danmaku.text = content; danmaku.padding = 5; danmaku.priority = 0; danmaku.textSize = sp2px(20); danmaku.setTime(mDanmu.getCurrentTime()); danmaku.textcolor = color.argb(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); if (isSelf){ danmaku.bordercolor = color.GREEN; } mDanmu.addDanmaku(danmaku); } private float sp2px(int i) { final float FontScale = getResources().getdisplayMetrics().scaledDensity; return (int)(i* FontScale +0.5f); } @OverrIDe protected voID onPause() { super.onPause(); if (mDanmu!= null && mDanmu.isPrepared()){ mDanmu.pause(); } } @OverrIDe protected voID onResume() { super.onResume(); if (mDanmu!=null&& mDanmu.isPrepared()&& mDanmu.isPaused()){ mDanmu.resume(); } } @OverrIDe protected voID onDestroy() { super.onDestroy(); showDanma = false; if (mDanmu != null){ mDanmu.release(); mDanmu = null; } } @OverrIDe public voID onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus && Build.VERSION.SDK_INT>=19){ VIEw devIEw = getwindow().getDecorVIEw(); devIEw.setsystemUIVisibility(VIEw.SYstem_UI_FLAG_LAYOUT_Stable |VIEw.SYstem_UI_FLAG_HIDE_NAVIGATION |VIEw.SYstem_UI_FLAG_FulLSCREEN |VIEw.SYstem_UI_FLAG_LAYOUT_HIDE_NAVIGATION |VIEw.SYstem_UI_FLAG_LAYOUT_FulLSCREEN |VIEw.SYstem_UI_FLAG_IMMERSIVE_STICKY); } }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
总结以上是内存溢出为你收集整理的Android实现视频d幕功能全部内容,希望文章能够帮你解决Android实现视频d幕功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)