Android:简单的弹幕效果达到
首先,效果图。分类似至360检测到的骚扰电话页面:
布局非常easy,上面是一个RelativeLayout,以下一个Button.
功能:
(1)弹幕生成后自己主动从右側往左側滚动(TranslateAnimation)。弹幕消失后立马被移除。
(2)弹幕位置随机出现。而且不反复(防止文字重叠)。
(3)字体大小在一定范围内随机改变。字体颜色也能够设置。
(4)自己定义先减速,后加速的Interpolator,弹幕加速进入、减速停留、然后加速出去。
1.Activity代码:
/*** 简易弹幕效果实现* Created by admin on 15-6-4.*/
public class MainActivity extends ActionBarActivity {private MyHandler handler;//弹幕内容private TanmuBean tanmuBean;//放置弹幕内容的父组件private RelativeLayout containerVG;//父组件的高度private int validHeightSpace;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);containerVG = (RelativeLayout) findViewById(R.id.tanmu_container);tanmuBean = new TanmuBean();tanmuBean.setItems(new String[]{"測试一下", "弹幕这东西真不好做啊", "总是出现各种问题~~", "也不知道都是为什么?麻烦!", "哪位大神能够帮帮我啊?", "I need your help.","測试一下", "弹幕这东西真不好做啊", "总是出现各种问题~~", "也不知道都是为什么?麻烦!
", "哪位大神能够帮帮我啊?", "I need your help.", "測试一下", "弹幕这东西真不好做啊", "总是出现各种问题~~", "也不知道都是为什么?麻烦!
", "哪位大神能够帮帮我啊?", "I need your help."}); handler = new MyHandler(this); //開始弹幕 View startTanmuView = findViewById(R.id.startTanmu); startTanmuView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (containerVG.getChildCount() > 0) { return; } existMarginValues.clear(); new Thread(new CreateTanmuThread()).start(); } }); } //每2s自己主动加入一条弹幕 private class CreateTanmuThread implements Runnable { @Override public void run() { int N = tanmuBean.getItems().length; for (int i = 0; i < N; i++) { handler.obtainMessage(1, i, 0).sendToTarget(); SystemClock.sleep(2000); } } } //须要在主线城中加入组件 private static class MyHandler extends Handler { private WeakReference<MainActivity> ref; MyHandler(MainActivity ac) { ref = new WeakReference<>(ac); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { MainActivity ac = ref.get(); if (ac != null && ac.tanmuBean != null) { int index = msg.arg1; String content = ac.tanmuBean.getItems()[index]; float textSize = (float) (ac.tanmuBean.getMinTextSize() * (1 + Math.random() * ac.tanmuBean.getRange())); int textColor = ac.tanmuBean.getColor(); ac.showTanmu(content, textSize, textColor); } } } } private void showTanmu(String content, float textSize, int textColor) { final TextView textView = new TextView(this); textView.setTextSize(textSize); textView.setText(content); // textView.setSingleLine(); textView.setTextColor(textColor); int leftMargin = containerVG.getRight() - containerVG.getLeft() - containerVG.getPaddingLeft(); //计算本条弹幕的topMargin(随机值,可是与屏幕中已有的不反复) int verticalMargin = getRandomTopMargin(); textView.setTag(verticalMargin); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_TOP); params.topMargin = verticalMargin; textView.setLayoutParams(params); Animation anim = AnimationHelper.createTranslateAnim(this, leftMargin, -ScreenUtils.getScreenW(this)); anim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { //移除该组件 containerVG.removeView(textView); //移除占位 int verticalMargin = (int) textView.getTag(); existMarginValues.remove(verticalMargin); } @Override public void onAnimationRepeat(Animation animation) { } }); textView.startAnimation(anim); containerVG.addView(textView); } //记录当前仍在显示状态的弹幕的位置(避免反复) private Set<Integer> existMarginValues = new HashSet<>(); private int linesCount; private int getRandomTopMargin() { //计算用于弹幕显示的空间高度 if (validHeightSpace == 0) { validHeightSpace = containerVG.getBottom() - containerVG.getTop() - containerVG.getPaddingTop() - containerVG.getPaddingBottom(); } //计算可用的行数 if (linesCount == 0) { linesCount = validHeightSpace / ScreenUtils.dp2px(this, tanmuBean.getMinTextSize() * (1 + tanmuBean.getRange())); if (linesCount == 0) { throw new RuntimeException("Not enough space to show text."); } } //检查重叠 while (true) { int randomIndex = (int) (Math.random() * linesCount); int marginValue = randomIndex * (validHeightSpace / linesCount); if (!existMarginValues.contains(marginValue)) { existMarginValues.add(marginValue); return marginValue; } } } }
2.平移动画生成工具:
public class AnimationHelper {/*** 创建平移动画*/public static Animation createTranslateAnim(Context context, int fromX, int toX) {TranslateAnimation tlAnim = new TranslateAnimation(fromX, toX, 0, 0);//自己主动计算时间long duration = (long) (Math.abs(toX - fromX) * 1.0f / ScreenUtils.getScreenW(context) * 4000);tlAnim.setDuration(duration);tlAnim.setInterpolator(new DecelerateAccelerateInterpolator());tlAnim.setFillAfter(true);return tlAnim;}
}
ScreenUtils是用来获取屏幕宽高、dp与px之间互转的工具类。
3.自己定义的Interpolator。事实上仅仅有一行代码
public class DecelerateAccelerateInterpolator implements Interpolator {//input从0~1,返回值也从0~1.返回值的曲线表征速度加减趋势@Overridepublic float getInterpolation(float input) {return (float) (Math.tan((input * 2 - 1) / 4 * Math.PI)) / 2.0f + 0.5f;}
}
4.TanmuBean是一个实体类
public class TanmuBean {private String[] items;private int color;private int minTextSize;private float range;public TanmuBean() {//init default valuecolor = Color.parseColor("#eeeeee");minTextSize = 16;range = 0.5f;}public String[] getItems() {return items;}public void setItems(String[] items) {this.items = items;}public int getColor() {return color;}public void setColor(int color) {this.color = color;}/*** min textSize, in dp.*/public int getMinTextSize() {return minTextSize;}public void setMinTextSize(int minTextSize) {this.minTextSize = minTextSize;}public float getRange() {return range;}public void setRange(float range) {this.range = range;}
}
==========
源代码下载:http://download.csdn.net/detail/books1958/9005279
版权声明:本文博主原创文章,博客,未经同意不得转载。
转载于:https://www.cnblogs.com/yxwkf/p/4852550.html
Android:简单的弹幕效果达到相关推荐
- android 如何实现弹幕,Android简单实现弹幕效果
本文实例为大家分享了Android实现弹幕效果的具体代码,供大家参考,具体内容如下 首先分析一下,他是由三层布局来共同完成的,第一层视频布局,第二层字幕布局,第三层输入框布局,要想让这三个布局在同一页 ...
- Android直播中弹幕效果实现
在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽.弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果. 从直观上,弹幕效果就是在一个ViewGroup上增加一些View, ...
- android 中的弹幕效果
android 弹幕评论效果 分类: android2015-07-28 09:21 977人阅读 评论(0) 收藏 举报 android弹幕 纯粹按照自己的想法仿照b站的弹幕写的一个demo,不知道 ...
- android 弹幕动画,Android自制精彩弹幕效果
好久没有写过文章,最近发现直播特别的火,很多app都集成了直播的功能,发现有些直播是带有弹幕的,效果还不错,今天心血来潮,特地写了篇制作弹幕的文章. 今天要实现的效果如下: 1.弹幕垂直方向固定 2. ...
- Android下的弹幕的简单实现
Android下的弹幕的简单实现 简介 今天给大家带来一个前几天在做工程的时候写的一个有意思的Android弹幕实现,可以用来吐槽,介绍APP之类的~非常简单~几行代码~哈哈~下面是下载地址~ 下载地 ...
- android 循环弹幕,Android自定义View实现弹幕效果
原标题:Android自定义View实现弹幕效果 在很多视频直播中都有弹幕功能,而安卓上没有简单好用的弹幕控件,本文介绍一个自定义弹幕view的demo. 效果图: 思路: 自定义Textitem类表 ...
- android实现弹幕功能,Android实现自定义的弹幕效果
一.效果图 先来看看效果图吧~~ 二.实现原理方案 1.自定义ViewGroup-XCDanmuView,继承RelativeLayout来实现,当然也可以继承其他三大布局类哈 2.初始化若干个Tex ...
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/51933728 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...
- Android弹幕功能实现,模仿斗鱼直播的弹幕效果,跪了
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_ ...
最新文章
- 四大运营商的5G部署路线一览
- linux dd 大文件下载,Linux dd+grep 大文件二分查找
- 全虚拟化与半虚拟化的实现方式
- 安徽工程大学计算机控制,(完整版)安徽工程大学期末考试《计算机控制技术》范围总结2 .pdf...
- .NET分布式框架 | Orleans 知多少
- IEDA中JavaDoc的自动生成、手动生成,以及生成html文档
- p=(1 r) 2c语言编程,菜鸟编程~!1.2
- sqlite和MySQL一些常用命令_sqlite3常用命令语法
- maven详解_本地仓库+远程仓库_体现maven用途
- 设置Iframe透明
- dell无法启动计算机,戴尔电脑装系统蓝屏无法启动怎么办
- Ubuntu18.04关闭内核自动更新
- Mat 无法解析dump文件:Dominator tree not available. Open the Dominator Tree or delete indices and parse aga
- VS 2010 测试功能学习(七) - RnP与Coded UI自动化测试
- 增大mysql修改表空间_扩充数据库表空间
- 牵线搭桥!让用户更高效地完成表单填写
- 大天使黎明服务器维护,37大天使之剑3月5日部分区服维护公告
- Gmail,google.com等谷歌英文网站被封解决办法
- wps word修改目录行间距后出现空行的现象,且删除按键无效
- python的Panda3D库如何安装使用以及用途