1515import androidx .annotation .Nullable ;
1616
1717import com .zjy .audiovisualize .R ;
18- import com .zjy .audiovisualize .constants .VisualizeMode ;
1918import com .zjy .audiovisualize .media .MediaManager ;
2019import com .zjy .audiovisualize .media .MediaManagerListener ;
2120import com .zjy .audiovisualize .utils .LogUtils ;
2221import com .zjy .audiovisualize .visualize .VisualizeCallback ;
2322import com .zjy .audiovisualize .visualize .VisualizerHelper ;
2423
25- import static com .zjy .audiovisualize .constants .VisualizeMode .CIRCLE ;
26- import static com .zjy .audiovisualize .constants .VisualizeMode .HORIZONTAL_LINE_BOTTOM ;
27- import static com .zjy .audiovisualize .constants .VisualizeMode .HORIZONTAL_LINE_TOP ;
28- import static com .zjy .audiovisualize .constants .VisualizeMode .REFLECT ;
29- import static com .zjy .audiovisualize .constants .VisualizeMode .WAVE ;
30-
3124/**
3225 * Date: 2020/10/16
3326 * Author: Yang
3427 * Describe: a view for visualizing audio, showing spectrum with different ui mode
3528 */
36- public class AudioVisualizeView extends View implements MediaManagerListener , VisualizeCallback {
29+ public abstract class AudioVisualizeView extends View implements MediaManagerListener , VisualizeCallback {
3730
3831 /**
3932 * the count of spectrum
4033 */
41- private int mSpectrumCount ;
34+ protected int mSpectrumCount ;
4235 /**
4336 * the margin of adjoin spectrum
4437 */
45- private float mItemMargin ;
38+ protected float mItemMargin ;
4639 /**
4740 * ratio of spectrum, between 0.0f - 2.0f
4841 */
49- private float mSpectrumRatio ;
42+ protected float mSpectrumRatio ;
5043 /**
5144 * the width of every spectrum
5245 */
53- private float mStrokeWidth ;
46+ protected float mStrokeWidth ;
5447 /**
5548 * the color of drawing spectrum
5649 */
57- private int mColor ;
58- /**
59- * provide different mode to show
60- * {@link VisualizeMode#HORIZONTAL_LINE_TOP}
61- * {@link VisualizeMode#HORIZONTAL_LINE_BOTTOM}
62- * {@link VisualizeMode#CIRCLE}
63- * {@link VisualizeMode#REFLECT}
64- * {@link VisualizeMode#WAVE}
65- */
66- private int mShowMode ;
50+ protected int mColor ;
6751 /**
6852 * control enable of visualize
6953 */
70- private boolean isVisualizationEnabled = true ;
54+ protected boolean isVisualizationEnabled = true ;
7155 /**
7256 * audio data transform by hypot
7357 */
7458 protected byte [] mRawAudioBytes ;
7559
76- private RectF mRect ;
77- private Paint mPaint ;
78- private Path mPath ;
60+ protected RectF mRect ;
61+ protected Paint mPaint ;
62+ protected Path mPath ;
63+ protected float centerX , centerY ;
7964
80- private MediaManager mediaManager ;
81- private VisualizerHelper visualizerHelper ;
65+ protected MediaManager mediaManager ;
66+ protected VisualizerHelper visualizerHelper ;
8267
8368 public AudioVisualizeView (Context context ) {
8469 this (context , null );
@@ -103,7 +88,7 @@ private void handleStyleable(Context context, AttributeSet attrs, int defStyle)
10388 mColor = ta .getColor (R .styleable .AudioVisualizeView_visualize_color , Color .WHITE );
10489 mSpectrumCount = ta .getInteger (R .styleable .AudioVisualizeView_visualize_count , 60 );
10590 mSpectrumRatio = ta .getFloat (R .styleable .AudioVisualizeView_visualize_ratio , 1.0f );
106- mShowMode = ta . getInteger ( R . styleable . AudioVisualizeView_visualize_mode , HORIZONTAL_LINE_TOP );
91+ handleAttr ( ta );
10792 } catch (Exception e ) {
10893 e .printStackTrace ();
10994 } finally {
@@ -211,73 +196,23 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
211196 protected void onLayout (boolean changed , int left , int top , int right , int bottom ) {
212197 super .onLayout (changed , left , top , right , bottom );
213198 mRect .set (0 , 0 , getWidth (), getHeight () - 50 );
199+ centerX = mRect .width () / 2 ;
200+ centerY = mRect .height () / 2 ;
214201 }
215202
216203 @ Override
217204 protected void onDraw (Canvas canvas ) {
218-
219205 super .onDraw (canvas );
220-
221206 if (mRawAudioBytes == null ) {
222207 return ;
223208 }
224- float centerX = mRect .width () / 2 ;
225- float centerY = mRect .height () / 2 ;
226- float radius = 150 ;
227- switch (mShowMode ) {
228- case CIRCLE :
229- mStrokeWidth = (float ) ((Math .PI * 2 * radius - (mSpectrumCount - 1 ) * mItemMargin ) / mSpectrumCount * 1.0f );
230- mPaint .setStyle (Paint .Style .STROKE );
231- mPaint .setStrokeWidth (2 );
232- canvas .drawCircle (centerX , centerY , radius , mPaint );
233- break ;
234- default :
235- mStrokeWidth = (mRect .width () - (mSpectrumCount - 1 ) * mItemMargin ) / mSpectrumCount * 1.0f ;
236-
237- break ;
238- }
239- mPaint .setStrokeWidth (mStrokeWidth );
240- mPaint .setStyle (Paint .Style .FILL );
241- mPath .moveTo (0 , centerY );
242- for (int i = 0 ; i < mSpectrumCount ; i ++) {
243- if (mRawAudioBytes [i ] < 0 ) {
244- mRawAudioBytes [i ] = 127 ;
245- }
246-
247- switch (mShowMode ) {
248- case HORIZONTAL_LINE_TOP :
249- canvas .drawLine (mRect .width () * i / mSpectrumCount , mRect .height () / 2 ,mRect .width () * i / mSpectrumCount , 2 + mRect .height () / 2 - mRawAudioBytes [i ], mPaint );
250- break ;
251- case HORIZONTAL_LINE_BOTTOM :
252- canvas .drawLine (mRect .width () * i / mSpectrumCount , mRect .height () / 2 ,mRect .width () * i / mSpectrumCount , 2 + mRect .height () / 2 + mRawAudioBytes [i ], mPaint );
253- break ;
254- case CIRCLE :
255- double angel = ((360d / mSpectrumCount *1.0d ) * (i +1 ));
256- double startX = centerX + (radius + mStrokeWidth /2 ) * Math .sin (Math .toRadians (angel ));
257- double startY = centerY + (radius + mStrokeWidth /2 ) * Math .cos (Math .toRadians (angel ));
258- double stopX = centerX + (radius + mStrokeWidth /2 + mSpectrumRatio * mRawAudioBytes [i ]) * Math .sin (Math .toRadians (angel ));
259- double stopY = centerY + (radius + mStrokeWidth /2 + mSpectrumRatio * mRawAudioBytes [i ]) * Math .cos (Math .toRadians (angel ));
260- canvas .drawLine ((float ) startX , (float ) startY , (float ) stopX , (float ) stopY , mPaint );
261- break ;
262- case REFLECT :
263- canvas .drawLine (mRect .width () * i / mSpectrumCount , mRect .height () / 2 ,mRect .width () * i / mSpectrumCount , 2 + mRect .height () / 2 - mSpectrumRatio * mRawAudioBytes [i ], mPaint );
264- canvas .drawLine (mRect .width () * i / mSpectrumCount , mRect .height () / 2 ,mRect .width () * i / mSpectrumCount , 2 + mRect .height () / 2 + mSpectrumRatio * mRawAudioBytes [i ], mPaint );
265- break ;
266- case WAVE :
267- mPath .lineTo (mRect .width () * i / mSpectrumCount , 2 + mRect .height () / 2 + mRawAudioBytes [i ]);
268- break ;
269- default :
270- break ;
271- }
272- }
273- mPath .lineTo (mRect .width (), centerY );
274- mPath .close ();
275- if (mShowMode == WAVE ) {
276- canvas .drawPath (mPath , mPaint );
277- }
278- mPath .reset ();
209+ drawChild (canvas );
279210 }
280211
212+ protected abstract void handleAttr (TypedArray typedArray );
213+
214+ protected abstract void drawChild (Canvas canvas );
215+
281216 public void setColor (int color ) {
282217 this .mColor = color ;
283218 this .mPaint .setColor (this .mColor );
0 commit comments