广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现自定义的弹幕效果
  • 749
分享到

Android实现自定义的弹幕效果

自定义Android 2022-06-06 07:06:38 749人浏览 安东尼
摘要

一、效果图 先来看看效果图吧~~ 二、实现原理方案 1、自定义ViewGroup-XCDanmuView,继承RelativeLayout来实现,当然也可以继承其他三大布局类

一、效果图

先来看看效果图吧~~

二、实现原理方案

1、自定义

ViewGroup-XCDanmuView
,继承
RelativeLayout
来实现,当然也可以继承其他三大布局类哈

2、初始化若干个

TextView
(弹幕的
item View
,这里以
TextView 
为例,当然也可以其他了~),然后通过
addView
添加到自定义
View

3、通过

addView
添加到
XCDanmuView
中,位置在坐标,为了实现 从屏幕外移动进来的效果

我们还需要修改添加进来

TextView
的位置,以从右向左移动方向来说,
addView
后必须将该
TextView
的位置设置到右边的屏幕外

这样我们采用的方法,是在

onLayout()
方法中对
childView
进行
layout
重新布局设置位置

4、随机冲左侧或右侧出来弹幕

itemView
,移动采用属性动画来实现平移,从屏幕的一端移动到另一端,当动画结束后,就将

child从XCDanmuView
remove
掉。并重新
new 
一个弹幕
itemView 
,并
addView
XCDanmuView
中,并开始动画移动

5、本自定义弹幕

View
支持从左到右和从右到左两个方向,支持自定义设置屏幕弹幕最多显示个数。

三、自定义弹幕效果XCDanmuView的具体实现

1、初始化需要用到的数据变量


private int mWidth;
  private int mScreenWidth;
  private List<View> mChildList;
  private boolean mIsWorking = false;
  private Context mContext;
  private int mMaxShowNum = 15;
  private int mRowNum = 4;
  private int[] mSpeeds = {
      3000,4000,5000,6000
  };
  private int mDelayDuration = 500;
  private int[] mBgResIds = {
      R.drawable.bg_danmu0,
      R.drawable.bg_danmu1,
      R.drawable.bg_danmu2,
      R.drawable.bg_danmu3
  };
  private int[] mRowPos = {
      150,140,160,150
  };
  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 void init() {
  mScreenWidth = getScreenWidth();
  mChildList = new ArrayList<>();
  mRandom = new Random();
}

2、初始化若干个弹幕item view


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);
    }
  }

3、创建弹幕item view 并addView到XCDanmuView中


public void createDanmuView(int index,String content,boolean reset){
    final TextView textView = new TextView(mContext);
    textView.setTextColor(Color.WHITE);
    int r = mRandom.nextInt(100) % mRowNum;
    textView.setBackgroundResource(mBgResIds[r]);
    textView.setText(content +"_"+ (index+1));
    RelativeLayout.LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
        RelativeLayout.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;
    textView.setLayoutParams(lp);
    textView.setPadding(40, 2, 40, 2);
    this.addView(textView);
    if(reset){
      mChildList.set(index,textView);
    }else{
      mChildList.add(index,textView);
    }
    textView.setClickable(true);
    textView.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
        Toast toast = Toast.makeText(mContext, textView.getText(), Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP,0,50);
        toast.show();
      }
    });
  }

4、重新设置childView的初始位置到屏幕之外


@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);
      RelativeLayout.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;
      }
    }
  }

5、弹幕item view的移动效果


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) {
          XCDanmuView.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();
    }
  };

 6、开启弹幕效果和关闭弹幕效果以及对于的动画效果


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;
  }
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);
    }
    XCDanmuView.this.startAnimation(animation);
    animation.setAnimationListener(new Animation.AnimationListener() {
      @Override
      public void onAnimationStart(Animation animation) {
      }
      @Override
      public void onAnimationEnd(Animation animation) {
        if(action == XCAction.HIDE){
          XCDanmuView.this.setVisibility(View.GONE);
        }else{
          XCDanmuView.this.setVisibility(View.VISIBLE);
        }
      }
      @Override
      public void onAnimationRepeat(Animation animation) {
      }
    });
  }

四、如何使用该自定义侧滑View控件

使用该自定义View非常简单,控件默认效果从右向左,如果需要修改方向为从左到右,只需设置下方向即可


public class MainActivity extends Activity {
  private XCDanmuView mDanmuView;
  private List<View> mViewList;
  private String[] mStrItems = {
      "搜狗","百度",
      "腾讯","360",
      "阿里巴巴","搜狐",
      "网易","新浪",
      "搜狗-上网从搜狗开始","百度一下,你就知道",
      "必应搜索-有求必应","好搜-用好搜,特顺手",
      "Android-谷歌","iOS-苹果",
      "windows-微软","linux"
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initDanmuView();
    initListener();
  }
  private void initListener() {
    findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        if (mDanmuView.isWorking()) {
          mDanmuView.hide();
          ((Button) view).setText("开启弹幕");
        } else {
          mDanmuView.start();
          ((Button) view).setText("关闭弹幕");
        }
      }
    });
  }
  private void initDanmuView() {
    mDanmuView = (XCDanmuView)findViewById(R.id.danmu);
    mDanmuView.initDanmuItemViews(mStrItems);
  }
}

五、总结

以上就是在Android中实现自定义弹幕效果的全部内容个,希望本文的内容对大家开发Android的时候能有所帮助。如果有疑问可以留言交流。

您可能感兴趣的文章:Android自定义View实现弹幕效果Android双重SurfaceView实现弹幕效果Android实现视频弹幕功能Android自制精彩弹幕效果Android EasyBarrage实现轻量级弹幕效果Android编程实现简易弹幕效果示例【附demo源码下载】很棒的Android弹幕效果实例Android 实现仿网络直播弹幕功能详解及实例Android实现炫酷的网络直播弹幕功能Android弹幕框架 黑暗火焰使基本使用方法Android仿斗鱼直播的弹幕效果实例解析如何在Android应用中实现弹幕动画效果Android简单实现弹幕效果


--结束END--

本文标题: Android实现自定义的弹幕效果

本文链接: https://www.lsjlt.com/news/24236.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现自定义的弹幕效果
    一、效果图 先来看看效果图吧~~ 二、实现原理方案 1、自定义ViewGroup-XCDanmuView,继承RelativeLayout来实现,当然也可以继承其他三大布局类...
    99+
    2022-06-06
    自定义 Android
  • Android自定义scrollview实现回弹效果
    在ios手机上经常看到页面上下滑动回弹效果,安卓中没有原生控件支持,这里自己就去自定义一个scrollview实现回弹效果 1. 新建MyScrollView并继承ScrollVie...
    99+
    2022-11-13
  • Android自定义弹框Dialog效果
    本文实例为大家分享了Android自定义弹框Dialog效果的具体代码,供大家参考,具体内容如下 1.dialog_delete.xml <xml version=...
    99+
    2022-11-13
  • Android自定义View实现弹性小球效果
    照例先看效果图 自定义代码示例 public class BezierView extends View { Paint paint;//画笔 Path path;//...
    99+
    2022-06-06
    弹性 view Android
  • Android怎么自定义scrollview实现回弹效果
    本篇内容主要讲解“Android怎么自定义scrollview实现回弹效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么自定义scrollview实现回弹效果”吧! 新建MyS...
    99+
    2023-06-29
  • Android自定义弹出框dialog效果
    项目要用到弹出框,还要和苹果的样式一样(Android真是没地位),所以就自己定义了一个,不是很像(主要是没图),但是也还可以。废话不多说了,直接上代码先看布局文件<?xml version="1.0" encoding="u...
    99+
    2023-05-31
    android 弹出框 dialog
  • Android自定义弹窗提示效果
    本文实例为大家分享了Android 自定义弹窗提示的具体代码,供大家参考,具体内容如下 Java文件: private void showSetDeBugDialog() { ...
    99+
    2022-11-12
  • Android自制精彩弹幕效果
    好久没有写过文章,最近发现直播特别的火,很多app都集成了直播的功能,发现有些直播是带有弹幕的,效果还不错,今天心血来潮,特地写了篇制作弹幕的文章.今天要实现的效果如下:弹幕垂直方向固定弹幕垂直方向随机上面效果图中白色的背景就是弹幕本身,是...
    99+
    2023-05-30
    android 弹幕 roi
  • Android自定义View实现竖向滑动回弹效果
    本文实例为大家分享了Android自定义View实现滑动回弹的具体代码,供大家参考,具体内容如下 前言 Android 页面滑动的时候的回弹效果 一、关键代码 public clas...
    99+
    2022-11-13
  • Android怎么自定义弹框Dialog效果
    今天小编给大家分享一下Android怎么自定义弹框Dialog效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。具体效果如下...
    99+
    2023-06-30
  • WPF+SkiaSharp实现自绘弹幕效果
    SkiaSharp 自绘弹幕效果 框架使用.NET60; Visual Studio 2022; 项目使用 MIT 开源许可协议; 接着上一篇 WPF 弹幕 上期...
    99+
    2022-11-13
  • Android自定义ScrollView实现放大回弹效果实例代码
    1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下: 2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成...
    99+
    2022-06-06
    scrollview Android
  • ionic如何实现自定义弹框效果
    这篇文章给大家分享的是有关ionic如何实现自定义弹框效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。思路利用ionic自带的弹框$ionicPopup。隐藏头部和尾部,只保留...
    99+
    2022-10-19
  • Android Switch自定义实现IOS效果
    先看下效果图 自定义View public class Seniorswitch extends Switch { priva...
    99+
    2022-06-06
    switch IOS Android
  • 很棒的Android弹幕效果实例
    很多项目需要用到弹幕效果,尤其是在播放视频的时候需要一起显示别人发的弹幕,也包括自己的发的。 今天就试着写了一下这个效果。 思路就是将从右往左的动画效果,字体内容,字体大小,弹...
    99+
    2022-06-06
    Android
  • Android怎么自定义View实现竖向滑动回弹效果
    这篇文章主要介绍“Android怎么自定义View实现竖向滑动回弹效果”,在日常操作中,相信很多人在Android怎么自定义View实现竖向滑动回弹效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Andro...
    99+
    2023-06-30
  • AndroidFlutter实现弹幕效果
    目录前言通用弹幕实现方案ListView弹幕方案实现基本框架轮播滚动轮询算法点击事件前言 需求要点如下: 弹幕行数为3行,每条弹幕相互依靠但不存在重叠每条弹幕可交互点击跳转滚动速度恒...
    99+
    2022-11-13
  • 怎么使用Android Flutter实现弹幕效果
    本篇内容介绍了“怎么使用Android Flutter实现弹幕效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言需求要点如下:...
    99+
    2023-07-02
  • Android中自定义PopupWindow实现弹出框并带有动画效果
    使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow public class LostPopupWindow extends Popu...
    99+
    2022-06-06
    popupwindow 动画 Android
  • Flutter自定义弹窗Dialog效果
    本文实例为大家分享了Flutter自定义弹窗Dialog效果的具体代码,供大家参考,具体内容如下 主要是基于系统的dialog机制做一些使用限制和自定义UI的优化 核心代码: cl...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作