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

Android實現粒子雨效果

 更新時間:2016年01月24日 13:02:34   作者:茶飲月  
這篇文章主要介紹了Android實現粒子雨效果的制作過程,粒子雨效果,主要用到繪畫線條和多線程,其中的抽象類設計方法值得學習,感興趣的小伙伴們可以參考一下

本文實例介紹了Android實現粒子雨效果的實現過程,分享給大家供大家參考,具體內容如下

先看看效果圖:

具體實現方法:

1.baseview主要是設定雨滴要實現的動作,只是先設定,也就是抽象方法,在子類中實現其方法
2.Rainitems封裝雨滴類
3.Rainitems對雨滴集合創(chuàng)建到面板中,顯示出來,具體實現就是在這個類中
一、baseview封裝類,子類繼承后實現方法即可

public abstract class BaseView extends View {

  private control thread;

  public BaseView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public BaseView(Context context) {
    super(context);
  }
  //封裝,構造畫面,子類繼承后需要重寫
  protected abstract void drawsub(Canvas canvas);
  //封裝移動方法,子類繼承后需要重寫
  protected abstract void move();
  //封裝的初始化方法
  protected abstract void init();
  @Override
  protected final void onDraw(Canvas canvas) {

    //啟動線程
    if (thread ==null) {
      thread = new control();
      thread.start();
    }else {
      drawsub(canvas);
    }
  }

  public class control extends Thread{
    @Override
    public void run() {
      init();
      while(true){
        move();
        //相當于刷新畫布
        postInvalidate();
        try {
          sleep(30);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }

}

二、Rainitem雨點類

public class RainItem {

  private int height;
  private int width;
  private float startX;
  private float startY;
  private float stopX;
  private float stopY;
  private float sizeX;
  private float sizeY;
  private float of = 0.5f;
  private Paint paint;
  private Random random = new Random();

  public RainItem(int height,int width) {
    this.height = height;
    this.width = width;
    init();
  }

  public void init() {

    //startx和y對應的分別是起止位置
    sizeX = 1 + random.nextInt(10);
    sizeY = 10 + random.nextInt(20);
    startX = random.nextInt(width);
    startY = random.nextInt(height);
    stopX = startX + sizeX;
    stopY = startY + sizeY;
    of = (float) (0.2 + random.nextFloat());
    paint = new Paint();
  }
  /**
   * 繪畫雨滴
   * @param canvas
   */
  public void draw(Canvas canvas) {
    paint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
    canvas.drawLine(startX, startY, stopX, stopY, paint);
  }
  /**
   * 雨滴的移動行為
   */
  public void movestep() {
    //size*of這個是用來控制速度,所謂的速度就是線條增加的速度
    startX += sizeX*of;
    stopX += sizeX*of;

    startY += sizeY*of;
    stopY += sizeY*of;
    //如果超出邊界則重新運行
    if (startY>height) {
      init();
    }
  }
}

三、Rainplay具體實現的類

public class Rainplay extends BaseView {

  List<RainItem> list = new ArrayList<RainItem>();
  //控制雨滴的數量
  private int num = 80;

  public Rainplay(Context context) {
    super(context);
  }

  public Rainplay(Context context, AttributeSet attrs) {
    super(context, attrs);
    //與xml鏈接起來
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RainView);
    num = ta.getInteger(R.styleable.RainView_rainnum,80);
    ta.recycle();
  }
  @Override
  protected void drawsub(Canvas canvas) {
    for (RainItem item : list) {
      item.draw(canvas);
    }
  }

  @Override
  protected void move() {
    for (RainItem item : list) {
      item.movestep();
    }
  }
  /**
   * 因為獲取長寬是放在layout之后才可以獲取,所以需要
   * 放在線程里面初始化
   */
  @Override
  protected void init() {
    for (int i = 0; i < num; i++) {
      RainItem item = new RainItem(getHeight(), getWidth());
      list.add(item);
    }    
  }

}

四、value與xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name = "RainView">
    <attr name="rainnum" format="integer"/>
   </declare-styleable>
</resources>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  xmlns:an="http://schemas.android.com/apk/res/com.niuli.Rain"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
   >
  <com.niuli.Rain.Rainplay 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff000000"
    an:rainnum = "100"/>
</FrameLayout>

希望本文所述對大家學習Android軟件編程有所幫助。

相關文章

  • 學習使用Material Design控件(二)使用DrawerLayout實現側滑菜單欄效果

    學習使用Material Design控件(二)使用DrawerLayout實現側滑菜單欄效果

    這篇文章主要為大家介紹了學習使用Material Design控件的詳細教程,使用DrawerLayout和NavigationView實現側滑菜單欄效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android應用中加入微信分享簡單方法

    Android應用中加入微信分享簡單方法

    這篇文章主要介紹了Android應用中加入微信分享簡單方法,本文用簡潔明快的步驟講解了加入微信分享的方法,需要的朋友可以參考下
    2015-05-05
  • ReactiveCocoa代碼實踐之-RAC網絡請求重構

    ReactiveCocoa代碼實踐之-RAC網絡請求重構

    這篇文章主要介紹了ReactiveCocoa代碼實踐之-RAC網絡請求重構 的相關資料,需要的朋友可以參考下
    2016-04-04
  • Android DownloadProvider 源碼詳解

    Android DownloadProvider 源碼詳解

    這篇文章主要介紹了Android DownloadProvider 源碼詳解的相關資料,需要的朋友可以參考下
    2016-11-11
  • Android studio實現兩個界面間的切換

    Android studio實現兩個界面間的切換

    這篇文章主要為大家詳細介紹了Android studio實現兩個界面間的切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android開發(fā)判斷一個app應用是否在運行的方法詳解

    Android開發(fā)判斷一個app應用是否在運行的方法詳解

    這篇文章主要介紹了Android開發(fā)判斷一個app應用是否在運行的方法,結合實例形式較為詳細的分析了Android判斷應用運行狀態(tài)的相關操作技巧與注意事項,需要的朋友可以參考下
    2017-11-11
  • Android入門教程之組件Activity的生命周期詳解

    Android入門教程之組件Activity的生命周期詳解

    Activity作為四大組件之一,出現的頻率相當高,基本上我們在android的各個地方都能看見它的蹤影,因此深入了解Activity,對于開發(fā)高質量應用程序是很有幫助的。今天我們就來詳細地聊聊Activity的生命周期,以便我們在以后的開發(fā)中能如魚得水
    2021-10-10
  • Android Studio使用教程(二):基本設置與運行

    Android Studio使用教程(二):基本設置與運行

    這篇文章主要介紹了Android Studio使用教程(二):基本設置與運行,本文講解了項目結構、偏好設置、常用功能介紹、創(chuàng)建模擬器等內容,需要的朋友可以參考下
    2015-05-05
  • Android入門之Service的使用詳解

    Android入門之Service的使用詳解

    我們的Android在啟動一些長事務時都會使用異步,很多初學者覺得這個異步就是一個異步線程+Handler而己。如果你這么想就錯了。這一切其實靠的正是Android里的Service。本文就來和大家聊聊Service的生命周期和使用,需要的可以參考一下
    2022-12-12
  • Android SurfaceView畫板操作

    Android SurfaceView畫板操作

    這篇文章主要為大家詳細介紹了Android SurfaceView畫板操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論

平塘县| 行唐县| 绥棱县| 济阳县| 巴彦淖尔市| 禄丰县| 红安县| 海林市| 永城市| 广安市| 开原市| 丰县| 信丰县| 台东市| 双城市| 新乐市| 喜德县| 嘉义县| 利川市| 仪征市| 扬州市| 长海县| 轮台县| 色达县| 邢台县| 沅江市| 巫山县| 固原市| 民县| 阿拉善左旗| 英吉沙县| 措美县| 东城区| 东丰县| 唐河县| 呼伦贝尔市| 平陆县| 长汀县| 佛冈县| 巫山县| 定远县|