package com.marshalchen.common.uimodule.waveview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.view.ViewGroup; import android.widget.LinearLayout; import com.marshalchen.common.uimodule.animation.R; /** * Created by John on 2014/10/15. */ public class WaveView extends LinearLayout { protected static final int LARGE = 1; protected static final int MIDDLE = 2; protected static final int LITTLE = 3; private int mAboveWaveColor; private int mBlowWaveColor; private int mProgress; private int mWaveHeight; private int mWaveMultiple; private int mWaveHz; private int mWaveToTop; private Wave mWave; private Solid mSolid; private final int DEFAULT_ABOVE_WAVE_COLOR = Color.WHITE; private final int DEFAULT_BLOW_WAVE_COLOR = Color.WHITE; private final int DEFAULT_PROGRESS = 80; public WaveView(Context context, AttributeSet attrs) { super(context, attrs); setOrientation(VERTICAL); //load styled attributes. final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.WaveView, R.attr.waveViewStyle, 0); mAboveWaveColor = attributes.getColor(R.styleable.WaveView_above_wave_color, DEFAULT_ABOVE_WAVE_COLOR); mBlowWaveColor = attributes.getColor(R.styleable.WaveView_blow_wave_color, DEFAULT_BLOW_WAVE_COLOR); mProgress = attributes.getInt(R.styleable.WaveView_waveViewProgress, DEFAULT_PROGRESS); mWaveHeight = attributes.getInt(R.styleable.WaveView_wave_height, MIDDLE); mWaveMultiple = attributes.getInt(R.styleable.WaveView_wave_length, LARGE); mWaveHz = attributes.getInt(R.styleable.WaveView_wave_hz, MIDDLE); attributes.recycle(); mWave = new Wave(context, null); mWave.initializeWaveSize(mWaveMultiple, mWaveHeight, mWaveHz); mWave.setAboveWaveColor(mAboveWaveColor); mWave.setBlowWaveColor(mBlowWaveColor); mWave.initializePainters(); mSolid = new Solid(context, null); mSolid.setAboveWavePaint(mWave.getAboveWavePaint()); mSolid.setBlowWavePaint(mWave.getBlowWavePaint()); addView(mWave); addView(mSolid); setProgress(mProgress); } public void setProgress(int progress) { this.mProgress = progress > 100 ? 100 : progress; computeWaveToTop(); } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (hasWindowFocus) { computeWaveToTop(); } } private void computeWaveToTop() { mWaveToTop = (int) (getHeight() * (1f - mProgress / 100f)); ViewGroup.LayoutParams params = mWave.getLayoutParams(); if (params != null) { ((LayoutParams) params).topMargin = mWaveToTop; } mWave.setLayoutParams(params); } @Override public Parcelable onSaveInstanceState() { // Force our ancestor class to save its state Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.progress = mProgress; return ss; } @Override public void onRestoreInstanceState(Parcelable state) { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setProgress(ss.progress); } private static class SavedState extends BaseSavedState { int progress; /** * Constructor called from {@link android.widget.ProgressBar#onSaveInstanceState()} */ SavedState(Parcelable superState) { super(superState); } /** * Constructor called from {@link #CREATOR} */ private SavedState(Parcel in) { super(in); progress = in.readInt(); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(progress); } public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } }