天天看點

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

  • 首頁
  • 部落格
  • 學院
  • 下載下傳
  • GitChat
  • TinyMind
  • 論壇
  • 問答
  • 商城
  • VIP
  • 活動
  • 招聘
  • ITeye
  • CSTO
  • 寫部落格
  • 發Chat
  • 給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

liangyalong_1314的部落格

RSS訂閱 原

Android 自定義控件-------彈幕

置頂 2018年05月23日 16:51:19 閱讀數:39

Demo下載下傳位址 https://download.csdn.net/download/liangyalong_1314/10432766

話不多說先看效果圖

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

其實這一個控件,友善好用,可以用于視訊的彈幕,可以自定義彈幕樣式,自己學習備用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();
    }
};      

最後貼上全部代碼

[java]  view plain  copy

  1. public class MYBarrageView extends RelativeLayout {  
  2.     private int mWidth;  
  3.     private int mScreenWidth;  
  4.     private List<View> mChildList;  
  5.     private boolean mIsWorking = false;  
  6.     private Context mContext;  
  7.     private int mMaxShowNum = 5;  
  8.     private int mRowNum = 3;  
  9.     private int[] mSpeeds = {  
  10.             6000,6000,6000,6000  
  11.     };  
  12.     private int mDelayDuration = 1000;  
  13.     private int[] mBgResIds = {  
  14.             R.drawable.aaaa,  
  15.             R.drawable.aaaa,  
  16.             R.drawable.aaaa,  
  17.             R.drawable.aaaa  
  18.     };  
  19.     private int[] mRowPos = {  
  20.             100,200,300,400  
  21.     };  
  22.     private Random mRandom;  
  23.     private String[] mStrContents;  
  24.     public static enum XCDirection{  
  25.         FROM_RIGHT_TO_LEFT,  
  26.         FORM_LEFT_TO_RIGHT  
  27.     }  
  28.     public enum XCAction{  
  29.         SHOW,HIDE  
  30.     }  
  31.     private XCDirection mDirection = XCDirection.FROM_RIGHT_TO_LEFT;  
  32.     private Handler mHandler = new Handler() {  
  33.         @Override  
  34.         public void handleMessage(final Message msg) {  
  35.             super.handleMessage(msg);  
  36.             final int pos = msg.what;  
  37.             ViewPropertyAnimator animator;  
  38.             if(mDirection == XCDirection.FROM_RIGHT_TO_LEFT){  
  39.                 animator = mChildList.get(msg.what).animate()  
  40.                         .translationXBy(-(mScreenWidth + mChildList.get(msg.what).getWidth()));  
  41.             }else{  
  42.                 animator = mChildList.get(msg.what).animate()  
  43.                         .translationXBy(mScreenWidth + mChildList.get(msg.what).getWidth());  
  44.             }  
  45.             Random random = new Random(System.currentTimeMillis());  
  46.             int index = random.nextInt(100) % mSpeeds.length;  
  47.             animator.setDuration(mSpeeds[index]);  
  48.             animator.setInterpolator(new LinearInterpolator());  
  49.             animator.setListener(new Animator.AnimatorListener() {  
  50.                 @Override  
  51.                 public void onAnimationStart(Animator animator) {  
  52.                 }  
  53.                 @Override  
  54.                 public void onAnimationEnd(Animator animator) {  
  55.                     MYBarrageView.this.removeView(mChildList.get(pos));  
  56.                     int index = mRandom.nextInt(100) % mStrContents.length;  
  57.                     createDanmuView(pos, mStrContents[index], true);  
  58.                     mHandler.sendEmptyMessageDelayed(pos, mDelayDuration);  
  59.                     Log.v("czm", "size=" + mChildList.size());  
  60.                 }  
  61.                 @Override  
  62.                 public void onAnimationCancel(Animator animator) {  
  63.                 }  
  64.                 @Override  
  65.                 public void onAnimationRepeat(Animator animator) {  
  66.                 }  
  67.             });  
  68.             animator.start();  
  69.         }  
  70.     };  
  71.     public MYBarrageView(Context context) {  
  72.         this(context, null, 0);  
  73.     }  
  74.     public MYBarrageView(Context context, AttributeSet attrs) {  
  75.         this(context, attrs, 0);  
  76.     }  
  77.     public MYBarrageView(Context context, AttributeSet attrs, int defStyleAttr) {  
  78.         super(context, attrs, defStyleAttr);  
  79.         mContext = context;  
  80.         init();  
  81.     }  
  82.     public boolean isWorking(){  
  83.         return mIsWorking;  
  84.     }  
  85.     private void init() {  
  86.         mScreenWidth = getScreenWidth();  
  87.         mChildList = new ArrayList<>();  
  88.         mRandom = new Random();  
  89.     }  
  90.     public void setDirection(XCDirection direction){  
  91.         mDirection = direction;  
  92.     }  
  93.     int lastRow = 0;  
  94.     public void initDanmuItemViews(String[] strContents){  
  95.         mStrContents = strContents;  
  96.         for(int i = 0; i < mMaxShowNum; i ++){  
  97.             int index =  mRandom.nextInt(100) % strContents.length;  
  98.             createDanmuView(i,strContents[index],false);  
  99.         }  
  100.     }  
  101.     public void createDanmuView(int index,String content,boolean reset){  
  102.         View inflate = inflate(mContext, R.layout.index_barrage_item, null);  
  103.         LinearLayout viewById = inflate.findViewById(R.id.beijing);  
  104.         TextView textname=inflate.findViewById(R.id.tv);  
  105.         //        final TextView textView = new TextView(mContext);  
  106.         int r = mRandom.nextInt(100) % mRowNum;  
  107.         viewById.setBackgroundResource(mBgResIds[r]);  
  108.          textname.setText(content);  
  109.         LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,  
  110.                 LayoutParams.WRAP_CONTENT);  
  111.         int row = mRandom.nextInt(100) % mRowNum;  
  112.         while(row == lastRow){  
  113.             row = mRandom.nextInt(100)% mRowNum;  
  114.         }  
  115.         int pos = mRandom.nextInt(100)% mRowNum;  
  116.         lp.topMargin = row * mRowPos[pos];  
  117. //        lastRow = row;  
  118.         inflate.setLayoutParams(lp);  
  119.         inflate.setPadding(0, 2, 80, 2);  
  120.         this.addView(inflate);  
  121.         if(reset){  
  122.             mChildList.set(index,inflate);  
  123.         }else{  
  124.             mChildList.add(index,inflate);  
  125.         }  
  126.     }  
  127.     boolean isFirst = true;  
  128.     public void start(){  
  129.         switchAnimation(XCAction.SHOW);  
  130.         if(isFirst){  
  131.             for(int i =0;i< mChildList.size();i++){  
  132.                 mHandler.sendEmptyMessageDelayed(i,i * mDelayDuration);  
  133.             }  
  134.             isFirst = false;  
  135.         }  
  136.         mIsWorking = true;  
  137.     }  
  138.     public void hide(){  
  139.         switchAnimation(XCAction.HIDE);  
  140.         mIsWorking =false;  
  141.     }  
  142.     public void stop(){  
  143.         this.setVisibility(View.GONE);  
  144.         for(int i =0;i< mChildList.size();i++){  
  145.             mChildList.get(i).clearAnimation();  
  146.             mHandler.removeMessages(i);  
  147.         }  
  148.         mIsWorking =false;  
  149.     }  
  150.     @Override  
  151.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  152.         super.onLayout(changed, l, t, r, b);  
  153.         int childCount = this.getChildCount();  
  154.         for(int i=0;i<childCount;i++){  
  155.             View view = getChildAt(i);  
  156.             LayoutParams lp = (LayoutParams) view.getLayoutParams();  
  157.             if(lp.leftMargin <= 0){  
  158.                 if(mDirection == XCDirection.FORM_LEFT_TO_RIGHT){  
  159.                     view.layout(-view.getMeasuredWidth(), lp.topMargin,  
  160.                             0,lp.topMargin + view.getMeasuredHeight());  
  161.                 }else{  
  162.                     view.layout(mScreenWidth,lp.topMargin,mScreenWidth+view.getMeasuredWidth(),  
  163.                             lp.topMargin+view.getMeasuredHeight());  
  164.                 }  
  165.             }else{  
  166.                 continue;  
  167.             }  
  168.         }  
  169.     }  
  170.     private void switchAnimation(final XCAction action){  
  171.         AlphaAnimation animation;  
  172.         if(action == XCAction.HIDE){  
  173.             animation = new AlphaAnimation(1.0f,0.0f);  
  174.             animation.setDuration(400);  
  175.         }else{  
  176.             animation = new AlphaAnimation(0.0f,1.0f);  
  177.             animation.setDuration(1000);  
  178.         }  
  179.         MYBarrageView.this.startAnimation(animation);  
  180.         animation.setAnimationListener(new Animation.AnimationListener() {  
  181.             @Override  
  182.             public void onAnimationStart(Animation animation) {  
  183.             }  
  184.             @Override  
  185.             public void onAnimationEnd(Animation animation) {  
  186.                 if(action == XCAction.HIDE){  
  187.                     MYBarrageView.this.setVisibility(View.GONE);  
  188.                 }else{  
  189.                     MYBarrageView.this.setVisibility(View.VISIBLE);  
  190.                 }  
  191.             }  
  192.             @Override  
  193.             public void onAnimationRepeat(Animation animation) {  
  194.             }  
  195.         });  
  196.     }  
  197.     private int getScreenWidth(){  
  198.         WindowManager mWm = (WindowManager) this.getContext()  
  199.                 .getSystemService(Context.WINDOW_SERVICE);  
  200.         DisplayMetrics dm = new DisplayMetrics();  
  201.         // 擷取螢幕資訊  
  202.         mWm.getDefaultDisplay().getMetrics(dm);  
  203.        return dm.widthPixels;  
  204.     }  
  205. }  

Demo下載下傳位址 https://download.csdn.net/download/liangyalong_1314/10432766

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/liangyalong_1314/article/details/80422192 文章标簽:  自定義 view 彈幕 Android 個人分類:  自定義View

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

Android彈幕架構 黑暗火焰使

笑談風雲,一語定乾坤。大家好,我是皖江。 今天我将分享由BiliBili開源的Android彈幕架構(DanmakuFlameMaster)的學習經驗。...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 shirakawakanaki

2016-10-20 11:25:13

閱讀數:4340

Android彈幕功能實作,模仿鬥魚直播的彈幕效果

大家好,感覺好像已經很久沒更新部落格了。前段時間主要是忙于新書的事情,時間比較緊張。而現在新書已經完稿,剩下的事情就都是出版社的工作了,那麼我又可以抽出時間來寫寫部落格了。 記得之前有位朋友在我的公衆号...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 sinyu890807

2016-10-18 08:01:32

閱讀數:62620

海參的功效,北京人不知道海參有這些功效!沈陽盛鼎 · 頂新

開源彈幕引擎·烈焰彈幕使(DanmakuFlameMaster)使用解析

簡介DanmakuFlameMaster 是 Android 上開源彈幕解析繪制引擎項目,也是 Android 上最好的開源彈幕引擎·烈焰彈幕。其架構清晰,簡單易用,支援多種高效率繪制方式選擇,支援多...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 benhuo931115

2016-04-04 15:04:32

閱讀數:15682

Android 彈幕可用開源架構

1 黑暗火焰https://github.com/Bilibili/DanmakuFlameMaster2 開源元件https://github.com/linsea/OpenDanmaku...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 qq_30519365

2017-06-23 10:51:31

閱讀數:312

Android項目中加入彈幕功能

大家好,最近的項目中需要實作彈幕的功能,于是乎就尋找了不少的材料,翻看了郭神寫的彈幕部落格,以及在github上查閱了哔哩哔哩開源的效果庫。整合寫了下有關彈幕的文章。 詳細的有關彈幕知識可以檢視:htt...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 lou_liang

2017-12-12 00:00:17

閱讀數:313

android開源彈幕庫,強力推薦

2014年06月19日 1.62MB 下載下傳

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

大型水上娛樂設施生産廠家廣州綠智集團 · 頂新

Android端彈幕效果實作

2016年10月16日 875KB 下載下傳

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

Android開源彈幕引擎DanmakuFlameMaster源碼解析

最近項目中需要添加彈幕功能,就用了B站的開源架構DanmakuFlameMaster。本文從源碼分析了一下彈幕動起來的邏輯。...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 LX_LE

2017-03-05 16:38:39

閱讀數:2001

android--------自定義彈幕控件(視訊彈幕操作)

彈幕功能在很多平台上都有,直播平台,視訊播放器,音樂等上面都有,直播平台發送彈幕和主播互動,那麼彈幕效果是怎麼實作的呢。案例主要是實作視訊出現彈幕,可以文字和表情彈幕,啟動和關閉彈幕,釋出彈幕。效果圖...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 DickyQie

2018-03-01 11:11:09

閱讀數:144

Android自定義Dialog--DanmakuFlame彈幕發送框界面的實作

2017年09月26日 25.83MB 下載下傳

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

Android 自定義 彈幕控件

前一段時間在學自定義view,正想嘗試自己寫一個簡單的試一下,剛好看到阿曌姑娘寫的彈幕集效果(原址:http://blog.csdn.net/XieYupeng520/article/details/...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 u012815217

2015-11-09 21:48:06

閱讀數:1312

安卓漫漫路之實作簡單的彈幕.

直播和看視訊中越來越火的控件---彈幕(Danmaku) 本文即介紹怎樣實作簡單的彈幕效果:咱們使用的是哔哩哔哩開源的彈幕效果庫 DanmakuFlameMaster. 必需:首先咱們在項目主工...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 HighForehead

2017-02-17 21:03:14

閱讀數:2134

彈幕架構

彈幕架構DanmakuFlameMaster淺要分析

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 jt_ontheway

2017-11-21 16:50:23

閱讀數:529

安卓實時彈幕demo(一)彈幕效果

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 //2016/08/03/// /by  XBW/// ...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 qq_35114086

2016-09-17 12:48:34

閱讀數:525

Android彈幕效果實作

在B站或者其他視訊網站看視訊時候,常常會打開彈幕效果,邊看節目邊看大家的吐槽。彈幕效果看起來很有意思,今天我們就來實作一個簡單的彈幕效果。 直覺的看,彈幕效果就是在一個ViewGroup上增加一些V...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 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的緩存,主要用到的...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 shirakawakanaki

2016-10-12 14:13:35

閱讀數:461

【Android效果集】彈幕效果

之前在網上有看到過iOS的彈幕效果實作,搜了一下發現Android實作彈幕效果的文章比較少,而且寫得都不是很好了解,于是嘗試自己做了一下,寫成這篇部落格,分享出來。最終效果展示: 實作思路:1.自定義...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 XieYupeng520

2015-11-02 23:42:10

閱讀數:15693

Android實作彈幕效果

相信大家看視訊的時候都會有彈幕效果,這似乎已經成為視訊軟體的标配,接下來讓我們來看看如何實作這個彈幕效果。 一.彈幕效果分析 我可以看到,彈幕效果是在螢幕上方飄過,...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 m0_37136295

2017-05-18 15:44:11

閱讀數:1747

Android下的彈幕的簡單實作

Android下的彈幕的簡單實作簡介 今天給大家帶來一個前幾天在做工程的時候寫的一個有意思的Android彈幕實作,可以用來吐槽,介紹APP之類的~非常簡單~幾行代碼~哈哈~下面是下載下傳位址~下載下傳位址...

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

 u013504718

2015-11-19 15:26:16

閱讀數:4354

個人資料

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

Android丶龍

關注

原創
5
粉絲
喜歡
評論
等級:
通路:
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

聯系我們

給你的app加上炫酷特效——彈幕Android 自定義控件-------彈幕

請掃描二維碼聯系客服

[email protected]

400-660-0108

QQ客服 客服論壇

關于招聘廣告服務  百度

©1999-2018 CSDN版權所有

京ICP證09002463号

經營性網站備案資訊

網絡110報警服務

中國網際網路舉報中心

北京網際網路違法和不良資訊舉報中心

  • 收藏
  • 評論
  • 微信
  • 微網誌
  • QQ

關閉