1. 程式人生 > >Android 水波紋擴散效果

Android 水波紋擴散效果

1.效果圖:

2.使用方法:

  1. 在xml裡使用RippleImageView自定義控制元件:

    xmlns:app="http://schemas.android.com/apk/res-auto"
    
    <com.army.rippleimage.RippleImageView
        android:id="@+id/rippleImageView"
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:background="#37B158"
        app:show_spacing_time="800"//動畫播放間隔時間
        app:imageViewWidth="35dp"//圖片的大小
        app:imageViewHeigth="35dp"
        android:layout_centerHorizontal="true">
    </com.army.rippleimage.RippleImageView>
    
  2. 在Activity中的使用:

    rippleImageView=(RippleImageView)findViewById(R.id.rippleImageView);
    //開始動畫
    rippleImageView.startWaveAnimation();
    
    //停止動畫
    rippleImageView.stopWaveAnimation();
    

3.如何將自定義控制元件引入到專案:

  1. 拷貝自定義控制元件RippleImageView

    /**
     * Description :
     * Author : liujun
     * Email  : [email protected]
     */
    public class RippleImageView extends RelativeLayout {
        private static final int SHOW_SPACING_TIME=700;
        private static final int MSG_WAVE2_ANIMATION = 1;
        private static final int MSG_WAVE3_ANIMATION = 2;
        private static final int IMAMGEVIEW_SIZE = 80;
        /**三張波紋圖片*/
        private static final int SIZE =3 ;
    
        /**動畫預設迴圈播放時間*/
        private  int show_spacing_time=SHOW_SPACING_TIME;
        /**初始化動畫集*/
        private AnimationSet [] mAnimationSet=new AnimationSet[SIZE];
        /**水波紋圖片*/
        private ImageView [] imgs=new ImageView[SIZE];
        /**背景圖片*/
        private ImageView img_bg;
        /**水波紋和背景圖片的大小*/
        private float imageViewWidth=IMAMGEVIEW_SIZE;
        private float imageViewHeigth=IMAMGEVIEW_SIZE;
    
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_WAVE2_ANIMATION:
                        imgs[MSG_WAVE2_ANIMATION].startAnimation(mAnimationSet[MSG_WAVE2_ANIMATION]);
                        break;
                    case MSG_WAVE3_ANIMATION:
                        imgs[MSG_WAVE2_ANIMATION].startAnimation(mAnimationSet[MSG_WAVE3_ANIMATION]);
                        break;
                }
    
            }
        };
    
        public RippleImageView(Context context) {
            super(context);
            initView(context);
        }
    
        public RippleImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
            getAttributeSet(context,attrs);
            initView(context);
        }
    
        /**
         * 獲取xml屬性
         * @param context
         * @param attrs
         */
        private void getAttributeSet(Context context, AttributeSet attrs) {
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.custume_ripple_imageview);
    
            show_spacing_time = typedArray.getInt(R.styleable.custume_ripple_imageview_show_spacing_time, SHOW_SPACING_TIME);
            imageViewWidth = typedArray.getDimension(R.styleable.custume_ripple_imageview_imageViewWidth, IMAMGEVIEW_SIZE);
            imageViewHeigth = typedArray.getDimension(R.styleable.custume_ripple_imageview_imageViewHeigth, IMAMGEVIEW_SIZE);
            Log.d("TAG","show_spacing_time="+show_spacing_time+"mm imageViewWidth="+imageViewWidth+"px  imageViewHeigth="+imageViewHeigth+"px");
            typedArray.recycle();
        }
        private void initView(Context context) {
            setLayout(context);
            for (int i = 0; i <imgs.length ; i++) {
                mAnimationSet[i]=initAnimationSet();
            }
        }
    
        /**
         * 開始動態佈局
         */
        private void setLayout(Context context) {
            LayoutParams params=new LayoutParams(dip2px(context,imageViewWidth),dip2px(context,imageViewHeigth));
            //新增一個規則
            params.addRule(RelativeLayout.CENTER_IN_PARENT,RelativeLayout.TRUE);
            /**新增水波紋圖片*/
            for (int i = 0; i <SIZE ; i++) {
                imgs[i] = new ImageView(context);
                imgs[i].setImageResource(R.mipmap.point_empty);
                addView(imgs[i],params);
            }
            LayoutParams params_bg=new LayoutParams(dip2px(context,imageViewWidth)+10,dip2px(context,imageViewHeigth)+10);
            //新增一個規則
            params_bg.addRule(RelativeLayout.CENTER_IN_PARENT,RelativeLayout.TRUE);
            /**新增背景圖片*/
            img_bg=new ImageView(context);
            img_bg.setImageResource(R.mipmap.point_org);
            addView(img_bg,params_bg);
        }
    
        /**
         * 初始化動畫集
         * @return
         */
        private AnimationSet initAnimationSet() {
            AnimationSet as = new AnimationSet(true);
            //縮放度:變大兩倍
            ScaleAnimation sa = new ScaleAnimation(1f, 2f, 1f, 2f,
                    ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
                    ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
            sa.setDuration(show_spacing_time * 3);
            sa.setRepeatCount(Animation.INFINITE);// 設定迴圈
            //透明度
            AlphaAnimation aa = new AlphaAnimation(1, 0.1f);
            aa.setDuration(show_spacing_time * 3);
            aa.setRepeatCount(Animation.INFINITE);//設定迴圈
            as.addAnimation(sa);
            as.addAnimation(aa);
            return as;
        }
        private static int dip2px(Context context, float dipValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dipValue * scale + 0.5f);
        }
    
        //============================對外暴露的public方法=========================================
        /**
         * 開始水波紋動畫
         */
        public void startWaveAnimation() {
            imgs[0].startAnimation(mAnimationSet[0]);
            mHandler.sendEmptyMessageDelayed(MSG_WAVE2_ANIMATION, show_spacing_time);
            mHandler.sendEmptyMessageDelayed(MSG_WAVE3_ANIMATION, show_spacing_time * 2);
        }
    
        /**
         * 停止水波紋動畫
         */
        public void stopWaveAnimation() {
            for (int i = 0; i <imgs.length ; i++) {
                imgs[i].clearAnimation();
            }
        }
        /**獲取播放的速度*/
        public int getShow_spacing_time() {
            return show_spacing_time;
        }
        /**設計播放的速度,預設是800毫秒*/
        public void setShow_spacing_time(int show_spacing_time) {
            this.show_spacing_time = show_spacing_time;
        }
    

    }

  2. 拷貝自定義屬性到arrts下

    <declare-styleable name="custume_ripple_imageview">
        <attr name="show_spacing_time" format="integer"></attr>
        <attr name="imageViewWidth" format="dimension"></attr>
        <attr name="imageViewHeigth" format="dimension"></attr>
    </declare-styleable>
    
  3. 拷貝預設圖片

相關推薦

Android 波紋擴散效果

1.效果圖: 2.使用方法: 在xml裡使用RippleImageView自定義控制元件: xmlns:app="http://schemas.android.com/apk/res-auto" <com.army.rippleima

Android 點選波紋擴散效果( Ripple Effect )

<span style="font-family: Arial, Helvetica, sans-serif;"><pre style="font-family: 宋體; font-size: 9pt; background-color: rgb(255,

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

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

android 波紋效果實現

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

Android波紋點選效果

轉:Android水波紋點選效果 Android API 21及以上新增了ripple標籤用來實現水波紋的效果。我們可以通過設定ripple背景來實現一些View點選效果。 水波紋樣圖 1. 水波紋效果實現 1)系統效果 系統有界效果 在API 21以上使用,才有波紋效果;

Android 波紋效果

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

Android 波紋顯示進度效果

關於水波紋的效果想必大家見的已經很多了,我就在這裡再囉嗦一次,為了加深自己的印象。先來看看效果圖 關於這個效果的實現不必想的太過複雜了,要想實現這個效果,我們還需要了解一下PorterDuff及Xfermode 關於上面的這張圖想必大家也見過很多次了

Android貝塞爾曲線實現波紋效果

前兩天朋友找我實現一個水波紋的效果,因為這塊一直沒做過,所以花了一上午時間研究一下,參考了網上的一些方法,得知Android還有Path.quadTo()這麼一個方法。 話不多說,程式碼如下: public class MyView extends View implem

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

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

週末閒著無聊分享一個自己寫的帶呼吸效果android波紋自定義view

無圖無真相,廢話不多說先來看看最終效果: 用法: 1.匯入自定義屬性檔案(將這個檔案放在 res/values 下) attrs.xml <span style="font-size:18px;"><?xml version="1.0" encodi

Android 波紋點選效果(Ripple Effect)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="ma

Android RecyclerView 實現item點選波紋動畫效果

Recyclerview的item如果如果加上水波紋動畫的點選效果會使列表的ui體驗效果提升很多,今天來給大家介紹一下如何給Recyclerivew的item view新增這樣的動畫效果。 在res目錄的drawable目錄和drawable-v21下分別建立

UWP:使用Composition實現類似安卓的波紋Ripple效果

nal tcl sset .cn math point ont .com ubi 原文:UWP:使用Composition實現類似安卓的水波紋Ripple效果先放效果圖: 首先,建立一個RippleHelper.cs文件,然後建立以下附加屬性: IsFillEnab

Android 波紋特效

先看一下動畫效果:第一次上傳gif圖片 先錄的mp4視訊 後來轉的gif Android動畫在這裡就不詳細講了,網上一大把,不清楚的可以去看看。這裡只講這個動畫的視線邏輯。 這個動畫這裡分四個部分: 1.最底部圖片心跳動畫 2.水波紋擴散動畫 3.頭像出現的時機動畫 4.

自定義控制元件三部曲之繪圖篇(二十)——RadialGradient與波紋按鈕效果

前言:每當感嘆自己的失敗時,那我就問你,如果讓你重新來一次,你會不會成功?如果會,那說明並沒有拼盡全力。 系列文章: 最近博主實在是太忙了,部落格更新實在是太慢了,真是有愧大家。 這篇將是Shader的最後一篇,下部分,我們將講述Canvas變

安卓實現波紋動畫效果

步驟1: 首先如果想實現上圖的動畫效果,首先新建一個類然後去繼承view,然後重寫裡面的構造方法(切記選擇裡面帶有兩個 引數的構造方法,因為佈局檔案中需要用到這個類,一般需要在佈局檔案中用到的類都會選擇帶有兩個引數的構造方 法),然後在佈局檔案中引用這個類就行了,如下我的

波紋進度效果——萬能的github

首先宣告,這篇blog並沒有什麼技術含量,完全是小弟在開發中遇到的蛋疼的問題,大神勿噴,前幾天遇到介面中要求實現水波紋進度的特效,當時我就懵逼了,這尼瑪,設計師真是腦洞大開,不過有點像360的那個,你懂

ShadowLayout的用法--自定義控制元件--按鈕---波紋效果

現在隨著android 的版本的更新迭代,很多東西寫的越來越完善,越來越複雜,  因此,  無論企業還是個人的發展,  追求完美的心態一定要有. 就一個簡單的按鈕,都要力求完美, 追求更高的使用者體驗. 下面我介紹一下ShadowLayout的用法: 先上效果圖:

echarts 單獨實現波紋漣漪效果

效果: 上程式碼可以直接在 echarts 示例中執行 ( 建立在直角系中 ): var option = { xAxis : [ { boundaryGap:false,

Android 自定義View一個控制元件搞定多種波紋漣漪擴散效果

效果圖 實現思路 這個效果實現起來並不難,重要的是思路 此View滿足了多種水波紋漣漪擴散效果,這要求它能滿足很多的變化 根據上面的樣式,可以看出此View需要滿足以下變化 圓圈從中心可迴圈向外擴散 圓圈之間的擴散間距可以改變 可控制擴散圓的