高仿百度加载图片自定义控件

高仿百度加载图片自定义控件,利用绘制和属性动画


效果如下


代码如下:

public class TriangleWithCircleView extends View {

    /**
     * 三角形画笔
     */
    private Paint trianglePaint;

    /**
     * 圆的画笔
     */
    private Paint circlePaint;

    /**
     * 最大三角形的
     */
    private final int MAX_BORDER = 50;

    /**
     * 最小三角形
     */
    private final int MIN_BORDER = 20;

    /**
     * 当前最小三角形
     */
    private int currentMinBorder;

    /**
     * 当前最大三角形
     */
    private int currentMaxBorder;

    /**
     * 缩放动画的速率
     */
    private final int STEP = 1;

    /**
     * 当前的三角形
     */
    private int currentBorderLength;

    /**
     * 是否是缩小
     */
    private boolean isDown = true;

    /**
     * 三个圆的半径
     */
    private final int CIRCLE_1 = 8;
    private final int CIRCLE_2 = 12;
    private final int CIRCLE_3 = 16;

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(150, 150);
    }

    /**
     * 初始化
     */
    private void init() {
        trianglePaint = new Paint();
        trianglePaint.setColor(Color.BLUE);
        trianglePaint.setStrokeWidth(2);
        trianglePaint.setStyle(Paint.Style.STROKE);
        trianglePaint.setAntiAlias(true);

        circlePaint = new Paint();
        circlePaint.setColor(Color.BLUE);
        circlePaint.setStyle(Paint.Style.FILL);
        circlePaint.setAntiAlias(true);

        startRotation();
        currentBorderLength = MAX_BORDER;
        currentMinBorder = MIN_BORDER;
        currentMaxBorder = MAX_BORDER;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //绘制三角形
        Path path = new Path();
        float gen3 = (float) Math.sqrt(3);
        float offset = getHeight() / 2 - currentBorderLength;

        //三角形上点的坐标
        float topX = getWidth() / 2;
        float topY = offset;

        //三角形左点的坐标
        float leftX = getWidth() / 2 - (gen3 / 2 * currentBorderLength);
        float leftY = getHeight() / 2 + currentBorderLength / 2;

        //三角形右点的坐标
        float rightX = getWidth() / 2 + (gen3 / 2 * currentBorderLength);
        float rightY = getHeight() / 2 + currentBorderLength / 2 - 10;

        path.moveTo(topX, topY);//上
        path.lineTo(leftX, leftY);//左
        path.lineTo(rightX, rightY);//右
        path.lineTo(topX, topY);
        path.close();
        canvas.drawPath(path, trianglePaint);

        //根据三角形的三个角绘制三个圆
        canvas.drawCircle(topX, topY, CIRCLE_1, circlePaint);
        canvas.drawCircle(leftX, leftY, CIRCLE_2, circlePaint);
        canvas.drawCircle(rightX, rightY, CIRCLE_3, circlePaint);

        if (isDown) {//当前状态为缩小
            currentBorderLength -= STEP;
        } else {//当前状态为放大
            currentBorderLength += STEP;
        }

        //判断是否缩小到最小的
        if (currentBorderLength <= currentMinBorder) {
            //减少下次能放大的最大值
            currentMaxBorder -= 10;
            if (currentMaxBorder <= MAX_BORDER - 20) {
                currentMaxBorder = MAX_BORDER;
            }
            isDown = false;
        }
        if (currentBorderLength >= currentMaxBorder) {
            //增大下次能缩小的最小值
            currentMinBorder += 15;
            if (currentMinBorder >= MIN_BORDER - 10) {
                currentMinBorder = MIN_BORDER;
            }
            isDown = true;
        }
        invalidate();
    }

    /**
     * 开始旋转
     */
    private void startRotation() {
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(this, "rotation", 0, 360);
        objectAnimator.setDuration(2400);
        objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
        objectAnimator.setInterpolator(new LinearInterpolator());
        objectAnimator.start();
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值