2016-10-20 2 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의 크기로 RECT 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; 
} 

희망 사항 도움이 : D

+0

답변 주셔서 감사합니다, 코드의 비트가 될 수 있기 때문에 위대한 것입니다 부드러운 증가하는 방법을 알아낼 수 없기 때문에 ... –

+0

비동기 작업을 제대로하는 방법을 알고 계십니까? 나는 코드의 일부로 답을 편집 할 것이다. 생략 된 부분은 매우 쉽게 생각할 수 있어야합니다. – Rippr

+0

그래도 비동기 작업에 대해 걱정할 필요가 없습니다. –

관련 문제