2011年10月18日火曜日

【Android】ワイプアニメーション作ってみた

どうせネットに転がっているだろうと思ったんですが、案外見つからなかったので作りました。
FPS30で10px広がっていきます。 FPSManagerクラスはこちらより利用させていただきました。


ありがたや、ありがたや。
public class WipeView extends SurfaceView implements SurfaceHolder.Callback{
 
 private int viewWidth;
 private int viewHeight;
 private Paint paint;
 private int radius = 0;
 private Thread wipeAnimation;
 private FPSManager manage = new FPSManager(30);
 
 public WipeView(Context context) {
  super(context);
  init();
 }
 public WipeView(Context context, AttributeSet attrs) {
  super(context, attrs);
  init();
 }

 public WipeView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init();
 }
 
 public void init(){
  //背景を透過するため
  getHolder().setFormat(PixelFormat.TRANSLUCENT);
  getHolder().addCallback(this);
  setZOrderOnTop(true);
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  wipeAnimation = new Thread(wipeZoomIn);
  wipeAnimation.start();
 }

 @Override
 protected void onDraw(Canvas canvas){
  super.onDraw(canvas);
  this.viewHeight = canvas.getHeight();
  this.viewWidth = canvas.getWidth();
  //前フレームの描画をクリア
  canvas.drawColor(0, PorterDuff.Mode.CLEAR);
  //くり抜く円のパス
  Path clip = new Path();
  clip.addCircle(viewWidth/2, viewHeight/2, radius, Path.Direction.CW);
  canvas.clipPath(clip, Op.DIFFERENCE);
  paint = new Paint();
  paint.setColor(Color.BLACK);
  canvas.drawPaint(paint);
  Log.d("debug", "radius = " + radius);
 }
 
 Runnable wipeZoomIn = new Runnable(){
  @Override
  public void run() {
   SurfaceHolder holder = getHolder();
   try{
    while(wipeAnimation != null){
     TimeUnit.NANOSECONDS.sleep(manage.state());
     Canvas canvas = holder.lockCanvas();
     if(canvas != null){
      radius += 10;
      onDraw(canvas);
      holder.unlockCanvasAndPost(canvas);
      if(radius >= viewWidth){
       break;
      }
     }
    }
   }catch(Exception e){
    
   }
   return;
  }
 };
 
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 }
 
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  wipeAnimation = null;
 }

}