2014-02-06 4 views
0

У меня есть следующая овальная GradientDrawable созданной программно отображать круг:Анимируйте овальную GradientDrawable созданной программно

GradientDrawable drawable = new GradientDrawable(); 
drawable.setColor(Color.TRANSPARENT); 
drawable.setShape(GradientDrawable.OVAL); 
drawable.setStroke(wheelStrokeWidth, Color.parseColor(WHEEL_STROKE_COLOR)); 
drawable.setSize(2*wheelRadius+wheelStrokeWidth,2*wheelRadius+wheelStrokeWidth); 

ImageView iv = new ImageView(activity); 
iv.setImageDrawable(drawable); 

Я хотел бы, чтобы оживить рисунок этого круга, чтобы сделать его рисовать постепенно. Сначала это всего лишь дуга 0 °, затем 1 °, затем постепенно идет до полного круга на 360 ° (извините, если я не понимаю, не могу выразить это на английском языке).

У кого-нибудь есть идея, как это сделать?

Спасибо!

ответ

0

Следуя идее этого сообщения: Android custom Animation for an ArcShape, я изменил свой GradientDrawable на пользовательский вид и сделал этот класс, чтобы последовательно рисовать дугу :

/** 
* An arc with an animation to draw it progressively 
* 
* Usage: 
* 
* AnimatedArc aa = new AnimatedArc(...) 
* AnimatedArc.ProgressiveDrawing animation = aa.getAnimation(...) 
* aa.startAnimation(animation) 
*/ 

public class AnimatedArc extends View { 

    int delta, startAngle, sweepAngle, currentSweepAngle; 

    Paint p = new Paint(); 
    Rect rect = new Rect(); 
    RectF rectF = new RectF(); 

    public AnimatedArc(Context context, int strokeWidth, String color, int startAngle, int sweepAngle, boolean doNotAnimate) { 

     super(context); 

     p.setAntiAlias(true); 
     p.setColor(Color.parseColor(color)); 
     p.setStyle(Paint.Style.STROKE); 
     p.setStrokeWidth(strokeWidth); 

     delta = strokeWidth/2; 

     this.startAngle = startAngle; 
     this.sweepAngle = sweepAngle; 
     this.currentSweepAngle = doNotAnimate ? sweepAngle : 0; 
    } 

    public ProgressiveDrawing getAnimation(int duration) { 
     return new ProgressiveDrawing(duration); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.getClipBounds(rect); 
     rectF.set(rect.left+delta, rect.top+delta, rect.right-delta, rect.bottom-delta); 
     canvas.drawArc(rectF, startAngle, currentSweepAngle, false, p); 
    } 

    public class ProgressiveDrawing extends Animation { 

     public ProgressiveDrawing(int duration) { 
      setDuration(duration); 
      setInterpolator(new LinearInterpolator()); 
     } 

     public ProgressiveDrawing(int duration, Interpolator interpolator) { 
      setDuration(duration); 
      setInterpolator(interpolator); 
     } 

     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) { 
      currentSweepAngle = (int) (sweepAngle * interpolatedTime); 
      postInvalidate(); 
     } 
    } 
} 
0

Это не идеальное решение. но это может дать вам некоторую идею.

public class MyView extends View { 

private Bitmap mBitmap; 
private Paint mPaint; 
private RectF mOval; 
private float mAngle = 135; 
private Paint mTextPaint; 

public MyView(Context context) { 
    super(context); 
    // use your bitmap insted of R.drawable.ic_launcher 
    mBitmap = BitmapFactory.decodeResource(getResources(), 
      R.drawable.image1); 
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    mOval = new RectF(); 
    mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    mTextPaint.setTextSize(48); 
    mTextPaint.setTextAlign(Align.CENTER); 
    mTextPaint.setColor(0xffffaa00); 
    mTextPaint.setTypeface(Typeface.DEFAULT_BOLD); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    Matrix matrix = new Matrix(); 
    RectF src = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); 
    RectF dst = new RectF(0, 0, w, h); 
    matrix.setRectToRect(src, dst, ScaleToFit.CENTER); 
    Shader shader = new BitmapShader(mBitmap, TileMode.CLAMP, 
      TileMode.CLAMP); 
    shader.setLocalMatrix(matrix); 
    mPaint.setShader(shader); 
    matrix.mapRect(mOval, src); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(0xff0000aa); 
    canvas.drawArc(mOval, -90, mAngle, true, mPaint); 
    canvas.drawText("click me", getWidth()/2, getHeight()/2, 
      mTextPaint); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float w2 = getWidth()/2f; 
    float h2 = getHeight()/2f; 
    mAngle = (float) Math.toDegrees(Math.atan2(event.getY() - h2, 
      event.getX() - w2)); 
    mAngle += 90 + 360; 
    mAngle %= 360; 
    if (mAngle == 0) { 
     mAngle = 360; 
    } 
    invalidate(); 
    return true; 
} 
} 

И кредит принадлежит другому пользователю. Он разместил это решение в каком-то месте (я забыл), и я использовал это ...

+0

это был я, кто отправил это первый – pskink

+0

@pskink ок ... если вы заинтересованы, чтобы ответить на этот вопрос, я буду удалять мой ответ :-) –

+0

нет нет, его хорошо – pskink

Смежные вопросы