完全自定義控件-自定義絢麗水波紋效果

自定義絢麗水波紋效果

效果展示


效果展示

需求


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

實現(xiàn)思路


  1. 自定義類繼承View。
  2. 定義每個圓環(huán)的實體類 Wave,并初始化繪制圓環(huán)的畫筆的數(shù)據(jù)衩茸。
  3. 重寫onTouchEvent方法银亲,down時赡盘,獲得坐標(biāo)點(diǎn)讲仰,做為圓環(huán)圓心檐什。
  4. 發(fā)送handler信息牵祟,對數(shù)據(jù)進(jìn)行修改深夯,刷新頁面。
  5. 重寫onDraw方法课舍,繪制一個圓環(huán)塌西。

1. 自定義類繼承View


  • 新建WaterWaveView2類繼承View
public class WaterWaveView2 extends View {
 
    //存放圓環(huán)的集合
    private ArrayList<Wave> mList;
 
    //界面刷新
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            invalidate();//刷新界面,會執(zhí)行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的數(shù)據(jù)封裝成一個對象
*/
public class Wave {
    public float x;//圓心x坐標(biāo)
    public float y;//圓心y坐標(biāo)
    public Paint paint; //畫圓的畫筆
    public float width; //線條寬度
    public int radius; //圓的半徑
    public int ranNum;//隨機(jī)數(shù)
    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();
    }
    /**
     * 初始化數(shù)據(jù),每次點(diǎn)擊一次都要初始化一次
     */
    private void initData() {
        paint=new Paint();//因為點(diǎn)擊一次需要畫出不同的圓環(huán)
        paint.setAntiAlias(true);//打開抗鋸齒
        ranNum=(int) (Math.random()*6);//[0,5]的隨機(jī)數(shù)
        paint.setColor(randomColor[ranNum]);//設(shè)置畫筆的顏色
        paint.setStyle(Paint.Style.STROKE);//描邊
        paint.setStrokeWidth(width);//設(shè)置描邊寬度
        paint.setAlpha(255);//透明度的設(shè)置(0-255),0為完全透明
        radius=0;//初始化
        width=0;
    }
}

3. 重寫onTouchEvent方法


  • 獲得圓心他挎,并且刪除集合中透明度為0的圓環(huán),通知handler調(diào)用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;
    }
    //刪除透明度已經(jīng)為0的圓環(huán)
    private void deleteItem(){
        for (int i = 0; i <mList.size() ; i++) {
            if(mList.get(i).paint.getAlpha()==0){
                mList.remove(i);
            }
        }
    }
}

4. 重寫onDraw()方法捡需,循環(huán)繪制圓環(huán)

protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
 
        //避免程序一運(yùn)行就進(jìn)行繪制
        if (mList.size() > 0) {
 
            //對集合中的圓環(huán)對象循環(huán)繪制
            for (Wave wave : mList) {
                canvas.drawCircle(wave.x, wave.y, wave.radius, wave.paint);
                wave.radius += 3;
                //對畫筆透明度進(jìn)行操作
                int alpha = wave.paint.getAlpha();
                if (alpha < 80) {
                    alpha = 0;
                } else {
                    alpha -= 3;
                }
 
                //設(shè)置畫筆寬度和透明度
                wave.paint.setStrokeWidth(wave.radius / 8);
                wave.paint.setAlpha(alpha);
 
                //延遲刷新界面
                mHandler.sendEmptyMessageDelayed(1, 100);
            }
        }
    }

這里是項目地址办桨。

參考
http://blog.csdn.net/cyp331203/article/details/41209357
http://www.cnblogs.com/tangs/articles/5730470.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市站辉,隨后出現(xiàn)的幾起案子呢撞,更是在濱河造成了極大的恐慌,老刑警劉巖饰剥,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殊霞,死亡現(xiàn)場離奇詭異,居然都是意外死亡汰蓉,警方通過查閱死者的電腦和手機(jī)绷蹲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顾孽,“玉大人祝钢,你說我怎么就攤上這事∪艉瘢” “怎么了拦英?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長测秸。 經(jīng)常有香客問我疤估,道長,這世上最難降的妖魔是什么霎冯? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任铃拇,我火速辦了婚禮,結(jié)果婚禮上肃晚,老公的妹妹穿的比我還像新娘锚贱。我一直安慰自己,他們只是感情好关串,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布拧廊。 她就那樣靜靜地躺著,像睡著了一般晋修。 火紅的嫁衣襯著肌膚如雪吧碾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天墓卦,我揣著相機(jī)與錄音倦春,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛睁本,可吹牛的內(nèi)容都是我干的尿庐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼呢堰,長吁一口氣:“原來是場噩夢啊……” “哼抄瑟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枉疼,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤皮假,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骂维,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惹资,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年航闺,在試婚紗的時候發(fā)現(xiàn)自己被綠了褪测。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡来颤,死狀恐怖汰扭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情福铅,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布项阴,位于F島的核電站滑黔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏环揽。R本人自食惡果不足惜略荡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歉胶。 院中可真熱鬧汛兜,春花似錦、人聲如沸通今。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辫塌。三九已至漏策,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臼氨,已是汗流浹背掺喻。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人感耙。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓褂乍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親即硼。 傳聞我的和親對象是個殘疾皇子逃片,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 老夫為了今天是煞費(fèi)苦心啊,哈哈哈哈一直想模仿探探的一個雷達(dá)搜索效果(探探應(yīng)該用過吧谦絮,就是和陌陌類似的不可描述app...
    hongjay閱讀 2,418評論 1 28
  • 6题诵、View的繪制 (1)當(dāng)測量好一個View之后,我們就可以簡單的重寫 onDraw()方法层皱,并在 Canvas...
    b5e7a6386c84閱讀 1,890評論 0 3
  • 誰又紅暈初上性锭,此刻寒潮不拍岸 直指人心的鏡子 照見蠻荒宇宙 東風(fēng)緊西風(fēng)急 擦著寒光的雁翎又裹了一層霜 在某處一定有...
    千千雨閱讀 212評論 1 1
  • 昨日同事聚會玩游戲,真心話大冒險叫胖,一直全神貫注的我卻也有出錯的時候草冈。被問及到男友做的最浪漫的事兒。瓮增。怎棱。思索片刻,“...
    Memory舊城閱讀 268評論 0 1