首先,效果图。分类似至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:简单的弹幕效果达到相关推荐

  1. android 如何实现弹幕,Android简单实现弹幕效果

    本文实例为大家分享了Android实现弹幕效果的具体代码,供大家参考,具体内容如下 首先分析一下,他是由三层布局来共同完成的,第一层视频布局,第二层字幕布局,第三层输入框布局,要想让这三个布局在同一页 ...

  2. Android直播中弹幕效果实现

    在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽.弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果. 从直观上,弹幕效果就是在一个ViewGroup上增加一些View, ...

  3. android 中的弹幕效果

    android 弹幕评论效果 分类: android2015-07-28 09:21 977人阅读 评论(0) 收藏 举报 android弹幕 纯粹按照自己的想法仿照b站的弹幕写的一个demo,不知道 ...

  4. android 弹幕动画,Android自制精彩弹幕效果

    好久没有写过文章,最近发现直播特别的火,很多app都集成了直播的功能,发现有些直播是带有弹幕的,效果还不错,今天心血来潮,特地写了篇制作弹幕的文章. 今天要实现的效果如下: 1.弹幕垂直方向固定 2. ...

  5. Android下的弹幕的简单实现

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

  6. android 循环弹幕,Android自定义View实现弹幕效果

    原标题:Android自定义View实现弹幕效果 在很多视频直播中都有弹幕功能,而安卓上没有简单好用的弹幕控件,本文介绍一个自定义弹幕view的demo. 效果图: 思路: 自定义Textitem类表 ...

  7. android实现弹幕功能,Android实现自定义的弹幕效果

    一.效果图 先来看看效果图吧~~ 二.实现原理方案 1.自定义ViewGroup-XCDanmuView,继承RelativeLayout来实现,当然也可以继承其他三大布局类哈 2.初始化若干个Tex ...

  8. Android弹幕功能实现,模仿斗鱼直播的弹幕效果

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/51933728 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  9. Android弹幕功能实现,模仿斗鱼直播的弹幕效果,跪了

    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_ ...

最新文章

  1. 四大运营商的5G部署路线一览
  2. linux dd 大文件下载,Linux dd+grep 大文件二分查找
  3. 全虚拟化与半虚拟化的实现方式
  4. 安徽工程大学计算机控制,(完整版)安徽工程大学期末考试《计算机控制技术》范围总结2 .pdf...
  5. .NET分布式框架 | Orleans 知多少
  6. IEDA中JavaDoc的自动生成、手动生成,以及生成html文档
  7. p=(1 r) 2c语言编程,菜鸟编程~!1.2
  8. sqlite和MySQL一些常用命令_sqlite3常用命令语法
  9. maven详解_本地仓库+远程仓库_体现maven用途
  10. 设置Iframe透明
  11. dell无法启动计算机,戴尔电脑装系统蓝屏无法启动怎么办
  12. Ubuntu18.04关闭内核自动更新
  13. Mat 无法解析dump文件:Dominator tree not available. Open the Dominator Tree or delete indices and parse aga
  14. VS 2010 测试功能学习(七) - RnP与Coded UI自动化测试
  15. 增大mysql修改表空间_扩充数据库表空间
  16. 牵线搭桥!让用户更高效地完成表单填写
  17. 大天使黎明服务器维护,37大天使之剑3月5日部分区服维护公告
  18. Gmail,google.com等谷歌英文网站被封解决办法
  19. wps word修改目录行间距后出现空行的现象,且删除按键无效
  20. python的Panda3D库如何安装使用以及用途

热门文章

  1. iOS Hacker 动态库 dylib 注入
  2. ADS错误(Fatal)L6002U解决方法
  3. html导航条置顶,jquery导航菜单栏固定悬浮顶部实现效果
  4. 不修改数组找出重复的数字
  5. ubuntu 18.04安装jdk8和eclipse
  6. nodejs如何实现ajax,nodejs使用静态服务器处理ajax
  7. CMake 进行调试
  8. Apache Maven 使用 profile 和 filtering 实现多种环境下的资源配置管理
  9. JNI字段描述符[Ljava/lang/String
  10. 笔记本用无线路由器上网设置教程攻略