国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android 開源SlideSwitch源碼分析

sugarmo / 1460人閱讀

摘要:大家都知道的最大好處就是開源,其實很多項目能全部用開源就能搞定。好了其它的也不多說,正式進入主題,分享一下自己最近對開源代碼的理解。注釋源碼鏈接更多關注

大家都知道android的最大好處就是開源,其實很多項目能全部用開源就能搞定。但是當我們在用開源項目的時候,不懂得它們的原理,就相當于過眼云煙,行尸走肉,只有空殼沒有寶貴的思想。當我們的項目一旦要維護于優化的時候,適應需求時,我們對那些只會拿來用的開源項目只能目瞪口呆。這樣不僅沒有加快我們的開發速度而且還會讓我們全盤皆輸。好了其它的也不多說,正式進入主題,分享一下自己最近對SlideSwitch開源代碼的理解。

說明

首先還是要說明下SlideSwitch是什么開源項目,其實它就是一個我們幾乎每個項目中都會遇到的滑動開關,還不懂請看下圖:

對于大神來說我想早就已經會了,所用這圖也請大神早點回家吃飯的
分析要點

TypedArray 的使用

onMeasure 各個參數的初始化

onDraw 繪制圖形

onTouchEvent 監聽觸摸點擊

ValueAnimator 動畫實現

SlideSwitchListener 接口

TypedArray

一般自定義控件都要用到TypedArray,所以SlideSwitch自然少不了。它就繼承了Android原生的View。而*TypedArray是獲取自定義屬性的參數值。
首先我們會在styles&或者attrs中定義屬性參數


    
    
    
      

format屬性類型,然后在XML中引用,引用之前一定要加入下面的聲明

xmlns:slideswitch="http://schemas.android.com/apk/res/xxx"    

xxx:代表包名。直接引用就行

    slideswitch:themeColor="#ffaaff"

最后在構造方法中通過下面代碼獲取設置的參數值:

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.slideswitchview);
        theme_color =     ta.getColor(R.styleable.slideswitchview_themeColor, DEFAULT_THEME_COLOR);
        ta.recycle();
使用完后務必recycle否則會對下次的使用造成影響
onMeasure

每次視圖的創建都要先獲取視圖的寬高,次方法就會被調用。該方法參數widthMeasureSpecheightMeasuerSpec不是一般的尺寸,而是包括了sizemode。所以為了獲取實際的寬高,要使用如下方法分別獲取sizemode

    int size = MeasureSpec.getSize(measureSpec);
    int mode = MeasureSpec.getMode(measureSpec);

通過mode來獲取sizemode有三種:

EXACTLY 精確尺寸,就是我們指定的尺寸

UNSPECIFIED 為指定的

AT_MOST 最大尺寸 形如指定WRAP_CONTENT在父控件允許的范圍內

    if (mode == MeasureSpec.EXACTLY) {
            result = size;
        } else {
            result = DefaultSize; //UNSPECIFIED
            if (mode == MeasureSpec.AT_MOST) {
                result = Math.min(size, result);
            }
        }
其它簡單的參數值設置就不多說了,請移步最后的源碼
onDraw

尺度獲取到了后,下面自然就是繪制,我們都知道選擇開關形狀有矩形的也有圓角矩形所以根據shpe的值來繪制相應的形狀,這里以矩形為例

    if (shape == 1) {
            mPaint.setColor(Color.GRAY);
            //繪制close時的灰色背景
            canvas.drawRect(backRect, mPaint);
            mPaint.setColor(theme_color);
            mPaint.setAlpha(alpha);
            //繪制open時的彩色漸變背景
            canvas.drawRect(backRect, mPaint);
            mPaint.setColor(Color.WHITE);
            frontRect.set(front_left, pandding, front_left + getMeasuredWidth() / 2 - pandding
                    , getMeasuredHeight() - pandding);
            //繪制滑動器
            canvas.drawRect(frontRect, mPaint);
        } 

其中padding代表內邊距,就是滑動器距邊框的距離

onTouchEvent

這里就是實現動態的觸摸滑動,根據ACTION_DOWNACTION_MOVEACTION_UP來實現動態效果,至于點坐標的處理,源碼很清楚。這里主要提下alpha參數的變化,該參數是實現顏色的透明效果,在這里通過觸摸滑動的間距,動態的改變alpha

    alpha = (int) (255 * (float) front_left / (float) max_left);
ValueAnimator

這個類是動畫效果的核心,通過簡單的幾步就能迅速的實現一些簡單的動畫
首先實例化這里使用的是ofInt(),當然也有ofFloat()等靜態實例化方法

    ValueAnimator valueAnimator = ValueAnimator.ofInt(front_left, toRight ? max_left : min_left);

兩個參數初值與結束值

    //設置插值器
      valueAnimator.setInterpolator(new  AccelerateDecelerateInterpolator());
    valueAnimator.setDuration(500);
    valueAnimator.start();

Interpolator是定義動畫的變化過程下面是一些常用參數

AccelerateDecelerateInterpolator 開始結束慢 中間過程快

AccelerateInterpolator 加速狀態

AnticipateInterpolator 先后移一點,再快速移動

BounceInterpolator 在最后有彈球效果

當然你也可以自定義效果,只要繼承TimeInterpolator類,重寫getInterpolation方法自定義計算值

    @Override  
    public float getInterpolation(float input) {  
        // 編寫相關的邏輯計算  
        return input;  
    }  

既然是動畫自然有監聽設置addUpdateListener實時改變滑動初始值雨alpha

    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                front_left = (int) animation.getAnimatedValue();
                alpha = (int) (255 * (float) front_left / (float) max_left);
                initloop();
            }
        });

最后增加addListener調用下面的接口SlideSwitchListener中的方法

valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                if (toRight) {
                    isOpen = true;
                    if (mSlideSwitchListener != null)
                        mSlideSwitchListener.onOpen();
                    front_start_left = max_left;
                } else {
                    isOpen = false;
                    if (mSlideSwitchListener != null)
                        mSlideSwitchListener.onClose();
                    front_start_left = min_left;
                }
            }
        });
SlideSwitchListener

接口的定義使得在操作類中能更好的實現狀態改變后的相關操作

public void setSlideSwitchListener(SlideSwitchListener sideSwitchListener) {
        mSlideSwitchListener = sideSwitchListener;
    }

    public interface SlideSwitchListener {
        public void onOpen();

        public void onClose();

    }

只要稍微復雜的在這里都講到了,還有不明白的可以點擊查看下面我注釋的源碼,或者留言,謝謝瀏覽。

注釋源碼鏈接:https://github.com/idisfkj/Sl...

更多:https://idisfkj.github.io/

關注

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/110337.html

相關文章

  • Android開源架構

    摘要:音樂團隊分享數據綁定運行機制分析一個項目搞定所有主流架構單元測試一個項目搞定所有主流架構系列的第二個項目。代碼開源,展示了的用法,以及如何使用進行測試,還有用框架對的進行單元測試。 Android 常用三方框架的學習 Android 常用三方框架的學習 likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,歡迎品嘗 簡單的 MVP 模...

    sutaking 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<