自定義loading(轉(zhuǎn)圈的圓點)

網(wǎng)上例子不少 當然我也是看了那個AV什么什么的里面寫法 我自己這個就是簡單罷了 正好項目用 我就弄出來了 順便寫這上面留作備用吧


效果圖J铩穆桂!水印擋的嚴嚴實實 破軟件
/**
 * @ProjectName: BigDemo
 * @Package: com.example.bigdemo
 * @ClassName: CustomLoadingView
 * @Description: 自定義loadingView
 * @Author: 鄭偉
 * @CreateDate: 2019/8/23 18:38
 * @UpdateUser: 更新者
 * @UpdateDate: 2019/8/23 18:38
 * @UpdateRemark: 更新說明
 * @Version: 1.0
 */
public class CustomLoadingView extends View {

    public static final float SCALE = 1.0f;

    public static final int ALPHA = 255;

    private Paint mPaint;

    private ArrayList<ValueAnimator> mAnimators;

    private HashMap<ValueAnimator, ValueAnimator.AnimatorUpdateListener> mUpdateListeners = new HashMap<>();

    private float[] scaleFloats = new float[]{SCALE,
            SCALE,
            SCALE,
            SCALE,
            SCALE,
            SCALE,
            SCALE,
            SCALE};

    private int[] alphas = new int[]{ALPHA,
            ALPHA,
            ALPHA,
            ALPHA,
            ALPHA,
            ALPHA,
            ALPHA,
            ALPHA};

    public CustomLoadingView(Context context) {
        super(context);
        init(context);
    }

    public CustomLoadingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public CustomLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        mPaint = new Paint();
        mPaint.setColor(0x642700);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);
        onCreateAnimators();
        startAnimators();
    }


    /**
     * 啟動動畫
     */
    public void startAnimators() {
        for (int i = 0; i < mAnimators.size(); i++) {
            ValueAnimator animator = mAnimators.get(i);
            ValueAnimator.AnimatorUpdateListener updateListener = mUpdateListeners.get(animator);
            if (updateListener != null) {
                animator.addUpdateListener(updateListener);
            }
            animator.start();
        }
    }

    /**
     * 停止動畫
     */
    public void stopAnimators() {
        if (mAnimators != null) {
            for (ValueAnimator animator : mAnimators) {
                if (animator != null && animator.isStarted()) {
                    animator.removeAllUpdateListeners();
                    animator.end();
                }
            }
        }
    }

    public void setColor(int color){
        mPaint.setColor(color);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        if (widthMode == MeasureSpec.AT_MOST) {
            widthSize = 50;
        }

        if (heightMode == MeasureSpec.AT_MOST) {
            heightSize = 50;
        }
        setMeasuredDimension(widthSize, heightSize);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float radius = getWidth() / 10;
        for (int i = 0; i < 8; i++) {
            canvas.save();
            Point point = circleAt(getWidth(), getHeight(), getWidth() / 2 - radius, i * (Math.PI / 4));
            canvas.translate(point.x, point.y);
            canvas.scale(scaleFloats[i], scaleFloats[i]);
            mPaint.setAlpha(alphas[i]);
            canvas.drawCircle(0, 0, radius, mPaint);
            canvas.restore();
        }
    }


    private Point circleAt(int width, int height, float radius, double angle) {
        float x = (float) (width / 2 + radius * (Math.cos(angle)));
        float y = (float) (height / 2 + radius * (Math.sin(angle)));
        return new Point(x, y);
    }

    private final class Point {
        private float x;
        private float y;

        private Point(float x, float y) {
            this.x = x;
            this.y = y;
        }
    }

    private void addUpdateListener(ValueAnimator animator, ValueAnimator.AnimatorUpdateListener updateListener) {
        mUpdateListeners.put(animator, updateListener);
    }

    private void onCreateAnimators() {
        ArrayList<ValueAnimator> animators = new ArrayList<>();
        int[] delays = {0, 120, 240, 360, 480, 600, 720, 780, 840};
        for (int i = 0; i < 8; i++) {
            final int index = i;
            ValueAnimator scaleAnim = ValueAnimator.ofFloat(1, 0.4f, 1);
            scaleAnim.setDuration(1000);
            scaleAnim.setRepeatCount(-1);
            scaleAnim.setStartDelay(delays[i]);
            addUpdateListener(scaleAnim, new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    scaleFloats[index] = (float) animation.getAnimatedValue();
                    postInvalidate();
                }
            });

            ValueAnimator alphaAnim = ValueAnimator.ofInt(255, 77, 255);
            alphaAnim.setDuration(1000);
            alphaAnim.setRepeatCount(-1);
            alphaAnim.setStartDelay(delays[i]);
            addUpdateListener(alphaAnim, new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    alphas[index] = (int) animation.getAnimatedValue();
                    postInvalidate();
                }
            });
            animators.add(scaleAnim);
            animators.add(alphaAnim);
        }
        mAnimators = animators;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卡睦,更是在濱河造成了極大的恐慌肮疗,老刑警劉巖爬泥,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬讨,死亡現(xiàn)場離奇詭異,居然都是意外死亡袍啡,警方通過查閱死者的電腦和手機踩官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境输,“玉大人蔗牡,你說我怎么就攤上這事颖系。” “怎么了辩越?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵集晚,是天一觀的道長。 經(jīng)常有香客問我区匣,道長,這世上最難降的妖魔是什么蒋院? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任亏钩,我火速辦了婚禮,結(jié)果婚禮上欺旧,老公的妹妹穿的比我還像新娘姑丑。我一直安慰自己,他們只是感情好辞友,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布栅哀。 她就那樣靜靜地躺著,像睡著了一般称龙。 火紅的嫁衣襯著肌膚如雪留拾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天鲫尊,我揣著相機與錄音痴柔,去河邊找鬼。 笑死疫向,一個胖子當著我的面吹牛咳蔚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搔驼,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谈火,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舌涨?” 一聲冷哼從身側(cè)響起糯耍,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎囊嘉,沒想到半個月后谍肤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡哗伯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年荒揣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焊刹。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡系任,死狀恐怖恳蹲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俩滥,我是刑警寧澤嘉蕾,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站霜旧,受9級特大地震影響错忱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挂据,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一以清、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崎逃,春花似錦掷倔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巴柿,卻和暖如春凛虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广恢。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工涩维, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袁波。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓瓦阐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篷牌。 傳聞我的和親對象是個殘疾皇子睡蟋,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 2011年10月20日為什么糊涂 回家的路上,曉曉打了個噴嚏枷颊,媽媽有點緊張:“怎么了戳杀?”卻說成了:“怎么辦?”說完...
    羊羊羊羊汪閱讀 9,367評論 2 14
  • 文/楊柳君 你的企業(yè)互聯(lián)網(wǎng)+了嗎? 各類信息渠道經(jīng)常見到這樣的提問题造,企業(yè)界朋友們交流時傍菇,也常有此類探討。 什么是互...
    楊柳君閱讀 132評論 0 1
  • 一縷暖陽界赔,將我擁入懷中丢习。 我被擠于狹隘的縫隙中牵触,扭扭已經(jīng)僵硬的身體疆偿,頭頂曾引以為傲的白色小茸毛已經(jīng)破爛不堪嗜价。絲縷陽...
    蔣小敬閱讀 698評論 0 3
  • 《給K的詩》之 《送可愛的樹兒出嫁》 有沒有一棵可愛的樹 四季都開著淡綠的花 新芽在枝頭吟唱 年長的樹葉為她擋著陽...
    朝歸閱讀 116評論 0 1
  • 你總在降低自己的標準,總是退而求其次贼邓,以為這樣會活得更好移袍,但其實低配的生活傻谁,反而會讓你失去更多鲤屡。 2018新年伊始...
    纏者曹閱讀 331評論 0 0