internal int GetMarginTop(DanmakuView view) { return(view.Danmaku.Mode switch { Danmaku.DanmaukuMode.Scroll => GetScrollY(view), Danmaku.DanmaukuMode.Top => GetTopY(view), Danmaku.DanmaukuMode.Bottom => GetBottomY(view), _ => - 1, });
/// <summary> /// 发送一条弹幕 /// </summary> public int Send(Danmaku danmaku) { if (DanmakuViewPool == null) { throw new ArgumentNullException("Danmaku view pool is null. Did you call init() first?"); } DanmakuView view = DanmakuViewPool.Get(); if (view == null) { MeVisual.Warn(TAG, "show: Too many danmaku, discard"); return(RESULT_FULL_POOL); } if (DanmakuContainer == null || DanmakuContainer.Get() == null) { MeVisual.Warn(TAG, "show: Root view is null."); return(RESULT_NULL_ROOT_VIEW); } view.SetDanmaku(danmaku); // 字体大小 int textSize = danmaku.Size; view.SetTextSize(ComplexUnitType.Px, textSize); // 字体颜色 try { var color = Color.ParseColor(danmaku.Color); view.SetTextColor(color); } catch { view.SetTextColor(Color.White); } // 计算弹幕距离顶部的位置 int marginTop = PositionCalculator.GetMarginTop(view); if (marginTop == -1) { // 屏幕放不下了 MeVisual.Debug(TAG, "send: screen is full, too many danmaku [" + danmaku + "]"); return(TOO_MANY_DANMAKU); } FrameLayout.LayoutParams p = (FrameLayout.LayoutParams)view.LayoutParameters; if (p == null) { p = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); } p.TopMargin = marginTop; view.LayoutParameters = p; view.SetMinHeight((int)(Config.LineHeight * 1.35)); view.Show(DanmakuContainer.Get(), GetDisplayDuration(danmaku)); return(RESULT_OK); }