- 首頁
- 部落格
- 學院
- 下載下傳
- GitChat
- TinyMind
- 論壇
- 問答
- 商城
- VIP
- 活動
- 招聘
- ITeye
- CSTO
- 寫部落格
- 發Chat
liangyalong_1314的部落格
RSS訂閱 原
Android 自定義控件-------彈幕
置頂 2018年05月23日 16:51:19 閱讀數:39
Demo下載下傳位址 https://download.csdn.net/download/liangyalong_1314/10432766
話不多說先看效果圖
其實這一個控件,友善好用,可以用于視訊的彈幕,可以自定義彈幕樣式,自己學習備用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
- public class MYBarrageView extends RelativeLayout {
- private int mWidth;
- private int mScreenWidth;
- private List<View> mChildList;
- private boolean mIsWorking = false;
- private Context mContext;
- private int mMaxShowNum = 5;
- private int mRowNum = 3;
- private int[] mSpeeds = {
- 6000,6000,6000,6000
- };
- private int mDelayDuration = 1000;
- private int[] mBgResIds = {
- R.drawable.aaaa,
- R.drawable.aaaa,
- R.drawable.aaaa,
- R.drawable.aaaa
- };
- private int[] mRowPos = {
- 100,200,300,400
- };
- 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 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();
- }
- };
- public MYBarrageView(Context context) {
- this(context, null, 0);
- }
- public MYBarrageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public MYBarrageView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mContext = context;
- init();
- }
- public boolean isWorking(){
- return mIsWorking;
- }
- private void init() {
- mScreenWidth = getScreenWidth();
- mChildList = new ArrayList<>();
- mRandom = new Random();
- }
- public void setDirection(XCDirection direction){
- mDirection = direction;
- }
- int lastRow = 0;
- 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);
- }
- }
- 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);
- // final TextView textView = new TextView(mContext);
- 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];
- // lastRow = row;
- inflate.setLayoutParams(lp);
- inflate.setPadding(0, 2, 80, 2);
- this.addView(inflate);
- if(reset){
- mChildList.set(index,inflate);
- }else{
- mChildList.add(index,inflate);
- }
- }
- 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;
- }
- @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);
- 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;
- }
- }
- }
- 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);
- }
- MYBarrageView.this.startAnimation(animation);
- animation.setAnimationListener(new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- if(action == XCAction.HIDE){
- MYBarrageView.this.setVisibility(View.GONE);
- }else{
- MYBarrageView.this.setVisibility(View.VISIBLE);
- }
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- });
- }
- private int getScreenWidth(){
- WindowManager mWm = (WindowManager) this.getContext()
- .getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics dm = new DisplayMetrics();
- // 擷取螢幕資訊
- mWm.getDefaultDisplay().getMetrics(dm);
- return dm.widthPixels;
- }
- }
Demo下載下傳位址 https://download.csdn.net/download/liangyalong_1314/10432766
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/liangyalong_1314/article/details/80422192 文章标簽: 自定義 view 彈幕 Android 個人分類: 自定義View
Android彈幕架構 黑暗火焰使
笑談風雲,一語定乾坤。大家好,我是皖江。 今天我将分享由BiliBili開源的Android彈幕架構(DanmakuFlameMaster)的學習經驗。...
shirakawakanaki
2016-10-20 11:25:13
閱讀數:4340
Android彈幕功能實作,模仿鬥魚直播的彈幕效果
大家好,感覺好像已經很久沒更新部落格了。前段時間主要是忙于新書的事情,時間比較緊張。而現在新書已經完稿,剩下的事情就都是出版社的工作了,那麼我又可以抽出時間來寫寫部落格了。 記得之前有位朋友在我的公衆号...
sinyu890807
2016-10-18 08:01:32
閱讀數:62620
海參的功效,北京人不知道海參有這些功效!沈陽盛鼎 · 頂新
開源彈幕引擎·烈焰彈幕使(DanmakuFlameMaster)使用解析
簡介DanmakuFlameMaster 是 Android 上開源彈幕解析繪制引擎項目,也是 Android 上最好的開源彈幕引擎·烈焰彈幕。其架構清晰,簡單易用,支援多種高效率繪制方式選擇,支援多...
benhuo931115
2016-04-04 15:04:32
閱讀數:15682
Android 彈幕可用開源架構
1 黑暗火焰https://github.com/Bilibili/DanmakuFlameMaster2 開源元件https://github.com/linsea/OpenDanmaku...
qq_30519365
2017-06-23 10:51:31
閱讀數:312
Android項目中加入彈幕功能
大家好,最近的項目中需要實作彈幕的功能,于是乎就尋找了不少的材料,翻看了郭神寫的彈幕部落格,以及在github上查閱了哔哩哔哩開源的效果庫。整合寫了下有關彈幕的文章。 詳細的有關彈幕知識可以檢視:htt...
lou_liang
2017-12-12 00:00:17
閱讀數:313
android開源彈幕庫,強力推薦
2014年06月19日 1.62MB 下載下傳
大型水上娛樂設施生産廠家廣州綠智集團 · 頂新
Android端彈幕效果實作
2016年10月16日 875KB 下載下傳
Android開源彈幕引擎DanmakuFlameMaster源碼解析
最近項目中需要添加彈幕功能,就用了B站的開源架構DanmakuFlameMaster。本文從源碼分析了一下彈幕動起來的邏輯。...
LX_LE
2017-03-05 16:38:39
閱讀數:2001
android--------自定義彈幕控件(視訊彈幕操作)
彈幕功能在很多平台上都有,直播平台,視訊播放器,音樂等上面都有,直播平台發送彈幕和主播互動,那麼彈幕效果是怎麼實作的呢。案例主要是實作視訊出現彈幕,可以文字和表情彈幕,啟動和關閉彈幕,釋出彈幕。效果圖...
DickyQie
2018-03-01 11:11:09
閱讀數:144
Android自定義Dialog--DanmakuFlame彈幕發送框界面的實作
2017年09月26日 25.83MB 下載下傳
Android 自定義 彈幕控件
前一段時間在學自定義view,正想嘗試自己寫一個簡單的試一下,剛好看到阿曌姑娘寫的彈幕集效果(原址:http://blog.csdn.net/XieYupeng520/article/details/...
u012815217
2015-11-09 21:48:06
閱讀數:1312
安卓漫漫路之實作簡單的彈幕.
直播和看視訊中越來越火的控件---彈幕(Danmaku) 本文即介紹怎樣實作簡單的彈幕效果:咱們使用的是哔哩哔哩開源的彈幕效果庫 DanmakuFlameMaster. 必需:首先咱們在項目主工...
HighForehead
2017-02-17 21:03:14
閱讀數:2134
彈幕架構
彈幕架構DanmakuFlameMaster淺要分析
jt_ontheway
2017-11-21 16:50:23
閱讀數:529
安卓實時彈幕demo(一)彈幕效果
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 //2016/08/03/// /by XBW/// ...
qq_35114086
2016-09-17 12:48:34
閱讀數:525
Android彈幕效果實作
在B站或者其他視訊網站看視訊時候,常常會打開彈幕效果,邊看節目邊看大家的吐槽。彈幕效果看起來很有意思,今天我們就來實作一個簡單的彈幕效果。 直覺的看,彈幕效果就是在一個ViewGroup上增加一些V...
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的緩存,主要用到的...
shirakawakanaki
2016-10-12 14:13:35
閱讀數:461
【Android效果集】彈幕效果
之前在網上有看到過iOS的彈幕效果實作,搜了一下發現Android實作彈幕效果的文章比較少,而且寫得都不是很好了解,于是嘗試自己做了一下,寫成這篇部落格,分享出來。最終效果展示: 實作思路:1.自定義...
XieYupeng520
2015-11-02 23:42:10
閱讀數:15693
Android實作彈幕效果
相信大家看視訊的時候都會有彈幕效果,這似乎已經成為視訊軟體的标配,接下來讓我們來看看如何實作這個彈幕效果。 一.彈幕效果分析 我可以看到,彈幕效果是在螢幕上方飄過,...
m0_37136295
2017-05-18 15:44:11
閱讀數:1747
Android下的彈幕的簡單實作
Android下的彈幕的簡單實作簡介 今天給大家帶來一個前幾天在做工程的時候寫的一個有意思的Android彈幕實作,可以用來吐槽,介紹APP之類的~非常簡單~幾行代碼~哈哈~下面是下載下傳位址~下載下傳位址...
u013504718
2015-11-19 15:26:16
閱讀數:4354
個人資料
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
聯系我們
請掃描二維碼聯系客服
[email protected]
400-660-0108
QQ客服 客服論壇
關于招聘廣告服務 百度
©1999-2018 CSDN版權所有
京ICP證09002463号
經營性網站備案資訊
網絡110報警服務
中國網際網路舉報中心
北京網際網路違法和不良資訊舉報中心
- 收藏
- 評論
- 微信
- 微網誌
關閉