Android:简单的弹幕效果达到
首先,效果圖。分類似至360檢測到的騷擾電話頁面:
布局非常easy,上面是一個RelativeLayout,以下一個Button.
功能:
(1)彈幕生成后自己主動從右側(cè)往左側(cè)滾動(TranslateAnimation)。彈幕消失后立馬被移除。
(2)彈幕位置隨機出現(xiàn)。而且不反復(fù)(防止文字重疊)。
(3)字體大小在一定范圍內(nèi)隨機改變。字體顏色也能夠設(shè)置。
(4)自己定義先減速,后加速的Interpolator,彈幕加速進入、減速停留、然后加速出去。
1.Activity代碼:
/*** 簡易彈幕效果實現(xiàn)* Created by admin on 15-6-4.*/ public class MainActivity extends ActionBarActivity {private MyHandler handler;//彈幕內(nèi)容private TanmuBean tanmuBean;//放置彈幕內(nèi)容的父組件private RelativeLayout containerVG;//父組件的高度private int validHeightSpace;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);containerVG = (RelativeLayout) findViewById(R.id.tanmu_container);tanmuBean = new TanmuBean();tanmuBean.setItems(new String[]{"測試一下", "彈幕這東西真不好做啊", "總是出現(xiàn)各種問題~~", "也不知道都是為什么?麻煩!", "哪位大神能夠幫幫我啊?", "I need your help.","測試一下", "彈幕這東西真不好做啊", "總是出現(xiàn)各種問題~~", "也不知道都是為什么?麻煩!", "哪位大神能夠幫幫我啊?", "I need your help.", "測試一下", "彈幕這東西真不好做啊", "總是出現(xiàn)各種問題~~", "也不知道都是為什么?麻煩!
", "哪位大神能夠幫幫我啊?", "I need your help."}); handler = new MyHandler(this); //開始彈幕 View startTanmuView = findViewById(R.id.startTanmu); startTanmuView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (containerVG.getChildCount() > 0) { return; } existMarginValues.clear(); new Thread(new CreateTanmuThread()).start(); } }); } //每2s自己主動加入一條彈幕 private class CreateTanmuThread implements Runnable { @Override public void run() { int N = tanmuBean.getItems().length; for (int i = 0; i < N; i++) { handler.obtainMessage(1, i, 0).sendToTarget(); SystemClock.sleep(2000); } } } //須要在主線城中加入組件 private static class MyHandler extends Handler { private WeakReference<MainActivity> ref; MyHandler(MainActivity ac) { ref = new WeakReference<>(ac); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { MainActivity ac = ref.get(); if (ac != null && ac.tanmuBean != null) { int index = msg.arg1; String content = ac.tanmuBean.getItems()[index]; float textSize = (float) (ac.tanmuBean.getMinTextSize() * (1 + Math.random() * ac.tanmuBean.getRange())); int textColor = ac.tanmuBean.getColor(); ac.showTanmu(content, textSize, textColor); } } } } private void showTanmu(String content, float textSize, int textColor) { final TextView textView = new TextView(this); textView.setTextSize(textSize); textView.setText(content); // textView.setSingleLine(); textView.setTextColor(textColor); int leftMargin = containerVG.getRight() - containerVG.getLeft() - containerVG.getPaddingLeft(); //計算本條彈幕的topMargin(隨機值,可是與屏幕中已有的不反復(fù)) int verticalMargin = getRandomTopMargin(); textView.setTag(verticalMargin); LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_TOP); params.topMargin = verticalMargin; textView.setLayoutParams(params); Animation anim = AnimationHelper.createTranslateAnim(this, leftMargin, -ScreenUtils.getScreenW(this)); anim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { //移除該組件 containerVG.removeView(textView); //移除占位 int verticalMargin = (int) textView.getTag(); existMarginValues.remove(verticalMargin); } @Override public void onAnimationRepeat(Animation animation) { } }); textView.startAnimation(anim); containerVG.addView(textView); } //記錄當(dāng)前仍在顯示狀態(tài)的彈幕的位置(避免反復(fù)) private Set<Integer> existMarginValues = new HashSet<>(); private int linesCount; private int getRandomTopMargin() { //計算用于彈幕顯示的空間高度 if (validHeightSpace == 0) { validHeightSpace = containerVG.getBottom() - containerVG.getTop() - containerVG.getPaddingTop() - containerVG.getPaddingBottom(); } //計算可用的行數(shù) if (linesCount == 0) { linesCount = validHeightSpace / ScreenUtils.dp2px(this, tanmuBean.getMinTextSize() * (1 + tanmuBean.getRange())); if (linesCount == 0) { throw new RuntimeException("Not enough space to show text."); } } //檢查重疊 while (true) { int randomIndex = (int) (Math.random() * linesCount); int marginValue = randomIndex * (validHeightSpace / linesCount); if (!existMarginValues.contains(marginValue)) { existMarginValues.add(marginValue); return marginValue; } } } }
2.平移動畫生成工具: public class AnimationHelper {/*** 創(chuàng)建平移動畫*/public static Animation createTranslateAnim(Context context, int fromX, int toX) {TranslateAnimation tlAnim = new TranslateAnimation(fromX, toX, 0, 0);//自己主動計算時間long duration = (long) (Math.abs(toX - fromX) * 1.0f / ScreenUtils.getScreenW(context) * 4000);tlAnim.setDuration(duration);tlAnim.setInterpolator(new DecelerateAccelerateInterpolator());tlAnim.setFillAfter(true);return tlAnim;} }ScreenUtils是用來獲取屏幕寬高、dp與px之間互轉(zhuǎn)的工具類。
3.自己定義的Interpolator。事實上僅僅有一行代碼
public class DecelerateAccelerateInterpolator implements Interpolator {//input從0~1,返回值也從0~1.返回值的曲線表征速度加減趨勢@Overridepublic float getInterpolation(float input) {return (float) (Math.tan((input * 2 - 1) / 4 * Math.PI)) / 2.0f + 0.5f;} }4.TanmuBean是一個實體類 public class TanmuBean {private String[] items;private int color;private int minTextSize;private float range;public TanmuBean() {//init default valuecolor = Color.parseColor("#eeeeee");minTextSize = 16;range = 0.5f;}public String[] getItems() {return items;}public void setItems(String[] items) {this.items = items;}public int getColor() {return color;}public void setColor(int color) {this.color = color;}/*** min textSize, in dp.*/public int getMinTextSize() {return minTextSize;}public void setMinTextSize(int minTextSize) {this.minTextSize = minTextSize;}public float getRange() {return range;}public void setRange(float range) {this.range = range;} }==========
源代碼下載:http://download.csdn.net/detail/books1958/9005279?
版權(quán)聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/yxwkf/p/4852550.html
總結(jié)
以上是生活随笔為你收集整理的Android:简单的弹幕效果达到的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLL 的导入与导出
- 下一篇: kaliBT安装好之后无法上网或者无法获