package com.plattysoft.leonids;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
class ParticleFieldView extends View implements ParticleField {
private View mMimicDimensionFrom;
private volatile List<Particle> mParticles;
private Controller mController;
private class Controller implements ParticleFieldController {
private ViewGroup mParentView;
private int[] mParentLocation;
public Controller(Activity a, int parentResId) {
mParentLocation = new int[2];
mParentView = (ViewGroup) a.findViewById(parentResId);
setParentViewGroup(mParentView);
}
public Controller(ViewGroup parentView) {
mParentLocation = new int[2];
setParentViewGroup(parentView);
}
/**
* Initializes the parent view group.
* Drawing will be done to a child that is added to this view. So this view
* needs to allow displaying an arbitrary sized view on top of its other content.
* @param viewGroup The view group to use.
*/
public void setParentViewGroup(ViewGroup viewGroup) {
mParentView = viewGroup;
mParentView.getLocationInWindow(mParentLocation);
}
@Override
public int getPositionInParentX() {
return mParentLocation[0];
}
@Override
public int getPositionInParentY() {
return mParentLocation[1];
}
@Override
public void prepareEmitting(List<Particle> particles) {
// Add a full size view to the parent view
setParticles(particles);
setMimicDimensionView(mParentView);
mParentView.addView(ParticleFieldView.this);
}
@Override
public void onUpdate() {
ParticleFieldView.this.postInvalidate();
}
@Override
public void onCleanup(ParticleSystem toClean) {
mParentView.removeView(ParticleFieldView.this);
mParentView.postInvalidate();
}
}
public ParticleFieldView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public ParticleFieldView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ParticleFieldView(Context context) {
super(context);
init();
}
@Override
public ParticleFieldController getParticleController() {
return mController;
}
public void setMimicDimensionView(View mimicDimensionFrom) {
mMimicDimensionFrom = mimicDimensionFrom;
}
private void init() {
setWillNotDraw(false);
}
public ParticleFieldView initController(Activity a, int parentResId) {
mController = new Controller(a, parentResId);
return this;
}
public ParticleFieldView initController(ViewGroup parentView) {
mController = new Controller(parentView);
return this;
}
@Override
public void setParticles(List<Particle> particles) {
mParticles = particles;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mMimicDimensionFrom != null) {
setMeasuredDimension(mMimicDimensionFrom.getWidth(), mMimicDimensionFrom.getHeight());
}
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
final List<Particle> particles = mParticles;
// Draw all the particles
if (particles != null) {
synchronized (particles) {
for (int i = 0; i < particles.size(); i++) {
particles.get(i).draw(canvas);
}
}
}
}
}