您的位置:首页 > 移动开发 > Android开发

Android安卓最简单的弹幕实现

2017-01-21 18:09 357 查看
Android安卓最简单的弹幕实现







其实所谓的弹幕实现,无疑就是动画的一种实现方式。这里我用的是

补间动画,补间动画里有一个 子类:

TranslaAnimation:位移变化的动画

明白用什么方式了,那接下来就是看代码了:

可以使者换下这几个属性。对比一下

/* TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画结束的点离当前View Y坐标上的差值*/
//动画类
public class SendDanmu {
private TranslateAnimation translateAnimation;
//我用的是TextView.这个看自己喜好。这里的boolean量是我用来实现两种弹幕特效
public SendDanmu(TextView textView, RelativeLayout relativeLayout,boolean isIn){
int length=relativeLayout.getBottom()-relativeLayout.getTop();      //获取relativelayout的长度

int y=relativeLayout.getTop()+(int)(Math.random()*length);       //设置弹幕随机产生的y坐标
if(isIn==false){
//天女散花型
translateAnimation=new TranslateAnimation(relativeLayout.getLeft(),relativeLayout.getRight(),
relativeLayout.getRight(),y);
}else{
//水平弹幕
translateAnimation=new TranslateAnimation(relativeLayout.getLeft(),relativeLayout.getRight(),
y-400,y-400);
}
translateAnimation.setDuration(3000);
textView.setAnimation(translateAnimation);
translateAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
translateAnimation.start();
}
}


接下来是Activity

public class DanMuActivity extends Activity implements View.OnClickListener {
private Button add, type, send;
private RelativeLayout root;
private Timer timer;
private EditText etadd;
boolean isIn = false, isStart = false;
int i = 0;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.danmu_main);
new SetTitle(this,2);
view();
}

public void view() {
root = (RelativeLayout) findViewById(R.id.danmu_root);
add = (Button) findViewById(R.id.danmu_add);
type = (Button) findViewById(R.id.danmu_type);
etadd = (EditText) findViewById(R.id.danmu_text);
send = (Button) findViewById(R.id.danmu_send);
send.setOnClickListener(this);
type.setOnClickListener(this);
add.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.danmu_add:
if (isStart == false) {
isrun();
isStart = true;
add.setText(R.string.danmu_pasue);
} else {
timer.cancel();
isStart = false;
add.setText(R.string.danmu_add);
root.removeAllViews();
}
break;
case R.id.danmu_type:
if (isIn == false) {
type.setText(R.string.danmu_x);
isIn = true;
} else {
type.setText(R.string.danmu_v);
isIn = false;
}
break;
case R.id.danmu_send:
if(!etadd.getText().toString().equals("")){
adddamu(true);
etadd.setText("");
}
break;
}
}

public void adddamu(boolean text) {
String[] str = {"你好啊,我可是多彩的弹幕", "hello boy,this is your word", "再见啦您嘞!!!",
"我的傻弟弟啊,你犯什么傻呢!", "这EDG咋了,不过依然很支持他们!", "666666,这操作我给满分", "我觉得这个比赛认真点会赢得"};
int[] color = {R.color.red, R.color.blue, R.color.white,R.color.yellow};

TextView tv = new TextView(this);
tv.setTextSize(20);
//是为了区别随机产生的和自己发送的弹幕
if (text == false) {
tv.setBackgroundResource(color[(int) (Math.random() * color.length)]);
tv.setText(str[(int) (Math.random() * str.length)]);
} else {
tv.setText(etadd.getText().toString());
tv.setBackgroundResource(R.drawable.button_bk);
}
root.addView(tv);
new SendDanmu(tv, root, isIn);
}
//使用计时器+handle持续产生弹幕。并清除界面产生的控件
public void isrun() {
timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
i++;
Message message = handler.obtainMessage();
handler.sendMessage(message);
}
};
timer.schedule(task, new Date(), 200);
}

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (i == 2) {
//清除产生的控件
root.removeAllViews();
i = 0;
}
adddamu(false);
super.handleMessage(msg);
}
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 动画