コード例 #1
0
ファイル: TestActivity.java プロジェクト: Cenler/AppDevLib
    private void initView() {
      // 圆环
      mCirclePaint = new Paint();
      mCirclePaint.setAntiAlias(true);
      mCirclePaint.setColor(mBigCircleColor);
      mCirclePaint.setStrokeWidth(mBigCircleStroke);
      mCirclePaint.setStyle(Paint.Style.STROKE);

      // 小球
      mAccBallPaint = new Paint();
      mAccBallPaint.setAntiAlias(true);
      mAccBallPaint.setColor(mAccBallColor);
      mAccBallPaint.setStyle(Paint.Style.FILL);

      rectF = new RectF(0, 0, ScreenUtil.getDisplayWidth() >> 1, ScreenUtil.getDisplayWidth() >> 1);
      startRotate(2000);
    }
コード例 #2
0
ファイル: TestActivity.java プロジェクト: Cenler/AppDevLib
  @TargetApi(Build.VERSION_CODES.M)
  private class LoadingView extends View {

    private static final int DEF_DURATION = 1000;

    // paint
    private Paint mCirclePaint;
    private Paint mAccBallPaint;
    private RectF rectF;

    private int mBigCircleColor = getResources().getColor(R.color.color_green_highlight);
    private int mAccBallColor = getResources().getColor(R.color.color_orange_assist);

    private int mBigCircleStroke = ScreenUtil.dp2px(1);
    private int mDuration = DEF_DURATION;

    private float mBitRadius = ScreenUtil.dp2px(50);
    private float mSmallRadius = ScreenUtil.dp2px(10);
    private float startAngle = 0.0f;

    public LoadingView(Context context) {
      this(context, null);
    }

    public LoadingView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
    }

    public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      initView();
    }

    private void initView() {
      // 圆环
      mCirclePaint = new Paint();
      mCirclePaint.setAntiAlias(true);
      mCirclePaint.setColor(mBigCircleColor);
      mCirclePaint.setStrokeWidth(mBigCircleStroke);
      mCirclePaint.setStyle(Paint.Style.STROKE);

      // 小球
      mAccBallPaint = new Paint();
      mAccBallPaint.setAntiAlias(true);
      mAccBallPaint.setColor(mAccBallColor);
      mAccBallPaint.setStyle(Paint.Style.FILL);

      rectF = new RectF(0, 0, ScreenUtil.getDisplayWidth() >> 1, ScreenUtil.getDisplayWidth() >> 1);
      startRotate(2000);
    }

    private void startRotate(long duration) {
      LinearAnimation animation = new LinearAnimation();
      animation.setDuration(duration);
      animation.setRepeatCount(Animation.INFINITE);
      animation.setInterpolator(new LinearInterpolator());
      animation.setLinearAnimationListener(
          new LinearAnimation.LinearAnimationListener() {
            @Override
            public void applyTans(float interpolatedTime) {
              startAngle = 360 * interpolatedTime;
              invalidate();
            }
          });
      startAnimation(animation);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
      //            drawSeekbar(canvas, 100);
      drawSlowIndicator(startAngle, canvas);
    }

    private void drawSlowIndicator(float startAngle, Canvas canvas) {
      Paint circlePaint = new Paint();
      circlePaint.setAntiAlias(true);
      circlePaint.setColor(Color.parseColor("#A8D7A7"));
      circlePaint.setStrokeWidth(7);
      circlePaint.setStyle(Paint.Style.STROKE);
      canvas.drawPath(getArcPath(), circlePaint);

      int restoreCount = canvas.save();
      canvas.translate(rectF.centerX(), rectF.centerY());
      circlePaint.setStyle(Paint.Style.FILL);
      canvas.drawPath(getBallPath(startAngle + 90), circlePaint);
      canvas.drawPath(getBallPath(startAngle + 90 + 30 + 90), circlePaint);
      canvas.drawPath(getBallPath(startAngle + 90 + 30 + 90 + 30 + 90), circlePaint);
      canvas.restoreToCount(restoreCount);
    }

    private Path getArcPath() {
      Path path = new Path();
      path.addArc(rectF, startAngle, 90);
      path.addArc(rectF, startAngle + 90 + 30, 90);
      path.addArc(rectF, startAngle + 90 + 90 + 30 + 30, 90);
      return path;
    }

    private void drawSeekbar(Canvas canvas, float startAngle) {
      Paint circlePaint = new Paint();
      circlePaint.setAntiAlias(true);
      circlePaint.setColor(Color.parseColor("#FF4444"));
      circlePaint.setStrokeWidth(7);
      circlePaint.setStyle(Paint.Style.STROKE);

      Path path = new Path();
      path.addArc(rectF, 0, startAngle);
      canvas.drawPath(path, circlePaint);

      int restoreCount = canvas.save();

      canvas.translate(rectF.centerX(), rectF.centerY());
      circlePaint.setStyle(Paint.Style.FILL);
      canvas.drawPath(getBallPath(startAngle), circlePaint);

      canvas.restoreToCount(restoreCount);
    }

    private Path getBallPath(float startAngle) {
      double sweepAngle = Math.PI / 180 * startAngle;
      Path path = new Path();
      float x = (float) Math.cos(sweepAngle) * (rectF.width() / 2);
      float y = (float) Math.sin(sweepAngle) * (rectF.width() / 2);
      path.moveTo(x, y);
      path.addCircle(x, y, 10, Path.Direction.CCW);
      return path;
    }
  }