Android的简易弹幕
16lz
2021-01-23
-----------------------------------------------------------------------------------------------------------------------------
一段时间没写Android了,有时间必须来敲一敲Android的代码才行,不然很快就忘光了.
发现AS的快捷键很多都忘记了. 敲了一份弹幕的Demo
-----------------------------------------------------------------------------------------------------------------------------
- 布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
- 主类: MainActivity
/** * @author ClamLaw * @time 2016/11/26 * @desc MainActivity */public class MainActivity extends AppCompatActivity { private EditText mText; private List mList = new ArrayList<>(); private DanMuView mDanMuView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView();//初始化 initData(); } private void initData() { String[] array = getResources().getStringArray(R.array.danmuList);//先获取部分数据 for (int i = 0; i < array.length; i++) { mList.add(array[i]); } mDanMuView.setData(mList);//向弹幕框添加数据 mDanMuView.startDanmu();//开始弹幕 } //初始化 private void initView() { mText = (EditText) findViewById(R.id.text); mDanMuView = (DanMuView) findViewById(R.id.danmu); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {//发送按钮 @Override public void onClick(View v) { //发送评论 String str = mText.getText().toString(); mDanMuView.insertDanmu(str); } }); }}
- 自定义弹幕显示框控件: DanMuView
/** * @author ClamLaw * @time 2016/11/26 19:01 * @desc 自定义弹幕的view */public class DanMuView extends RelativeLayout { private Context mContext; private View view; private RelativeLayout mContainerVG; private List mList; //父组件的高度 private int validHeightSpace; private Set existMarginValues = new HashSet<>(); private int lastMarginValue; ExecutorService executorService = Executors.newFixedThreadPool(1);//线程池 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 1: int index = msg.arg1; String data = mList.get(index); showDanmu(data); break; } } }; public DanMuView(Context context) { super(context); } public DanMuView(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; view = LayoutInflater.from(context).inflate(R.layout.danmu_view, null, false); mContainerVG = (RelativeLayout) view.findViewById(R.id.danmu); mContainerVG.setBackgroundDrawable(null); addView(view); } /** * 添加数据到弹幕中 * * @param list */ public void setData(List list) { this.mList = list; } /** * 用户发送评论弹幕 * * @param data */ public void insertDanmu(String data) { showDanmu(data);//显示弹幕 mList.add(data);//将弹幕信息添加到集合的第一位 startDanmu();//开始弹幕 } /** * 开始弹幕 */ public void startDanmu() { existMarginValues.clear(); executorService.execute(new Runnable() { @Override public void run() { for (int i =0 ;i= (count + 1) * 2) { int end = count * 2; String result = new String(b, 0, end, encoding); if (str.indexOf(result) == -1) { return new String(b, 0, end - 1, encoding) + "..."; } return result + "..."; } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return str; } //动画 public class AnimationHelper{ public AnimationHelper() { } //fromX 开始的位置 ,toX结束的位置 public Animation createTranslateAnim(Context context, int fromX, int toX){ TranslateAnimation translateAnimation = new TranslateAnimation(fromX, toX, 0, 0); int width = getScreenWidth((Activity)context);//获取屏幕的宽度 //自动计算时间 long duration = (long) (Math.abs(toX - fromX) * 1.0f / width * 6000); translateAnimation.setDuration(duration);//动画时间 // translateAnimation.setInterpolator(new DecelerateAccelerateInterpolator());//动画速率 translateAnimation.setFillAfter(true);//终止时停留最后一帧 return translateAnimation; } } public class DecelerateAccelerateInterpolator implements Interpolator { @Override public float getInterpolation(float input) { return (float) (Math.tan((input * 2 - 1) / 4 * Math.PI)) / 2.0f + 0.5f; } }}
- 弹幕容器布局:danmu_view.xml
<?xml version="1.0" encoding="utf-8"?>
- 弹幕子控件布局:item_danmu.xml
<?xml version="1.0" encoding="utf-8"?>
本Demo的源码下载链接 DanMuDemo.
-----------------------------------------------------------------------------------------------------------------------------
结束!
如有错误或不足之处,请大家指出,谢谢!
-----------------------------------------------------------------------------------------------------------------------------
更多相关文章
- Android ScrollView 内部控件 layout_margin失效的解决方法
- Android 控件的可见,不可见,隐藏的设置【已解决】
- 搜索栏+流式布局+数据库
- Android控件基本属性介绍
- 不使用布局文件,代码中自定义界面
- Android定义宽高比控件
- android的线性布局