亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

android-percent-support-extend-master

標簽:
Android
ObjectAnimator outerCircleAnimator = ObjectAnimator.ofFloat(mCvCircle, CircleView.OUTER_CIRCLE_RADIUS_PROGRESS, 0.1f, 1f);
outerCircleAnimator.setDuration(250);
outerCircleAnimator.setInterpolator(mDecelerate);

// 延迟擦除
ObjectAnimator innerCircleAnimator = ObjectAnimator.ofFloat(mCvCircle, CircleView.INNER_CIRCLE_RADIUS_PROGRESS, 0.1f, 1f);
innerCircleAnimator.setDuration(200);
innerCircleAnimator.setStartDelay(200);
innerCircleAnimator.setInterpolator(mDecelerate);

// 竖直水平放大和缩小
ObjectAnimator starScaleYAnimator = ObjectAnimator.ofFloat(mIvStar, ImageView.SCALE_Y, 0.2f, 1f);
starScaleYAnimator.setDuration(350);
starScaleYAnimator.setStartDelay(250);
starScaleYAnimator.setInterpolator(mOvershoot);

ObjectAnimator starScaleXAnimator = ObjectAnimator.ofFloat(mIvStar, ImageView.SCALE_X, 0.2f, 1f);
starScaleXAnimator.setDuration(350);
starScaleXAnimator.setStartDelay(250);
starScaleXAnimator.setInterpolator(mOvershoot);

// 先快后慢.
ObjectAnimator dotsAnimator = ObjectAnimator.ofFloat(mDvDots, DotsView.DOTS_PROGRESS, 0, 1f);
dotsAnimator.setDuration(900);
dotsAnimator.setStartDelay(50);
dotsAnimator.setInterpolator(mAccelerateDecelerate);

// 放入动画集合
mAnimatorSet.playTogether(
        outerCircleAnimator,
        innerCircleAnimator,
        starScaleYAnimator,
        starScaleXAnimator,
        dotsAnimator
);
各种各样的属性集
// 动画集合监听
mAnimatorSet.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationCancel(Animator animation) {
        // 初始值
        mIvStar.setScaleX(1);
        mIvStar.setScaleY(1);
        mCvCircle.setInnerCircleRadiusProgress(0);
        mCvCircle.setOuterCircleRadiusProgress(0);
        mDvDots.setCurrentProgress(0);
    }
});
几个自定义图形
CircleView
// 初始化
private void init() {
    mCirclePaint = new Paint();
    mCirclePaint.setStyle(Paint.Style.FILL);

    mMaskPaint = new Paint(); // 消失的效果
    mMaskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

    mArgbEvaluator = new ArgbEvaluator();
}
初始化的时候定义两种画笔,第一种是正常画笔,第二种是擦除效果画笔
onSizeChanged()实在布局发生变化时的回调函数,间接回去调用onMeasure, onLayout函数重新布局
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mMaxCircleSize = w / 2; // 当前画布的一半.
    mTempBitmap = Bitmap.createBitmap(getWidth(), getWidth(), Bitmap.Config.ARGB_8888);
    mTempCanvas = new Canvas(mTempBitmap); // 初始化画布
}
1
2
3
4
public static final Bitmap.Config  ALPHA_8public static final Bitmap.Config  ARGB_4444 public static final Bitmap.Config  ARGB_8888public static final Bitmap.Config  RGB_565

这些是色彩的存储方法:我们知道 ARGB指的是一种 色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue.

其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值

ALPHA_8就是Alpha由8位组成

ARGB_4444就是由4个4位组成即16位

ARGB_8888就是由4个8位组成即32位

RGB_565就是R为5位,G为6位,B为5位共16位

越高就越逼真

@Override protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mTempCanvas.drawColor(0xffffff, PorterDuff.Mode.CLEAR); // 清除颜色, 设置为白色
    // 在控件的中心画圆, 宽度是当前视图宽度的一半(会随着控件变化), 半径会越来越大.
    mTempCanvas.drawCircle(getWidth() / 2, getHeight() / 2, mOuterCircleRadiusProgress * mMaxCircleSize, mCirclePaint);
    mTempCanvas.drawCircle(getWidth() / 2, getHeight() / 2, mInnerCircleRadiusProgress * mMaxCircleSize, mMaskPaint);
    canvas.drawBitmap(mTempBitmap, 0, 0, null); // 画布绘制两个
由于进行了圆.缩放操作,会进行onSizeChange操作
}
// 更新圆圈的颜色变化
private void updateCircleColor() {
    // 0.5到1颜色渐变
    float colorProgress = (float) Utils.clamp(mOuterCircleRadiusProgress, 0.5, 1);
    // 转换映射控件
    colorProgress = (float) Utils.mapValueFromRangeToRange(colorProgress, 0.5f, 1f, 0f, 1f);
    mCirclePaint.setColor((Integer) mArgbEvaluator.evaluate(colorProgress, START_COLOR, END_COLOR));
}利用估值器,实现颜色的变化
// 变换外层点的位置
private void updateOuterDotsPosition() {
    // 半径先走的快, 后走的慢
    if (mCurrentProgress < 0.3f) {
        mCurrentRadius1 = (float) Utils.mapValueFromRangeToRange(mCurrentProgress, 0.0f, 0.3f, 0, mMaxOuterDotsRadius * 0.8f);
    } else {
        mCurrentRadius1 = (float) Utils.mapValueFromRangeToRange(mCurrentProgress, 0.3f, 1f, 0.8f * mMaxOuterDotsRadius, mMaxOuterDotsRadius);
    }

    // 点的大小, 小于0.7是最大点, 大于0.7逐渐为0.
    if (mCurrentProgress < 0.7f) {
        mCurrentDotSize1 = mMaxDotSize;
    } else {
        mCurrentDotSize1 = (float) Utils.mapValueFromRangeToRange(mCurrentProgress, 0.7f, 1f, mMaxDotSize, 0);
    }
}
如何设置先块后慢的过程

原文链接:http://www.apkbus.com/blog-880881-63370.html

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消