给你的app加上炫酷特效——弹幕
- 首页
- 博客
- 学院
- 下载
- GitChat
- TinyMind
- 论坛
- 问答
- 商城
- VIP
- 活动
- 招聘
- ITeye
- CSTO
- 写博客
- 发Chat
liangyalong_1314的博客
Android 自定义控件-------弹幕
Demo下载地址 https://download.csdn.net/download/liangyalong_1314/10432766
话不多说先看效果图
其实这一个控件,方便好用,可以用于视频的弹幕,可以自定义弹幕样式,自己学习备用View
控件内容配置就这么多 如何需要更换UI 可以修改 这个自定义控件
myBarrageView = ((MYBarrageView) findViewById(R.id.xcView)); String[] mStrItems = {"111111", "222222", "333333", "66666", "888888", "UZI牛逼", }; myBarrageView.initDanmuItemViews(mStrItems); myBarrageView.start();
获得过数据后 可以修改这个布局的UI效果,可以更换传输内容
点击事件 如果需要可以做下回调,不过我这个项目没有用到,可以自己写一个
public void createDanmuView(int index,String content,boolean reset){View inflate = inflate(mContext, R.layout.index_barrage_item, null); LinearLayout viewById = inflate.findViewById(R.id.beijing); TextView textname=inflate.findViewById(R.id.tv); int r = mRandom.nextInt(100) % mRowNum; viewById.setBackgroundResource(mBgResIds[r]); textname.setText(content); LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); int row = mRandom.nextInt(100) % mRowNum; while(row == lastRow){row = mRandom.nextInt(100)% mRowNum; }int pos = mRandom.nextInt(100)% mRowNum; lp.topMargin = row * mRowPos[pos]; inflate.setLayoutParams(lp); inflate.setPadding(0, 2, 80, 2); this.addView(inflate); if(reset){mChildList.set(index,inflate); }else{mChildList.add(index,inflate); }}
之后就是开启滚动的动画 带上代码
private Handler mHandler = new Handler() {@Override public void handleMessage(final Message msg) {super.handleMessage(msg); final int pos = msg.what; ViewPropertyAnimator animator; if(mDirection == XCDirection.FROM_RIGHT_TO_LEFT){animator = mChildList.get(msg.what).animate().translationXBy(-(mScreenWidth + mChildList.get(msg.what).getWidth())); }else{animator = mChildList.get(msg.what).animate().translationXBy(mScreenWidth + mChildList.get(msg.what).getWidth()); }Random random = new Random(System.currentTimeMillis()); int index = random.nextInt(100) % mSpeeds.length; animator.setDuration(mSpeeds[index]); animator.setInterpolator(new LinearInterpolator()); animator.setListener(new Animator.AnimatorListener() {@Override public void onAnimationStart(Animator animator) {}@Override public void onAnimationEnd(Animator animator) {MYBarrageView.this.removeView(mChildList.get(pos)); int index = mRandom.nextInt(100) % mStrContents.length; createDanmuView(pos, mStrContents[index], true); mHandler.sendEmptyMessageDelayed(pos, mDelayDuration); Log.v("czm", "size=" + mChildList.size()); }@Override public void onAnimationCancel(Animator animator) {}@Override public void onAnimationRepeat(Animator animator) {}}); animator.start(); } };
最后贴上全部代码
- public class MYBarrageView extends RelativeLayout {
- private int mWidth;
- private int mScreenWidth;
- private List<View> mChildList;
- private boolean mIsWorking = false;
- private Context mContext;
- private int mMaxShowNum = 5;
- private int mRowNum = 3;
- private int[] mSpeeds = {
- 6000,6000,6000,6000
- };
- private int mDelayDuration = 1000;
- private int[] mBgResIds = {
- R.drawable.aaaa,
- R.drawable.aaaa,
- R.drawable.aaaa,
- R.drawable.aaaa
- };
- private int[] mRowPos = {
- 100,200,300,400
- };
- private Random mRandom;
- private String[] mStrContents;
- public static enum XCDirection{
- FROM_RIGHT_TO_LEFT,
- FORM_LEFT_TO_RIGHT
- }
- public enum XCAction{
- SHOW,HIDE
- }
- private XCDirection mDirection = XCDirection.FROM_RIGHT_TO_LEFT;
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(final Message msg) {
- super.handleMessage(msg);
- final int pos = msg.what;
- ViewPropertyAnimator animator;
- if(mDirection == XCDirection.FROM_RIGHT_TO_LEFT){
- animator = mChildList.get(msg.what).animate()
- .translationXBy(-(mScreenWidth + mChildList.get(msg.what).getWidth()));
- }else{
- animator = mChildList.get(msg.what).animate()
- .translationXBy(mScreenWidth + mChildList.get(msg.what).getWidth());
- }
- Random random = new Random(System.currentTimeMillis());
- int index = random.nextInt(100) % mSpeeds.length;
- animator.setDuration(mSpeeds[index]);
- animator.setInterpolator(new LinearInterpolator());
- animator.setListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animator) {
- }
- @Override
- public void onAnimationEnd(Animator animator) {
- MYBarrageView.this.removeView(mChildList.get(pos));
- int index = mRandom.nextInt(100) % mStrContents.length;
- createDanmuView(pos, mStrContents[index], true);
- mHandler.sendEmptyMessageDelayed(pos, mDelayDuration);
- Log.v("czm", "size=" + mChildList.size());
- }
- @Override
- public void onAnimationCancel(Animator animator) {
- }
- @Override
- public void onAnimationRepeat(Animator animator) {
- }
- });
- animator.start();
- }
- };
- public MYBarrageView(Context context) {
- this(context, null, 0);
- }
- public MYBarrageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public MYBarrageView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mContext = context;
- init();
- }
- public boolean isWorking(){
- return mIsWorking;
- }
- private void init() {
- mScreenWidth = getScreenWidth();
- mChildList = new ArrayList<>();
- mRandom = new Random();
- }
- public void setDirection(XCDirection direction){
- mDirection = direction;
- }
- int lastRow = 0;
- public void initDanmuItemViews(String[] strContents){
- mStrContents = strContents;
- for(int i = 0; i < mMaxShowNum; i ++){
- int index = mRandom.nextInt(100) % strContents.length;
- createDanmuView(i,strContents[index],false);
- }
- }
- public void createDanmuView(int index,String content,boolean reset){
- View inflate = inflate(mContext, R.layout.index_barrage_item, null);
- LinearLayout viewById = inflate.findViewById(R.id.beijing);
- TextView textname=inflate.findViewById(R.id.tv);
- // final TextView textView = new TextView(mContext);
- int r = mRandom.nextInt(100) % mRowNum;
- viewById.setBackgroundResource(mBgResIds[r]);
- textname.setText(content);
- LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT);
- int row = mRandom.nextInt(100) % mRowNum;
- while(row == lastRow){
- row = mRandom.nextInt(100)% mRowNum;
- }
- int pos = mRandom.nextInt(100)% mRowNum;
- lp.topMargin = row * mRowPos[pos];
- // lastRow = row;
- inflate.setLayoutParams(lp);
- inflate.setPadding(0, 2, 80, 2);
- this.addView(inflate);
- if(reset){
- mChildList.set(index,inflate);
- }else{
- mChildList.add(index,inflate);
- }
- }
- boolean isFirst = true;
- public void start(){
- switchAnimation(XCAction.SHOW);
- if(isFirst){
- for(int i =0;i< mChildList.size();i++){
- mHandler.sendEmptyMessageDelayed(i,i * mDelayDuration);
- }
- isFirst = false;
- }
- mIsWorking = true;
- }
- public void hide(){
- switchAnimation(XCAction.HIDE);
- mIsWorking =false;
- }
- public void stop(){
- this.setVisibility(View.GONE);
- for(int i =0;i< mChildList.size();i++){
- mChildList.get(i).clearAnimation();
- mHandler.removeMessages(i);
- }
- mIsWorking =false;
- }
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- super.onLayout(changed, l, t, r, b);
- int childCount = this.getChildCount();
- for(int i=0;i<childCount;i++){
- View view = getChildAt(i);
- LayoutParams lp = (LayoutParams) view.getLayoutParams();
- if(lp.leftMargin <= 0){
- if(mDirection == XCDirection.FORM_LEFT_TO_RIGHT){
- view.layout(-view.getMeasuredWidth(), lp.topMargin,
- 0,lp.topMargin + view.getMeasuredHeight());
- }else{
- view.layout(mScreenWidth,lp.topMargin,mScreenWidth+view.getMeasuredWidth(),
- lp.topMargin+view.getMeasuredHeight());
- }
- }else{
- continue;
- }
- }
- }
- private void switchAnimation(final XCAction action){
- AlphaAnimation animation;
- if(action == XCAction.HIDE){
- animation = new AlphaAnimation(1.0f,0.0f);
- animation.setDuration(400);
- }else{
- animation = new AlphaAnimation(0.0f,1.0f);
- animation.setDuration(1000);
- }
- MYBarrageView.this.startAnimation(animation);
- animation.setAnimationListener(new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- if(action == XCAction.HIDE){
- MYBarrageView.this.setVisibility(View.GONE);
- }else{
- MYBarrageView.this.setVisibility(View.VISIBLE);
- }
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- });
- }
- private int getScreenWidth(){
- WindowManager mWm = (WindowManager) this.getContext()
- .getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics dm = new DisplayMetrics();
- // 获取屏幕信息
- mWm.getDefaultDisplay().getMetrics(dm);
- return dm.widthPixels;
- }
- }
Demo下载地址 https://download.csdn.net/download/liangyalong_1314/10432766
Android弹幕框架 黑暗火焰使
笑谈风云,一语定乾坤。大家好,我是皖江。 今天我将分享由BiliBili开源的Android弹幕框架(DanmakuFlameMaster)的学习经验。...
shirakawakanaki
2016-10-20 11:25:13
阅读数:4340
Android弹幕功能实现,模仿斗鱼直播的弹幕效果
大家好,感觉好像已经很久没更新博客了。前段时间主要是忙于新书的事情,时间比较紧张。而现在新书已经完稿,剩下的事情就都是出版社的工作了,那么我又可以抽出时间来写写博客了。 记得之前有位朋友在我的公众号...
sinyu890807
2016-10-18 08:01:32
阅读数:62620
开源弹幕引擎·烈焰弹幕使(DanmakuFlameMaster)使用解析
简介DanmakuFlameMaster 是 Android 上开源弹幕解析绘制引擎项目,也是 Android 上最好的开源弹幕引擎·烈焰弹幕。其架构清晰,简单易用,支持多种高效率绘制方式选择,支持多...
benhuo931115
2016-04-04 15:04:32
阅读数:15682
Android 弹幕可用开源框架
1 黑暗火焰https://github.com/Bilibili/DanmakuFlameMaster2 开源组件https://github.com/linsea/OpenDanmaku...
qq_30519365
2017-06-23 10:51:31
阅读数:312
Android项目中加入弹幕功能
大家好,最近的项目中需要实现弹幕的功能,于是乎就寻找了不少的材料,翻看了郭神写的弹幕博客,以及在github上查阅了哔哩哔哩开源的效果库。整合写了下有关弹幕的文章。 详细的有关弹幕知识可以查看:htt...
lou_liang
2017-12-12 00:00:17
阅读数:313
android开源弹幕库,强力推荐
2014年06月19日 1.62MB 下载
Android端弹幕效果实现
2016年10月16日 875KB 下载
Android开源弹幕引擎DanmakuFlameMaster源码解析
最近项目中需要添加弹幕功能,就用了B站的开源框架DanmakuFlameMaster。本文从源码分析了一下弹幕动起来的逻辑。...
LX_LE
2017-03-05 16:38:39
阅读数:2001
android--------自定义弹幕控件(视频弹幕操作)
弹幕功能在很多平台上都有,直播平台,视频播放器,音乐等上面都有,直播平台发送弹幕和主播互动,那么弹幕效果是怎么实现的呢。案例主要是实现视频出现弹幕,可以文字和表情弹幕,启动和关闭弹幕,发布弹幕。效果图...
DickyQie
2018-03-01 11:11:09
阅读数:144
Android自定义Dialog--DanmakuFlame弹幕发送框界面的实现
2017年09月26日 25.83MB 下载
Android 自定义 弹幕控件
前一段时间在学自定义view,正想尝试自己写一个简单的试一下,刚好看到阿曌姑娘写的弹幕集效果(原址:http://blog.csdn.net/XieYupeng520/article/details/...
u012815217
2015-11-09 21:48:06
阅读数:1312
安卓漫漫路之实现简单的弹幕.
直播和看视频中越来越火的控件---弹幕(Danmaku) 本文即介绍怎样实现简单的弹幕效果:咱们使用的是哔哩哔哩开源的弹幕效果库 DanmakuFlameMaster. 必需:首先咱们在项目主工...
HighForehead
2017-02-17 21:03:14
阅读数:2134
弹幕框架
弹幕框架DanmakuFlameMaster浅要分析
jt_ontheway
2017-11-21 16:50:23
阅读数:529
安卓实时弹幕demo(一)弹幕效果
版权声明:本文为博主原创文章,未经博主允许不得转载。 //2016/08/03/// /by XBW/// ...
qq_35114086
2016-09-17 12:48:34
阅读数:525
Android弹幕效果实现
在B站或者其他视频网站看视频时候,常常会打开弹幕效果,边看节目边看大家的吐槽。弹幕效果看起来很有意思,今天我们就来实现一个简单的弹幕效果。 直观的看,弹幕效果就是在一个ViewGroup上增加一些V...
goodlixueyong
2016-02-25 15:08:42
阅读数:11883
<em>android</em>下实现插件的<em>框架</em>
<em>android</em>开源<em>弹幕</em>库,强力推荐 立即下载 上传者: linbin_ 时间: 2014-06-19 综合评分: ...
下载
2018年05月04日 00:00
Android缓存框架 LruCache
笑谈风云,一语定乾坤。大家好,我是皖江。从今天开始,我将和大家一起分享我的Android框架学习经验之路。万丈高楼平地起,我就从小小的缓存策略开始学习吧。 简介:说起Android的缓存,主要用到的...
shirakawakanaki
2016-10-12 14:13:35
阅读数:461
【Android效果集】弹幕效果
之前在网上有看到过iOS的弹幕效果实现,搜了一下发现Android实现弹幕效果的帖子比较少,而且写得都不是很好理解,于是尝试自己做了一下,写成这篇博客,分享出来。最终效果展示: 实现思路:1.自定义...
XieYupeng520
2015-11-02 23:42:10
阅读数:15693
Android实现弹幕效果
相信大家看视频的时候都会有弹幕效果,这似乎已经成为视频软件的标配,接下来让我们来看看如何实现这个弹幕效果。 一.弹幕效果分析 我可以看到,弹幕效果是在屏幕上方飘过,...
m0_37136295
2017-05-18 15:44:11
阅读数:1747
Android下的弹幕的简单实现
Android下的弹幕的简单实现简介 今天给大家带来一个前几天在做工程的时候写的一个有意思的Android弹幕实现,可以用来吐槽,介绍APP之类的~非常简单~几行代码~哈哈~下面是下载地址~下载地址...
u013504718
2015-11-19 15:26:16
阅读数:4354
个人资料
Android丶龙
- 原创
- 5
- 粉丝
- 0
- 喜欢
- 0
- 评论
- 0
- 等级:
- 访问:
- 205
- 积分:
- 51
- 排名:
- 169万+
最新文章
- android studio 创建项目失败原因Failed to create
- android 自定义上圆角下直角的imageview控件
- Android 快速注释设置快捷键
- Android studio 虚拟机启动不了Staring AVD
个人分类
- 自定义View2篇
- android studio 安装技巧2篇
- BUG1篇
归档
- 2018年5月3篇
- 2018年4月2篇
热门文章
- Android studio 虚拟机启动不了Staring AVD
阅读量:110
- Android 快速注释设置快捷键
阅读量:45
- Android 自定义控件-------弹幕
阅读量:36
- android 自定义上圆角下直角的imageview控件
阅读量:7
- android studio 创建项目失败原因Failed to create
阅读量:5
联系我们
请扫描二维码联系客服
webmaster@csdn.net
400-660-0108
QQ客服 客服论坛
关于招聘广告服务 百度
©1999-2018 CSDN版权所有
京ICP证09002463号
经营性网站备案信息
网络110报警服务
中国互联网举报中心
北京互联网违法和不良信息举报中心
0
- 收藏
- 评论
- 微信
- 微博
给你的app加上炫酷特效——弹幕相关推荐
- 对一些常见的HTML5特效进行整理和运行(有趣特效,烟花特效,爱心特效,炫酷特效)
有趣特效 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en&quo ...
- 38.鼠标移动炫酷特效
效果 (源码网盘地址在最后) 视频演示 「前端编程实战 38」HTML+CSS3 实现鼠标移动炫酷特效 视频演示地址一:https://www.bilibili.com/video/BV1Xz411v ...
- 华为手机线刷工具_原来华为手机自带视频剪辑工具!简单操作几步,就能添加炫酷特效...
短视频是两年很火的社交手段之一,不管是在微博还是微信朋友圈了,很多朋友都喜欢使用视频来表达自己的动态. 有些朋友为了让自己的视频更加好看,就给视频添加字幕.音乐.动画等元素,但这些操作都要使用第三方工 ...
- ❤ 十一个拿来就能用的网页炫酷特效
❤ 十个拿来就能用的网页炫酷特效 效果如下: (1) 鼠标点击爱心 <!DOCTYPE html> <html lang="en"> <head> ...
- JS 炫酷特效敢超 Flash
千一网络收集的几十个超酷 JavaScript 特效,这些特效在网上有些也有发布,不过这个应该是最全的. JS 炫酷特效敢超 Flash-3D 特效演示 JS 炫酷特效敢超 Flash-阵列特效演示 ...
- H5炫酷特效系列4——炫酷粒子变化特效
这个示例虽然没有相对比较实用的特性,但是表现出来的效果确实非常震撼眼球.先上效果图,让各位同胞感受一下: 特效的表现感很强,有兴趣的读者可以仔细学习一下下面的代码,尝试着理解其中的逻辑. <!D ...
- android 天气动画,为app制作炫酷天气动画 – WeatherView
WeatherView 从1.1.0版本开始这个库使用了一个不同的setter结构. WeatherView是一个为app制作一个炫酷天气动画的Android库. Setup Android Stud ...
- php文字添加投影,视频加动态标题文字 视频标题文字添加阴影边框 给视频加上炫酷的文字标题...
开篇就来点个题:今天的教程内容就是视频添加文字标题,虽然都是给视频加文字标题但是今天的和往常有点不太一样呢!软件中不仅自带了许多炫酷的标题模板外,还可以对文字标题进行编辑,给标题添加动态效果,修改文字 ...
- ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》
本案例为一个 threejs 的特效网页,大小球体进行包裹,外球体为透明材质,但是进行了线框渲染,使其能够通过外球踢查看其内球体. 注:案例参考源于互联网,在此做代码解释,侵删 本案例除 ThreeJ ...
最新文章
- 【IntelliJ IDEA】导出可执行 JAR 包
- oenwrt 进不了bios_win7进不了bios原因及解决办法
- K3C官改固件更新frp客户端
- flash小黄油安卓_从Android 1到10 一起回顾伴随我们成长的安卓系统
- webpack性能优化
- Hongda -接小球游戏
- oppoa9处理器怎么样_oppo a9是什么处理器
- 一位尚德机构网课老师的一天:从容、热爱与“一键全连”
- Option3X 5G 全网部署(基于 IUV_5G 软件)
- photoshop中怎么绘制虚线
- python列表查找整数_Python:找出整数列表是否为coheren
- 宏定义和函数有何区别
- 蚁群算法解决多峰函数优化问题
- 使用API进行FTP文件上传和下载
- 我的世界java服务器地址ip_我的世界服务器地址大全
- 已知法向量 求投影_求点在平面上的投影点坐标
- 24/7专业家庭安全监控值得吗?
- Linux内核配置选项 参考(2)
- C语言中 char s[] 和 char* s 的区别
- 初入Android~系统化学习必备(转自http://bbs.weand.com/read-htm-tid-6142.html)