Android中怎么通过自定义View实现弹幕效果
创始人
2024-12-24 05:41:50
0次

1、自定义Textitem类表示弹幕的信息2、自定义view继承view,使用ArrayList保存每条Textitem3、随机生成坐标点绘制每条TextItem,不断变换Text的横坐标实现弹幕的滚动

首先创建弹幕类,弹幕包括坐标,颜色,滚动速度,以及文字内容:

public class Textitem { private String content; private float fx; private float fy; private float perstep; private int textcolor;  public Textitem(String content,float fx,float fy,float perstep,int textcolor){  this.content = content;  this.fx = fx;  this.fy = fy;  this.perstep = perstep;  this.textcolor = textcolor; }  public String getContent(){  return content; }  public void setContent(String content){  this.content = content; }  public int getTextcolor(){  return textcolor; }  public void setTextcolor(int textcolor){  this.textcolor = textcolor; }  public float getFx(){   return fx; }  public void setFx(float fx){  this.fx = fx; }  public float getFy(){  return fy; }  public void setFy(float fy){  this.fy = fy; }  public float getPerstep(){  return perstep; }  public void setPerstep(){  fx -= perstep; }}

接下来自定义View,弹幕横坐标不断变换,需要实现定时刷新界面,重新绘制text。所以实现了Runable接口,在构造方法中开启线程,不断循环,每600毫秒刷新界面:

public class barrageview extends View implements Runnable{  private List items = new ArrayList<>(); Random random = new Random(); private Paint paint;  public barrageview(Context context) {  super(context);  initpaint();  new Thread(this).start(); }  public barrageview(Context context, AttributeSet attrs) {  super(context, attrs);  initpaint();  new Thread(this).start(); }  public barrageview(Context context, AttributeSet attrs, int defStyleAttr) {  super(context, attrs, defStyleAttr);  initpaint();  new Thread(this).start(); }   public void addTextitem(String content){  float x = random.nextFloat()*getWidth();  float y = Math.abs(random.nextFloat()*(getHeight()-50))+40;  float step = random.nextFloat()*50;  int r = random.nextInt(255);  int g = random.nextInt(255);  int b = random.nextInt(255);  Textitem item = new Textitem(content,x,y,step, Color.rgb(r,g,b));  items.add(item); }  public void initpaint(){  paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);  paint.setColor(Color.RED);  paint.setTextSize(30); }  @Override public void draw(Canvas canvas) {  super.draw(canvas);  for(Textitem item:items){   paint.setColor(item.getTextcolor());   canvas.drawText(item.getContent(),item.getFx(),item.getFy(),paint);  } }  @Override public void run() {  while(true){   try{    Thread.sleep(600);    for(Textitem item:items){     item.setPerstep();    }    postInvalidate();   } catch (InterruptedException e){    e.printStackTrace();   }  } }}

弹幕VIew就是不断从ArrayList中获取弹幕进行绘制,由于在其他线程进行刷新,所以使用postInvalidate进行重绘。

由于只是实现demo,很多问题没有考虑,存在问题:

弹幕离开屏幕后没有进行清除,使得ArrayList不断扩大,可以进行一个判断,若Textitem的绘制区域不在屏幕内则删掉此item弹幕若没有交互需求,可以使用Surfaceview进行绘制,SurfaceView可以在子线程更新UI,多缓存机制也可以避免画面跳动另外注意下自定义View的构造函数的调用时机:

public View(Context context)是在java代码创建视图直接通过new方法创建的时候被调用,public View(Context context, Attributeset attrs)是在xml创建但是没有指定style的时候被调用public View(Context Context,AttributeSet attrs, int defStyle)给View提供一个基本的style,没有对View设置属性就使用style中的属性

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...