【问题标题】:Animation to increase the size of a rectangle in custom view在自定义视图中增加矩形大小的动画
【发布时间】:2017-03-02 12:08:14
【问题描述】:

我正在创建一个自定义视图,其中有一个具有特定高度的矩形 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 转换为画布的大小,但没有任何变化...

有什么想法吗?

提前致谢!

【问题讨论】:

    标签: android animation android-custom-view ondraw


    【解决方案1】:

    使用具有 2 个主要功能的异步任务,绘制和更新。每次调用 update 时,将 height 变量增加一个常数。然后,在绘图中,以高度为参数绘制矩形。如果您需要代码,请询问。 :D

    更新

    创建一个“跑步者”异步任务:

    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

    【讨论】:

    • 感谢您的回答,一些代码会很棒,因为无法弄清楚如何平滑增加...
    • 你知道如何处理异步任务吧?我将使用部分代码编辑答案。省略的部分应该很容易想到。
    • 是的,不用担心异步任务:)
    • 对于绘图部分,我假设您正在使用带有 Canvas 的 customVIew?附:如果您对答案感到满意,请将其标记为已接受:D
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多