Анимация для увеличения размера прямоугольника в пользовательском представлении

#android #animation #android-custom-view #ondraw

#Android #Анимация #android-пользовательский вид #ondraw

Вопрос:

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

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

 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 должен преобразовать rect mBatteryBodyVolume в размер холста, но ничего не изменится…

Есть идея?

Заранее спасибо!

Ответ №1:

Используйте асинхронную задачу с 2 основными функциями, draw и update. При каждом вызове update увеличивайте переменную height на константу. Затем в draw нарисуйте свой прямоугольник с высотой в качестве параметра. Если вам нужен код, просто спросите. 😀

Обновить

Создайте асинхронную задачу «runner»:

 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;
}
  

Надеюсь, я помог: D

Комментарии:

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

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

3. Да, не беспокойтесь об асинхронных задачах 🙂

4. Что касается части рисования, я полагаю, вы используете CustomView с Canvas? P.s. Если вы удовлетворены ответом, отметьте его как принятый : D