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

Android自定義View實現彈幕效果

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

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

效果圖:

思路:

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

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

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接口,在構造方法中開啟線程,不斷循環(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進行重繪。

由于只是實現demo,很多問題沒有考慮,存在問題:

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android實現接近傳感器

    Android實現接近傳感器

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

    Android使用表格布局設計注冊界面

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

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

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

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

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

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

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

    Android利用Sensor實現傳感器功能

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

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

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

    Android編程入門之HelloWorld項目目錄結構分析

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

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

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

    Android Fragment的生命周期詳解

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

最新評論

周口市| 绿春县| 体育| 杭锦旗| 天津市| 凌云县| 渑池县| 定安县| 定安县| 辽宁省| 忻州市| 富源县| 铅山县| 泽普县| 肇庆市| 纳雍县| 阿图什市| 曲水县| 耿马| 丰宁| 宁蒗| 陈巴尔虎旗| 沐川县| 吉安市| 汶川县| 浙江省| 广水市| 万州区| 石嘴山市| 田阳县| 铁力市| 福泉市| 边坝县| 镇康县| 鄂尔多斯市| 布拖县| 东兰县| 安溪县| 铁力市| 大邑县| 老河口市|