Android实现视频d幕功能

Android实现视频d幕功能,第1张

概述Android实现视频d幕功能 本文实例为大家分享了Android视频d幕的具体代码,供大家参考,具体内容如下 效果图: 上图:代码随机生成的d幕及d幕输入栏 下图:绿色框的d幕为用户手动添加发送的d幕 1.准备工作 准备一个视频文件,将该视频文件放到res/raw目录下. 需要将视频设置为横屏播放,即往配置文件中添加android:screenOrientation="landscape": <activity android:name=".MainActivity" andro ...

本文实例为大家分享了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幕功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1144277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存