Android下的弹幕的简单实现

简介


今天给大家带来一个前几天在做工程的时候写的一个有意思的Android弹幕实现,可以用来吐槽,介绍APP之类的~非常简单~几行代码~哈哈~下面是下载地址~

下载地址(记得给我星哟):https://github.com/dayiming/BarrageView

实现

首先,因为是弹幕,为了让文字浮动于要显示的层的表面,我们需要准备一个半透明渐变的背景,所以,创建drawable_barrage_background.xml文件于drawable文件夹下,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><gradient
        android:angle="-90"android:startColor="#00333333"android:centerColor="#60333333"android:endColor="#c0333333"/>
</shape>

为了让弹幕的每一段文字可以被清晰的看见,最好给弹幕的每一个条目设置一个背景,为了优化视觉效果,这个背景最好也是有一些透明度的,创建drawable_barrage_item_background.xml与drawable文件夹下,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"           android:shape="rectangle"><corners android:radius="4dp"/><solid android:color="#e0ffffff"/><padding android:bottom="2dp" android:left="12dp" android:right="12dp" android:top="2dp"/>
</shape>

准备工作做完之后,下面就是重写控件了。

首先我们创建BarrageView继承自FrameLayout(其实继承自哪个控件都可以,只要后面的代码根据控件的不同稍作修改就可以了)。在构造函数中我们完成如下操作:

public BarrageView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {//设置背景色this.setBackgroundResource(R.drawable.drawable_barrage_background);//创建一个文本标记用于展示,并添加一定的属性让它与底部居中tv_tag = new TextView(getContext());tv_tag.setTextSize(18);tv_tag.setTextColor(Color.WHITE);LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics());params.bottomMargin = margin;params.leftMargin = margin;params.rightMargin = margin;tv_tag.setSingleLine(false);tv_tag.setLayoutParams(params);tv_tag.setText("没错这就是弹幕~一会就没了~");this.addView(tv_tag);//这个类是我自己写的类,用于获取屏幕的长宽的类,在源码中有screenParams = new ScreenParams(getContext());random = new Random();//这个类主要用于检测组件是否被绘制,为了提升效果,我们在组件被绘制的时候才开始动态添加弹幕ViewTreeObserver observer = getViewTreeObserver();observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {//防止这个函数被多次调用if (!isMessured) {isMessured = true;handler.postDelayed(playRunnable, PLAY_DURATION); //用于开始生成弹幕 PLAY_DURATION = 400handler.postDelayed(disappearRunnable, DISAPPEAR_DURATION); //用于停止弹幕和隐藏组件 DISAPPEAR_DURATION 这个可以随意设置时长}return true;}});}

接着我们准备一些要显示的颜色和文字,放置成数组

private int[] colors = new int[] {Color.parseColor("#e51c23"),Color.parseColor("#e91e63"),Color.parseColor("#9c27b0"),Color.parseColor("#673ab7"),Color.parseColor("#3f51b5"),Color.parseColor("#5677fc"),Color.parseColor("#ffc107"),Color.parseColor("#009688"),Color.parseColor("#259b24"),};private String[] texts = new String[] {"Android上也可以有弹幕哟~","是不是还挺有意思的~","我也这么觉的~","我们的APP特别的有意思~","我只是吐槽一下产品~","这个地方不要写死,以后一定会改的~","***是这个世界上最好的语言!!","请叫我攻城狮~~","卖个萌~O(∩_∩)O~~"};

下面就是最重要的一步,动态随机的生成弹幕,放在一个Runnable中定时实现,代码如下:

private Runnable playRunnable = new Runnable() {@Overridepublic void run() {final TextView tem = new TextView(getContext());//设置文字大小tem.setTextSize(18);//设置背景tem.setBackgroundResource(                       R.drawable.drawable_barrage_item_background);//设置颜色tem.setTextColor(colors[random.nextInt(colors.length)]);String text = texts[random.nextInt(texts.length)];tem.setText(text);//让文本框居右,因为我们要从右端开始显示LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);params.gravity = Gravity.RIGHT;tem.setLayoutParams(params);BarrageView.this.addView(tem);//随机的设置弹幕文本的Y值,让它可以呈现散乱出现的效果tem.setY(random.nextInt(screenParams.getScreenHeight() / 4) + screenParams.getScreenHeight() / 3);//定义一个动画,让文本框开始移动ObjectAnimator animator = ObjectAnimator.ofFloat(tem, "translationX", 0, 0 - screenParams.getScreenWidth());animator.setDuration(2400);animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {//在动画结束的时候删除这个文本框BarrageView.this.removeView(tem);}});animator.start();handler.postDelayed(playRunnable, PLAY_DURATION);}};

下面是播放完毕隐藏这个组件的动画,让透明度渐变,视觉效果会好很多

ObjectAnimator animator = ObjectAnimator.ofFloat(BarrageView.this, "alpha", 1, 0);animator.setDuration(300);animator.setInterpolator(new DecelerateInterpolator());animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {BarrageView.this.setVisibility(GONE);}});animator.start();

到这这个Android下的弹幕控件就制作完成了,如果可以的话大家还可以自己修改成自己喜欢的动画,或者每一个弹幕都是图片+文字这样的实现,都很容易修改。谢谢大家~

下载地址(记得给我星哟):https://github.com/dayiming/BarrageView

Android下的弹幕的简单实现相关推荐

  1. Android下拉刷新SwipeRefreshLayout简单用法

    之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...

  2. 一个Android下ping的简单工具类

    这是一个自己写的Android下的ping的简单工具类,主要是通过ping获取到返回字符串之后截取信息得到自己想要的数据.不多说,上源码 import java.io.BufferedReader; ...

  3. android下拉刷新和上拉加载的一个简单库

    介绍一个android下拉刷新.上拉加载的库: https://github.com/chrisbanes/Android-PullToRefresh 使用方式,创建好一个Android项目,导入li ...

  4. android模拟打印机服务,Android下的POS打印机调用的简单实现

    本文基于GP58系列,它可以兼容ESC/POS指令集,对EPSON的打印机通用. Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可:设备未提供驱动,只能按照通用的方法进行调试.这 ...

  5. Android下实现数据绑定功能

    在编写Android应用的时候经常需要做的事情就是对View的数据进行设置,在Android下设置控件相对.net来说是件麻烦的事情,首先根据ID从view把控件找出来然后才能设置相应属性值:如果数据 ...

  6. Linux 下UVCamp;V4L2技术简单介绍(二)

    通过前文Linux 下UVC&V4L2技术简单介绍(一)我们了解了UVC和V4L2的简单知识. 这里是USB设备的文档描写叙述:http://www.usb.org/developers/do ...

  7. Android下拉刷新开源库对比(转)

    安卓下拉刷新开源库对比 作者:desmond1121 目前仅比对github上star数>1500的下拉刷新开源库,在比较完成之后可能会加入其它有代表性的库. Repo Repo Owner S ...

  8. Android 下 APK 捆绑器的实现

    Android 下 APK 捆绑器的实现                    作者: 海东青 利用捆绑器向正常程序捆绑病毒.木马等恶意程序,以达到隐蔽安装.运行的目的,这 在 Windows 平台下 ...

  9. 利用 CMake 和 NDK 交叉编译 Android 下的可执行程序

    为什么80%的码农都做不了架构师?>>>    之前开发 Android 下的二进制程序都是开个 jni 目录, 手写 Android.mk, 然后调用 ndk-build 生成可执 ...

最新文章

  1. pandas最大的时间间隔_pandas生成时间列表(某段连续时间或者固定间隔时间段)(示例代码)...
  2. zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南
  3. 机器学习(5.sklearn归一化以及标准化)
  4. oracle p l,使用P.A.L制作便携软件 (一) 基本原理 | 么么哒拥有者
  5. android资源透明背景,@谷歌android帝 这是你想要的,全局透明背景教程,两种方法...
  6. android view setleft,android – 在新textview上使用setLeft / setRight方法
  7. 【英语学习】【WOTD】wherewithal 释义/词源/示例
  8. 计算机二级晓云是企业人力,全国计算机二级Ms-Office精选真题试卷
  9. hash function/ hash table 背后的数学基础
  10. Hacking Diablo II之完整性检查(Integrity Scan)
  11. Onvif协议:什么是Onvif
  12. 转:施炜:铁军组织是怎样炼成的?高能组织=人×管理体系×数字标准
  13. C#正则表达式(来源:侧身向南边博客)
  14. 分数阶微积分学薛定宇电子版_薛定宇
  15. 在校园暴力中成长的孤僻少年,如何逆袭剑桥,成为一代科学大师
  16. 从菜鸟到大神之自动化测试(基础一)
  17. Unity学习笔记:Tilemap的基础使用【By Chutianbo】
  18. 阿里技术风险与效能部负责人张瓅玶:阿里集团深度用云实践
  19. matlab ts模糊工具箱,通过算例熟悉MATLAB模糊控制工具箱
  20. bzoj1613 贝茜的晨练计划

热门文章

  1. PHP 两个多维数组根据某个键的值进行组合排序的几种思路
  2. Java-JFrame窗体美化
  3. ping www.baidu.com时出现正在ping www.a.shifen.com
  4. c语言报告反思,c语言教学的反思.pdf
  5. iOS设备屏幕尺寸和适配
  6. word文档里四级目录无法显示
  7. Java基础知识(十) 多线程
  8. 2018年北京AQI全年走势图
  9. Office 文档在线预览解决方案
  10. 【opencv】selective_search函数