Skip to content

Instantly share code, notes, and snippets.

@neufuture
Created October 13, 2011 14:16
Show Gist options
  • Save neufuture/1284319 to your computer and use it in GitHub Desktop.
Save neufuture/1284319 to your computer and use it in GitHub Desktop.
Surface view for creating animated arcs
package com.freefallhighscore.circles;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class CirclesActivity extends Activity {
/** Called when the activity is first created. */
private Handler mHandler = new Handler();
TextView tv;
DrawCanvas canvasView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RelativeLayout wheel = (RelativeLayout) findViewById(R.id.wheel);
canvasView = new DrawCanvas(this);
wheel.addView(canvasView);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
canvasView.onResumeMySurfaceView();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
canvasView.onPauseMySurfaceView();
}
private Runnable mUpdateTimeTask = new Runnable() {
long start = SystemClock.uptimeMillis();
public void run() {
long millis = SystemClock.uptimeMillis() - start;
canvasView.slice = millis/20000.0;
//tv.setText(String.valueOf(canvasView.slice));
if(millis<20000) mHandler.postAtTime(this, start + millis);
else{
mHandler.removeCallbacks(mUpdateTimeTask);
}
}
};
public void go(View view){
mHandler.removeCallbacks(mUpdateTimeTask); //Remove old timer
mHandler.postDelayed(mUpdateTimeTask, 100);
}
}
package com.freefallhighscore.circles;
import java.util.Random;
import android.R.color;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
class DrawCanvas extends SurfaceView implements Runnable{
Thread thread = null;
SurfaceHolder surfaceHolder;
volatile boolean running = false;
public double slice;
public DrawCanvas(Context context) {
super(context);
// TODO Auto-generated constructor stub
surfaceHolder = getHolder();
}
public void onResumeMySurfaceView(){
running = true;
thread = new Thread(this);
thread.start();
}
public void onPauseMySurfaceView(){
boolean retry = true;
running = false;
while(retry){
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void run() {
// TODO Auto-generated method stub
while(running){
if(surfaceHolder.getSurface().isValid()){
surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
Canvas canvas = surfaceHolder.lockCanvas();
Paint mPaints = new Paint();
mPaints.setAntiAlias(true);
//mPaints.setStyle(Paint.Style.FILL);
mPaints.setColor(0x8800FF00);
RectF bounds= new RectF( 0, 0, 100, 100);
canvas.drawArc(bounds, -90, (float) (slice*360), true, mPaints);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#bbbbbb"
>
<RelativeLayout
android:id="@+id/wheel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginBottom="20dip"
android:layout_alignParentBottom="true"
/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Touch Me"
android:onClick="go"
/>
</RelativeLayout>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment