0

我必须创建一个小部件,它连续显示 3 个圆圈并在其上应用动画以更改 alpha 值。我尝试扩展一个相对布局,但它没有正确显示。我尝试通过在画布上绘制圆圈来扩展视图,但我不知道如何在画布上设置动画。我选择了第三个选项来创建一个圆形视图并创建一个视图组,并将三个圆形视图添加到视图组并在其上应用动画。但我无法计算正确的 onMeasure 值。所以圈子没有出现。要绘制圆圈,我需要一个中心点来绘制。但是小部件可以放置在屏幕上的任何位置。那时我如何添加圆圈。我应该采取什么路线来绘制这 3 个圆圈:这是我的代码

点视图.java

public class DotsView extends View {

    private final float xAxis,yAxis;
    private final int radius;
    Paint paint;

    public DotsView(Context context,float xAxis, float yAxis, int radius) {
        super(context);

        this.xAxis = xAxis;
        this.yAxis = yAxis;
        this.radius = radius;

        paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.drawCircle(xAxis,yAxis,radius, paint);
    }

}

三点.java

public class ThreeDots extends ViewGroup {

    private static final int leftCircle = 0;
    private static final int middleCircle = 1;
    private static final int rightCircle = 2;
    private Point center;
    private int size;
    DotsView left;
    DotsView middle;
    DotsView right;

    public ThreeDots(Context context) {
        super(context);
        center = new Point();
        createDots(context);
    }

    public ThreeDots(Context context, AttributeSet attrs) {
        super(context, attrs);
        center = new Point();
        createDots(context);
    }

    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        int measuredWidth = MeasureSpec.getSize(widthSpec);
        int measuredHeight = MeasureSpec.getSize(heightSpec);
        size = Math.min(measuredWidth, measuredHeight);
        center.x = center.y = measuredWidth / 2;

        int childSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
        // left.measure(widthMeasureSpec, heightMeasureSpec);
        // left.measure(25, 25);
        // middle.measure(25, 25);
        // right.measure(25, 25);
        setMeasuredDimension(measuredWidth, measuredHeight);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        this.left.layout(0, 0, 25, 25);
        this.middle.layout(0, 0, 25, 25);
        this.right.layout(0, 0, 25, 25);
    }

    public void createDots(Context context) {
        int radius = 10;
        int centerXAxis = center.x;
        int centerYAxis = center.y;

        LayoutParams circleParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);

        left = new DotsView(context, centerXAxis - (radius * 3), centerYAxis, radius);
        left.setLayoutParams(circleParams);
        left.setId(leftCircle);

        middle = new DotsView(context, centerXAxis, centerYAxis, radius);
        middle.setLayoutParams(circleParams);
        middle.setId(middleCircle);

        right = new DotsView(context, centerXAxis + (radius * 3), centerYAxis, radius);
        right.setLayoutParams(circleParams);
        right.setId(rightCircle);

        final AnimatorSet animSet = new AnimatorSet();
        animSet.playSequentially(alphaAnimate(left), alphaAnimate(middle), alphaAnimate(right));
        animSet.start();
        animSet.addListener(new AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                animSet.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }
        });

        this.addView(left, 0);
        this.addView(middle, 1);
        this.addView(right, 2);
    }

    private ValueAnimator alphaAnimate(DotsView view) {
        ValueAnimator alphaAnim = ObjectAnimator.ofFloat(view, "alpha", 1f, 0.5f);
        alphaAnim.setDuration(500);
        return alphaAnim;
    }

}


layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white">

    <com.android.champ.ThreeDots
        xmlns:custom="http://schemas.android.com/apk/res-auto"
        android:id="@+id/load_more_progress"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@color/blue_background"
         />

    </RelativeLayout>
4

1 回答 1

1

扩展 View 并在 onDraw merhod 中绘制这三个圆圈。对于画布动画,请参阅我对这个问题的回答:如何维护多层 ImageViews 并根据最大的一个保持它们的纵横比?

于 2013-09-26T20:33:45.553 回答