#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