2016-10-20 5 views
0

私は、特定の高さを持つ四角形のRectFオブジェクトを持つカスタムビューを作成しています。私は、プログレッシブアニメーションで、下のYポイント座標を特定の値に増やしたいと思います。カスタムビューで矩形のサイズを大きくするアニメーション

私は以下を試しました。私は、カスタムビューを保持している活動のonclicked方法で呼び出されるメソッドのsetBatteryStateを()作成しました:

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

描画と更新の2つの主要機能を持つ非同期タスクを使用します。更新が呼び出されるたびに、変数heightを定数だけ増やします。次に、描画で、高さをパラメータとして四角形を描画します。コードが必要な場合は、尋ねてください。

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; 
} 
次の操作を行い、環境に

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

は 'ランナー' 非同期タスクを作成しますD

UPDATE

希望助けて:D

+0

答えをありがとう、少しのコードは、スムーズに増加する方法を見つけることができないため、素晴らしいだろう... –

+0

あなたは非同期タスクを正しく操作する方法を知っていますか?コードの一部で回答を編集します。省略された部分は考えるのが非常に簡単です。 – Rippr

+0

非同期タスクに関する心配はありません:) –

関連する問題