Android安卓最简单的弹幕实现

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);
        }
    };
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auspicious5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值