2016-10-20 14 views
0

Я создаю пользовательский вид, в котором у меня есть объект RectF прямоугольника с определенной высотой. Я хотел бы увеличить нижнюю Y-координату точки до определенного значения с прогрессивной анимацией.Анимация, чтобы увеличить размер прямоугольника в пользовательском представлении

Я пробовал следующее. Я создал метод setBatteryState(), который вызывается на onclicked метода в деятельности, которая содержит пользовательский вид:

public class BatteryView extends View { 

public int mCanvasWidth; 
public int mCanvasHeight; 

public RectF mBatteryHead; 
public RectF mBatteryBody; 
public RectF mBatteryBodyVolume; 
public Canvas mCanvas; 

public BatteryView(Context context) { 
    super(context); 
} 

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

public void init() 
{ 

} 

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    this.mCanvas = canvas; 
    float batteryHeadDistanceFromLeft = mCanvasWidth/3; 
    float batteryHeadWidth = mCanvasWidth/3; 

    float batteryBodyDistanceFromTop = mCanvasHeight/5; 
    float batteryHeadHeight = mCanvasHeight/5; 
    mBatteryHead = new RectF(batteryHeadDistanceFromLeft,0,2*batteryHeadWidth,batteryHeadHeight+5); 
    Paint batteryHeadPaint = new Paint(); 
    batteryHeadPaint.setColor(ContextCompat.getColor(getContext(), R.color.batifyColor)); 
    canvas.drawRect(mBatteryHead,batteryHeadPaint); 

    mBatteryBody = new RectF(0,(int)batteryBodyDistanceFromTop,mCanvasWidth,mCanvasHeight); 
    Paint batteryBodyPaint = new Paint(); 
    batteryBodyPaint.setStyle(Paint.Style.STROKE); 
    batteryBodyPaint.setColor(ContextCompat.getColor(getContext(), R.color.batifyColor)); 
    batteryBodyPaint.setStrokeWidth(10); 
    canvas.drawRect(mBatteryBody,batteryBodyPaint); 

    mBatteryBodyVolume = new RectF(12,(int)batteryBodyDistanceFromTop + 10,mCanvasWidth-12,mCanvasHeight/2); 
    Paint volumeBodyPaint = new Paint(); 
    volumeBodyPaint.setColor(ContextCompat.getColor(getContext(), R.color.batifyColor)); 
    canvas.drawRect(mBatteryBodyVolume,volumeBodyPaint); 
} 


public void setStateOnBattery(){ 
    ObjectAnimator animateBottom = ObjectAnimator.ofFloat(mBatteryBodyVolume, "bottom", mBatteryBodyVolume.bottom, mCanvasHeight); 
    animateBottom.setDuration(1000).start(); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec,heightMeasureSpec); 
    mCanvasWidth = MeasureSpec.getSize(widthMeasureSpec); 
    mCanvasHeight = MeasureSpec.getSize(heightMeasureSpec); 
}} 

ObjectAnimator должен перевести прямоугольник mBatteryBodyVolume до размера холст, но ничего не меняется ...

Любая идея?

Заранее благодарен!

ответ

0

Используйте асинхронную задачу с двумя основными функциями, рисуйте и обновите. Каждый раз, когда вызывается обновление, увеличивайте переменную высоты на константу. Затем, в ничью, нарисуйте прямоугольник с высотой как параметр. Если вам нужен код, просто спросите. : D

UPDATE

Создание 'бегунка' асинхронной задачи:

public class Runner extends Thread { 

    public volatile boolean running = true; 
    private Environment env; 

    public Runner(Environment E) { 
     env = E; 
    } 

    @Override 
    public void run() { 
     long lastTime = System.currentTimeMillis(); 

     while(running) { 
      long now = System.currentTimeMillis(); 
      long elapsed = now - lastTime; 

      env.update(elapsed); 
      env.draw(); 

      lastTime = now; 
     } 
    } 

    public void shutdown() { 
     running = false; 
    } 
} 

В среде, выполните следующие действия:

public void draw() { 
    Canvas canvas = holder.lockCanvas(); 

    if (canvas != null) { 
     canvas.drawRect(x-w, y-h, x+w, y+h, myPaint); 
     holder.unlockCanvasAndPost(canvas); 
    } 
} 

и метод обновления:

public void update(float elapsedTime) { 
    h+=myKonstant*elpasedTime; 
} 

Надежда I Помогло: D

+0

Спасибо за ответ, немного кода будет замечательным, потому что не может понять, как сделать плавный рост ... –

+0

Вы знаете, как правильно работать с асинхронными задачами? Я отредактирую ответ с помощью части кода. Пропущенную часть нужно очень легко придумать. – Rippr

+0

Не беспокойтесь о асинхронных задачах :) –