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

来源:互联网 发布:淘宝购物并发技术 编辑:程序博客网 时间:2024/06/06 20:10

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


效果如下


代码如下:

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
原创粉丝点击