Mega Code Archive

 
Categories / Android / UI
 

Pint View

import java.io.File; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.hardware.SensorListener; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.preference.PreferenceManager; import android.util.AttributeSet; import android.view.View; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.drawable.Drawable; class Pint {   private Drawable bgFull, bgEmpty, bgFront;   private Bitmap foam;   private static final float WIDTH = 320;   private static final float HEIGHT = 480;   private static final float TOTAL = WIDTH * HEIGHT - 50 * 320;   private float currentVolume = 0;   float leftY = 480, rightY = 480;   float foamHeight;   public Pint(Drawable bgFull, Drawable bgEmpty, Drawable bgFront, Bitmap foam) {     this.bgEmpty = bgEmpty;     this.bgEmpty.setBounds(0, 0, bgEmpty.getIntrinsicWidth(),         bgEmpty.getIntrinsicHeight());     this.bgFull = bgFull;     this.bgFull.setBounds(0, 0, bgFull.getIntrinsicWidth(),         bgFull.getIntrinsicHeight());     this.bgFront = bgFront;     this.bgFront.setBounds(0, 0, bgFront.getIntrinsicWidth(),         bgFront.getIntrinsicHeight());     this.foam = foam;     foamHeight = foam.getHeight() / 2;   }   private float angle = 0f;   private boolean full = false;   public void setAngle(float angle) {     this.angle = angle;   }   public float getCurrentVolume() {     return currentVolume;   }   public void setCurrentVolume(float currentVolume) {     this.currentVolume = currentVolume;   }   public void draw(Canvas canvas) {     bgEmpty.draw(canvas);     canvas.save();     float emptyHeight = 0;     if (!full) {       currentVolume += (10 * 320);       if (currentVolume > TOTAL) {         full = true;       }     }     emptyHeight = (float) (Math.tan(Math.toRadians(angle)) * WIDTH);     float adjustedHeight = currentVolume / WIDTH; // normal height     adjustedHeight = adjustedHeight <= 0 ? 2f : adjustedHeight;     leftY = Math.max(-1000, HEIGHT - (adjustedHeight + emptyHeight));     rightY = Math.max(-1000, HEIGHT - (adjustedHeight - emptyHeight));     if (currentVolume > WIDTH) {       Path p = new Path();       p.moveTo(0, HEIGHT); // lower left       p.lineTo(WIDTH, HEIGHT);       p.lineTo(WIDTH, rightY);       p.lineTo(0, leftY);       canvas.clipPath(p);       bgFull.draw(canvas);       canvas.restore();       canvas.drawBitmapMesh(foam, 1, 1, new float[] { 0,           leftY - foamHeight, 320, rightY - foamHeight, 0,           leftY + foamHeight, 320, rightY + foamHeight, }, 0, null,           0, null);     }     if (leftY < 5 || rightY < 5) {       currentVolume *= 0.98;// -= (2000f);       currentVolume -= 200f;     }     bgFront.draw(canvas);   } } public class PintView extends View implements SensorListener {   private Pint pint;   private MediaPlayer mp;   private Context ctx;   public PintView(Context context, AttributeSet attrs) {     super(context, attrs);     ctx = context;     SharedPreferences settings = PreferenceManager         .getDefaultSharedPreferences(context);     String skinName = settings.getString("skin", "Default");     loadSkin(skinName);     playRefillSound();   }   public PintView(Context context) {     super(context);   }   private boolean more = true;   private void playRefillSound() {     mp = MediaPlayer.create(ctx, R.raw.refill);//refill.mp3     mp.start();     mp.setOnCompletionListener(new OnCompletionListener() {       @Override       public void onCompletion(MediaPlayer mp) {         mp.release();       }     });   }   public void loadSkin(String name) {     File skinPath = new File(new File("/sdcard/ADRINK"), name);     float volume = pint == null ? 0 : pint.getCurrentVolume();       pint = null;       Drawable full = Drawable.createFromPath(skinPath.getAbsolutePath()           + "/" + "full.png");       Drawable empty = Drawable.createFromPath(skinPath.getAbsolutePath()           + "/" + "empty.png");       Drawable front = Drawable.createFromPath(skinPath.getAbsolutePath()           + "/" + "front.png");       Bitmap foam = BitmapFactory.decodeFile(skinPath.getAbsolutePath()           + "/" + "foam.png");       pint = new Pint(full, empty, front ,foam );     pint.setCurrentVolume(volume);   }   public Pint getPint() {     return pint;   }   @Override   protected void onDraw(Canvas canvas) {     pint.draw(canvas);     if (more) {       invalidate();     }   }   public void setMore(boolean more) {     this.more = more;   }   @Override   public void onAccuracyChanged(int sensor, int accuracy) {     // TODO Auto-generated method stub   }   @Override   public void onSensorChanged(int sensor, float[] values) {     float angle = values[2];     pint.setAngle(0 - angle);   } }