全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android编程实现简易弹幕效果示例【附demo源码下载】

本文实例讲述了Android编程实现简易弹幕效果。分享给大家供大家参考,具体如下:

首先上效果图,类似于360检测到骚扰电话页面:

布局很简单,上面是一个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;
  @Override
  protected 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.返回值的曲线表征速度加减趋势
  @Override
  public 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 value
    color = 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;
  }
}

完整实例代码点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android视图View技巧总结》、《Android开发动画技巧汇总》、《Android编程之activity操作技巧总结》、《Android布局layout技巧总结》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


# Android  # 弹幕效果  # Android自定义View实现弹幕效果  # Android双重SurfaceView实现弹幕效果  # Android实现视频弹幕功能  # Android自制精彩弹幕效果  # Android EasyBarrage实现轻量级弹幕效果  # 很棒的Android弹幕效果实例  # Android 实现仿网络直播弹幕功能详解及实例  # Android实现炫酷的网络直播弹幕功能  # Android弹幕框架 黑暗火焰使基本使用方法  # Android仿斗鱼直播的弹幕效果  # Android实现自定义的弹幕效果  # 实例解析如何在Android应用中实现弹幕动画效果  # Android简单实现弹幕效果  # 弹幕  # 都是  # 也不  # 大神  # 真不  # 是一个  # 我啊  # 移除  # 测试一下  # 好做  # 自定义  # 返回值  # 进阶  # 操作技巧  # 相关内容  # 感兴趣  # 给大家  # 很简单  # 点击此处  # 在一 


相关文章: 北京网站制作的公司有哪些,北京白云观官方网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何通过山东自助建站平台快速注册域名?  个人网站制作流程图片大全,个人网站如何注销?  如何用腾讯建站主机快速创建免费网站?  ,石家庄四十八中学官网?  如何快速生成高效建站系统源代码?  如何在万网自助建站中设置域名及备案?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  全景视频制作网站有哪些,全景图怎么做成网页?  如何构建满足综合性能需求的优质建站方案?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  宝塔面板创建网站无法访问?如何快速排查修复?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  自助网站制作软件,个人如何自助建网站?  如何通过主机屋免费建站教程十分钟搭建网站?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  网站制作公司,橙子建站是合法的吗?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何用wdcp快速搭建高效网站?  如何通过远程VPS快速搭建个人网站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何破解联通资金短缺导致的基站建设难题?  PHP 500报错的快速解决方法  活动邀请函制作网站有哪些,活动邀请函文案?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何挑选优质建站一级代理提升网站排名?  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星与建站宝盒如何选择最佳方案?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  建站之星安装模板失败:服务器环境不兼容?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  电商网站制作价格怎么算,网上拍卖流程以及规则?  建站之星免费版是否永久可用?  如何选择高性价比服务器搭建个人网站?  网站制作员失业,怎样查看自己网站的注册者?  h5网站制作工具有哪些,h5页面制作工具有哪些?  Bpmn 2.0的XML文件怎么画流程图  如何在万网开始建站?分步指南解析  c# 在ASP.NET Core中管理和取消后台任务  企业网站制作公司网页,推荐几家专业的天津网站制作公司? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。