Skip to content

Instantly share code, notes, and snippets.

@meeDamian
Created January 18, 2013 19:18
Show Gist options
  • Save meeDamian/4567478 to your computer and use it in GitHub Desktop.
Save meeDamian/4567478 to your computer and use it in GitHub Desktop.
How do I optimize RadialGradient usage? How do I do it better?
package com.example
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class Logo extends ImageView {
private int centerX, centerY;
private Bitmap overlay, inner, outer;
private Paint paint;
private int innerAngle, outerAngle;
private boolean touched = false;
private int rPulse=240, // current pulse radius
dPulse = 1; // current delta being applied to radius
private float scale = -1;
private int rainbowRadius;
private float rainbowOpacity;
private final int FRAME_RATE = 30;
private Handler h;
public Logo(Context context, AttributeSet attrs) {
super(context, attrs);
h = new Handler();
inner = BitmapFactory.decodeResource(getResources(), R.drawable.inner);
outer = BitmapFactory.decodeResource(getResources(), R.drawable.outer);
overlay = BitmapFactory.decodeResource(getResources(), R.drawable.overlay);
paint = new Paint();
paint.setAntiAlias(true);
ImageView iv = (ImageView) findViewById(R.id.logo);
iv.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent e) {
switch( e.getAction() ) {
case MotionEvent.ACTION_DOWN:
touched = true;
Log.d("com.example.Logo", "in (" + e.getX() + "x" + e.getY() + ")");
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
touched = false;
Log.d("com.example.Logo", "out (" + e.getX() + "x" + e.getY() + ")");
break;
case MotionEvent.ACTION_MOVE:
break;
}
return false;
}
});
}
private Runnable r = new Runnable() {
@Override
public void run() {
invalidate();
}
};
protected void onDraw(Canvas c) {
// recalculate center, since it may change between frames
centerX = this.getWidth() / 2;
centerY = this.getHeight() / 3;
if( scale==-1 ) scale = (float)this.getWidth()/(overlay.getWidth()+50);
if( rPulse>300 ) dPulse = -1;
else if( rPulse<226 ) dPulse = 1;
rPulse += dPulse * scale;
// TODO: fix that somewhere in future
RadialGradient rGradient = new RadialGradient(centerX, centerY, rPulse, Color.WHITE, Color.TRANSPARENT, Shader.TileMode.CLAMP);
paint.setShader(rGradient);
// paint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN)); // it'll probably be usefull with rainbow circle
c.drawCircle(centerX, centerY, rPulse + 50, paint);
// INNER CIRCLE
if( innerAngle--<1 ) innerAngle = 360;
c.save();
float sc = (float)(scale*1.33333-rPulse*0.001);
c.scale(sc, sc);
c.rotate(innerAngle, centerX/sc, centerY/sc);
c.drawBitmap(inner, centerX/sc - inner.getWidth() / 2, centerY/sc - inner.getHeight() / 2, null);
c.restore();
// OUTER CIRCLE
if( outerAngle++>720 ) outerAngle = 0;
c.save();
c.scale(scale, scale);
c.rotate(outerAngle / 2, centerX/scale, centerY/scale);
c.drawBitmap(outer, centerX/scale - outer.getWidth() / 2, centerY/scale - outer.getHeight() / 2, null);
c.restore();
// TEXT & INFO OVERLAY
c.save();
c.scale(scale, scale);
c.drawBitmap(overlay, centerX/scale - overlay.getWidth() / 2, centerY/scale - overlay.getHeight() / 2, null);
c.restore();
if( touched ) {
innerAngle -= 2;
outerAngle++;
if( rainbowRadius==-1 ) {
// TODO: prepare & launch rainbows
rainbowRadius = 1;
rainbowOpacity = 1;
}
}
if( rainbowRadius>0 && rainbowOpacity>0 ) {
// TODO: move rainbows a little more from inside
rainbowRadius++;
rainbowOpacity /= 2;
// Log.d("com.example.Logo", "R:"+rainbowRadius+", O:"+rainbowOpacity);
}
if( rainbowOpacity<=0 ) {
rainbowRadius = -1;
// TODO: remove rainbows & do a cleanup
}
h.postDelayed(r, FRAME_RATE);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment