Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android實現自定義華麗的水波紋效果

Android實現自定義華麗的水波紋效果

編輯:關於Android編程

先來看看效果

實現效果

模擬水波紋的效果:點擊屏幕就有圓環出現,半徑從小到大,透明度從大到小(0為透明)

實現思路

      1.自定義類繼承View。

      2.定義每個圓環的實體類 Wave,並初始化繪制圓環的畫筆的數據。

      3.重寫onTouchEvent方法,down時,獲得坐標點,做為圓環圓心。

      4.發送handler信息,對數據進行修改,刷新頁面。

      5.重寫onDraw方法,繪制一個圓環。

1. 自定義類繼承View

新建WaterWaveView2類繼承View

public class WaterWaveView2 extends View {

  //存放圓環的集合
  private ArrayList<Wave> mList;

  //界面刷新
  private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      invalidate();//刷新界面,會執行onDraw方法
    }
  };

  public WaterWaveView2(Context context) {
    this(context, null);
  }

  public WaterWaveView2(Context context, AttributeSet attrs) {
    super(context, attrs);
    mList = new ArrayList<Wave>();
  }

2. 定義實體類 Wave

/**
* Created by HongJay on 2016/8/30.
* 把wave的數據封裝成一個對象
*/
public class Wave {
  public float x;//圓心x坐標
  public float y;//圓心y坐標
  public Paint paint; //畫圓的畫筆
  public float width; //線條寬度
  public int radius; //圓的半徑
  public int ranNum;//隨機數
  public int[] randomColor={Color.BLUE,Color.CYAN,
      Color.GREEN,Color.MAGENTA,Color.RED,Color.YELLOW};

  public Wave(float x, float y) {
    this.x = x;
    this.y = y;
    initData();
  }
  /**
   * 初始化數據,每次點擊一次都要初始化一次
   */
  private void initData() {
    paint=new Paint();//因為點擊一次需要畫出不同的圓環
    paint.setAntiAlias(true);//打開抗鋸齒
    ranNum=(int) (Math.random()*6);//[0,5]的隨機數
    paint.setColor(randomColor[ranNum]);//設置畫筆的顏色
    paint.setStyle(Paint.Style.STROKE);//描邊
    paint.setStrokeWidth(width);//設置描邊寬度
    paint.setAlpha(255);//透明度的設置(0-255),0為完全透明
    radius=0;//初始化
    width=0;
  }
}

3. 重寫onTouchEvent方法
獲得圓心,並且刪除集合中透明度為0的圓環,通知handler調用onDraw()方法

public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:

        float x = event.getX();
        float y = event.getY();
        deleteItem();
        Wave wave = new Wave(x, y);
        mList.add(wave);

        //刷新界面
        invalidate();
        break;

      case MotionEvent.ACTION_MOVE:
        float x1 = event.getX();
        float y1 = event.getY();
        deleteItem();
        Wave wave1 = new Wave(x1, y1);
        mList.add(wave1);

        invalidate();
        break;
    }
    //處理事件
    return true;
  }
  //刪除透明度已經為0的圓環
  private void deleteItem(){
    for (int i = 0; i <mList.size() ; i++) {
      if(mList.get(i).paint.getAlpha()==0){
        mList.remove(i);
      }
    }
  }
}

4. 重寫onDraw()方法,循環繪制圓環

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    //避免程序一運行就進行繪制
    if (mList.size() > 0) {

      //對集合中的圓環對象循環繪制
      for (Wave wave : mList) {
        canvas.drawCircle(wave.x, wave.y, wave.radius, wave.paint);
        wave.radius += 3;
        //對畫筆透明度進行操作
        int alpha = wave.paint.getAlpha();
        if (alpha < 80) {
          alpha = 0;
        } else {
          alpha -= 3;
        }

        //設置畫筆寬度和透明度
        wave.paint.setStrokeWidth(wave.radius / 8);
        wave.paint.setAlpha(alpha);

        //延遲刷新界面
        mHandler.sendEmptyMessageDelayed(1, 100);
      }
    }
  }

總結

以上就是Android實現自定義水波紋效果的全部內容,怎麼樣?實現的效果不錯吧,感興趣的小伙伴們快快自己動手實踐起來,希望這篇文章對大家的學習和工作能有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved