给你的app加上炫酷特效——弹幕 Android 自定义控件-------弹幕

Android 自定义控件-------弹幕


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

Demo下载地址 https://download.csdn.net/download/liangyalong_1314/10432766

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangyalong_1314/article/details/80422192
文章标签:  自定义 view 弹幕 Android
个人分类:  自定义View
海参的功效,北京人不知道海参有这些功效!沈阳盛鼎 · 顶新

android开源弹幕库,强力推荐

2014年06月19日 1.62MB 下载

大型水上娱乐设施生产厂家广州绿智集团 · 顶新

Android弹幕效果实现

2016年10月16日 875KB 下载

个人资料

原创
5
粉丝
0
喜欢
0
评论
0
等级:
访问:
205
积分:
51
排名:
169万+

猜你喜欢

转载自blog.csdn.net/s2421458535/article/details/80538907