1. 程式人生 > >android實現波紋效果

android實現波紋效果


前幾天公司需要做錄音的波紋效果,原理很簡單:定義一個記錄所有同心圓半徑的list,只要動態改變list的size,然後遍歷之,並以每一個半徑繪製圓(drawCircle), 通過在onDraw方法裡面不停invalidate就可以了,程式碼如下:

package com.example.test.util;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

import com.example.test.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by jisj on 6/1/16.
 */
public class RecordView extends View {
    public RecordView(Context context) {
        this(context, null, 0);
    }

    public RecordView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RecordView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        init();
    }

    public void setIsWaving(boolean waving){
        isWaving = waving;
        postInvalidate();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(Color.parseColor("#ff6666"));
        paint.setAntiAlias(true);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(width = 600, height = 600);
        initOtherSize();
        initStartCircle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int count = radiusList.size();
        //先繪製波紋
        if(isWaving){
            for (int i = 0; i < count; i++) {
                int radius = radiusList.get(i);
                float alpha = alphaList.get(i);
                paint.setAlpha((int) alpha);
                canvas.drawCircle(width / 2, height / 2, radius, paint);
                //寬度遞增,透明度遞減,寬度到最大時,透明度正好為0,singleAlpha保證了最外層的圓消失時不會突兀
                if (alpha - singleAlpha >= 0)
                    alphaList.set(i, alpha - singleAlpha);
                if (radius + 1 < this.width / 2) {
                    radiusList.set(i, radius + 1);
                }
            }
        }

        //再繪製中間的圖片
        Drawable drawable = context.getResources().getDrawable(R.drawable.center_pic);
        drawable.setBounds((width - centerWidth) / 2, (height - centerWidth) / 2, (width + centerWidth) / 2, (height + centerWidth) / 2);
        drawable.draw(canvas);
        if(isWaving){
            //如果沒有達到最多的圓數,則加一個最內層的圓
            if (count <= MAX_CIRCLE_COUNT) {
                //這裡的width / (MAX_CIRCLE_COUNT * 7)是相鄰波紋的半徑差值
                if (radiusList.size() <= 0 || radiusList.get(radiusList.size() - 1) == centerWidth / 2 + width / (MAX_CIRCLE_COUNT * 7)) {
                    addInnerCircle();
                }
            }
            //去掉最外層的圓
            if (radiusList.size() > MAX_CIRCLE_COUNT) {
                radiusList.remove(0);
                alphaList.remove(0);
            }
            //執行onDraw的不斷迴圈
            postInvalidate();
        }
    }


    private void initStartCircle() {
        clearDataList(alphaList);
        clearDataList(radiusList);
        alphaList.add(ORIGIN_ALPHA);
        radiusList.add(startRadius);
    }

    private void initOtherSize() {
        centerWidth = (int) (width * 0.54f);
        //startRadius比centerWidth略小,是為了保證起始圓環出場時藏在中心圖片下面,不然會太突然
        startRadius = centerWidth / 2 - 30;
        //圓環每增加1個畫素,則透明度減低的值
        singleAlpha = ORIGIN_ALPHA / ((width / 2 - startRadius));
    }

    private void addInnerCircle() {
        alphaList.add(ORIGIN_ALPHA);
        radiusList.add(startRadius);
    }

    private void clearDataList(List list) {
        if (list.size() > 0)
            list.clear();
    }

    private ArrayList<Float> alphaList = new ArrayList<Float>();
    private ArrayList<Integer> radiusList = new ArrayList<Integer>();

    private int width, height;
    private float singleAlpha = 1;                      //圓環每增加1個畫素,則透明度減低的值
    private int centerWidth;                            //中間固定圖片的半徑
    private int startRadius;                            //起始圓環的半徑
    private boolean isWaving = false;
    private Paint paint;
    private Context context;

    private static final float ORIGIN_ALPHA = 150;      //最內層圓環的透明度
    private static final int MAX_CIRCLE_COUNT = 5;      //最多的圓環數量

}


程式碼中用到的圖片,是百度搜到的,如果有侵權。。。。。對不起啊大哥



相關推薦

android實現波紋效果

前幾天公司需要做錄音的波紋效果,原理很簡單:定義一個記錄所有同心圓半徑的list,只要動態改變list的size,然後遍歷之,並以每一個半徑繪製圓(drawCircle), 通過在onDraw方法裡面不停invalidate就可以了,程式碼如下: package c

android波紋效果實現

drawable color utf true odi lec .com enc orm 1.在drawable文件下,新建seletor,作為button的背景,這裏我用的是兩個圓角的shape <?xml version="1.0" encoding="utf-

Android波紋效果實現並且適配API21以下

前言 水波紋的點選效果還是很不錯的,使用起來也很簡單,但是在API21,Android5.0以下使用水波紋效果會直接崩潰,所以我們得考慮到適配 1、在res裡建立drawable-v21資料夾,在該資料夾下建立一個xml檔案 <!-- color_106是一個淺灰色的

Android波紋效果

今天翻看部落格,發現了水波紋效果。順便研究了一下 一,Touch Feedback(觸控反饋)  1,原始自帶效果 程式碼: <Button android:layout_width="wrap_content" an

Android 實現Ripple效果

這篇是網上程式碼整理。(小白只會改皮毛,核心程式碼網上拿來) 首先: public class RippleBackground extends RelativeLayout { private static final int DEFAULT

Android 實現映象效果

一、解析 —————————————————– 1、首先定義兩張圖片: Bitmap bm = BitmapFactory.decodeResource(getResources(), R.dra

Android實現動畫效果之淡入淡出

QQ群:372135639 View漸隱動畫效果 /** * View漸隱動畫效果 */ public void setHideAnimation( View view, int duration) {

Android自定義View——實現波紋效果類似剩余流量球

string 三個點 pre ber block span 初始化 move 理解 最近突然手癢就想搞個貝塞爾曲線做個水波紋效果玩玩,終於功夫不負有心人最後實現了想要的效果,一起來看下吧: 效果圖鎮樓 一:先一步一步來分解一下實現的過程 需要繪制一個正弦曲線(sin

Android 設定主題實現點選波紋效果

開頭先說說大家都知道的Material Design。 這裡推薦大苞米的系列部落格,介紹的很全面。 http://blog.csdn.net/a396901990/article/category/2634371     Material Design: &

Android 實現所有View的點選水波紋效果

點選水波紋效果,是安卓5.0以上的一個新特技。 一開始,我只會在普通的Button上新增這個效果。 利用新建主題的方法: <style name="MyButton" parent="Theme.AppCompat.Light"> <item n

Android實現波紋外擴效果

微信曾經推出了一個查詢附近好友的功能,大致功能是這樣的:螢幕上有一個按鈕,長按按鈕的時候,會有一圈圈水波紋的動畫向外擴散,鬆手後,動畫結束。 現在簡單來實現這樣的一個動畫功能: 思路: 主要用到了下面的藍色的圖片,定義三個ImageView,background都設定為藍色

android波紋漣漪效果實現 ---- 入門+初步提高

android水波紋漣漪效果的實現<入門+初步提高> 作為一個android開發著,水波紋效果是常見的效果,可以優化ui提高使用者的互動,在android5.0之前是不會自帶水波紋的,隨著material design的提出水波紋不僅僅被用於btn

Android 實現波紋效果

一、首先還是先上效果 二、實現原理      自定義view,使用Path和貝塞爾曲線繪製,然後不斷重新整理,並且改變X、Y的值     主要知識點rQuadTo的使用 三、實現 WaveView.java public class WaveView extends V

Android 自定義view實現波紋效果

今天主要分享水波紋效果:1.標準正餘弦水波紋;2.非標準圓形液柱水波紋;雖說都是水波紋,但兩者在實現上差異是比較大的,一個通過正餘弦函式模擬水波紋效果,另外一個會運用到影象的混合模式(PorterDuffXfermode);先看效果:                     

android 實現波紋效果(二) 優化篇

  在我的上一篇文章中,初步介紹了一下水波紋的實現,確實也實現了,剛開始我表示很滿意啊,但是後來看了一下系統的實現效果,我開始發現有點不對勁;來對比一下: 這是優化前的效果 這是優化後的效果   區別看不出來?仔細看一下,系統的實現效果是

Android自定義View實現波紋效果

本篇博文介紹一個Android自定義View的案例,後續博文會接下自定義View的相關流程和繪製原理。通過自定義控制元件實現。觸控式螢幕幕實現水波紋效果。實現步驟第1步.自定義MyWave繼承Viewpublic class MyWave extends View {}第2步

Android自定義View——實現波紋效果類似剩餘流量球

最近突然手癢就想搞個貝塞爾曲線做個水波紋效果玩玩,終於功夫不負有心人最後實現了想要的效果,一起來看下吧: 效果圖鎮樓 一:先一步一步來分解一下實現的過程 需要繪製一個正弦曲線(sin)或者餘弦曲線(cos) 通過水平平移曲線來的到像水

Android——實現漸變色水波紋效果原始碼

專案中使用到的效果,效果圖如下: 程式碼實現: public class WaveView extends View { private Paint mPaint, mCriclePaint, mTextPaint; // 傾斜或旋轉、快速變化,當在螢幕上

Android實現陰影效果

sta 技術 wid 語言 mat floating 大表 ado sch 在Android L推出後,Google提出了全新的設計語言:材質設計。其中很重要的一點就是陰影效果的使用,你可以為每一個View設置一個elevation值,相當於除了x、y之外的z值,z值決定

Android 按鍵按下實現陰影效果

nal turn view font .cn ges activity rda als final Button btn_gallery=(Button)findViewById(R.id.btn_gallery);btn_gallery.setOnClickListene