最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View實現(xiàn)彈幕效果

 更新時間:2019年11月28日 09:44:32   作者:BrcLi  
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)彈幕效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在很多視頻直播中都有彈幕功能,而安卓上沒有簡單好用的彈幕控件,本文介紹一個自定義彈幕view的demo。

效果圖:

思路:

1、自定義Textitem類表示彈幕的信息
2、自定義view繼承view,使用ArrayList保存每條Textitem
3、隨機生成坐標(biāo)點繪制每條TextItem,不斷變換Text的橫坐標(biāo)實現(xiàn)彈幕的滾動

首先創(chuàng)建彈幕類,彈幕包括坐標(biāo),顏色,滾動速度,以及文字內(nèi)容:

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,彈幕橫坐標(biāo)不斷變換,需要實現(xiàn)定時刷新界面,重新繪制text。所以實現(xiàn)了Runable接口,在構(gòu)造方法中開啟線程,不斷循環(huán),每600毫秒刷新界面:

public class barrageview extends View implements Runnable{
 
 private List<Textitem> 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進行重繪。

由于只是實現(xiàn)demo,很多問題沒有考慮,存在問題:

彈幕離開屏幕后沒有進行清除,使得ArrayList不斷擴大,可以進行一個判斷,若Textitem的繪制區(qū)域不在屏幕內(nèi)則刪掉此item
彈幕若沒有交互需求,可以使用Surfaceview進行繪制,SurfaceView可以在子線程更新UI,多緩存機制也可以避免畫面跳動
另外注意下自定義View的構(gòu)造函數(shù)的調(diào)用時機:

public View(Context context)是在java代碼創(chuàng)建視圖直接通過new方法創(chuàng)建的時候被調(diào)用,
public View(Context context, Attributeset attrs)是在xml創(chuàng)建但是沒有指定style的時候被調(diào)用
public View(Context Context,AttributeSet attrs, int defStyle)給View提供一個基本的style,沒有對View設(shè)置屬性就使用style中的屬性

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實現(xiàn)接近傳感器

    Android實現(xiàn)接近傳感器

    這篇文章主要為大家詳細介紹了Android實現(xiàn)接近傳感器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Android使用表格布局設(shè)計注冊界面

    Android使用表格布局設(shè)計注冊界面

    這篇文章主要為大家詳細介紹了Android使用表格布局設(shè)計注冊界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android自定義View app更新動畫詳解

    Android自定義View app更新動畫詳解

    這篇文章給大家分享了Android自定義View app更新動畫的相關(guān)代碼以及知識點內(nèi)容,有興趣的朋友參考學(xué)習(xí)下。
    2018-07-07
  • Android、Flutter為不同的CPU架構(gòu)包打包APK(v7a、v8a、x86區(qū)別)

    Android、Flutter為不同的CPU架構(gòu)包打包APK(v7a、v8a、x86區(qū)別)

    默認情況下,Android和Flutter打包出來的Apk都是包含了所有架構(gòu)的,這樣打出來的apk體積相對于單架構(gòu)的apk有點大,這時,我們就需要分別打出不同的架構(gòu)包
    2023-08-08
  • Android生成二維碼工具類封裝及使用

    Android生成二維碼工具類封裝及使用

    最近公司業(yè)務(wù)上有個生成二維碼圖片的需求(Android端),之后筆者在網(wǎng)上查閱了一些資料,實現(xiàn)了這個功能,這篇文章主要給大家介紹了關(guān)于Android生成二維碼工具類封裝及使用的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Android利用Sensor實現(xiàn)傳感器功能

    Android利用Sensor實現(xiàn)傳感器功能

    這篇文章主要為大家詳細介紹了Android利用Sensor實現(xiàn)傳感器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Kotlin如何捕獲上下文中的變量與常量詳解

    Kotlin如何捕獲上下文中的變量與常量詳解

    這篇文章主要給大家介紹了關(guān)于Kotlin如何捕獲上下文中的變量與常量的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Kotlin具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Android編程入門之HelloWorld項目目錄結(jié)構(gòu)分析

    Android編程入門之HelloWorld項目目錄結(jié)構(gòu)分析

    這篇文章主要介紹了Android編程入門之HelloWorld項目目錄結(jié)構(gòu)分析,較為詳細的分析了Android項目的目錄結(jié)構(gòu)與具體作用,需要的朋友可以參考下
    2015-12-12
  • Android使用Intent發(fā)送短信的實現(xiàn)方法

    Android使用Intent發(fā)送短信的實現(xiàn)方法

    這篇文章主要介紹了Android使用Intent發(fā)送短信的實現(xiàn)方法,結(jié)合簡單實例形式分析了Android短信發(fā)送功能的實現(xiàn)技巧,需要的朋友可以參考下
    2016-07-07
  • Android Fragment的生命周期詳解

    Android Fragment的生命周期詳解

    本文主要講解Android Fragments的生命周期,這里整理了相關(guān)資料及對Fragment 的創(chuàng)建,有需要的小伙伴看下
    2016-09-09

最新評論

申扎县| 绍兴市| 辽宁省| 乐都县| 敦煌市| 咸阳市| 射洪县| 永福县| 贵德县| 湖州市| 南丹县| 西盟| 蒙阴县| 类乌齐县| 隆化县| 屯留县| 嵊州市| 神农架林区| 晴隆县| 乌鲁木齐市| 雅江县| 沙湾县| 哈巴河县| 大同市| 徐汇区| 通城县| 广宗县| 比如县| 鹿邑县| 翼城县| 延安市| 钦州市| 汾西县| 营山县| 西城区| 西乌珠穆沁旗| 沙坪坝区| 乌鲁木齐市| 噶尔县| 会昌县| 石景山区|