Created
          January 18, 2013 19:18 
        
      - 
      
- 
        Save meeDamian/4567478 to your computer and use it in GitHub Desktop. 
    How do I optimize RadialGradient usage? How do I do it better?
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | 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