package com.tencent.tws.assistant.internal.widget; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.drawable.Drawable; import android.view.View; import android.view.WindowManager; public class HorizontalWaveView extends View { private Paint mPaint; private Path mPath; private int delta, mHeight, mWidth; private Bitmap mBitmap; private int mAmplitude; private static final float mPathDelta = 1.0f; public HorizontalWaveView(Context context, int height) { super(context); mPaint = new Paint(); mPaint.setAntiAlias(true); mPath = new Path(); mHeight = height; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBitmap != null) { setPath(); int sc = canvas.saveLayer(0.0f, 0.0f, mBitmap.getWidth(), mBitmap.getHeight(), null, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); canvas.drawBitmap(mBitmap, 0, 0, mPaint); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawPath(mPath, mPaint); mPaint.setXfermode(null); canvas.restoreToCount(sc); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mBitmap != null) setMeasuredDimension(mBitmap.getWidth(), mHeight); mWidth = getWidth(); } public void setPath() { float x = 0.0f; float y = 0.0f; delta+=15; if (delta >= 360) delta = 0; mPath.reset(); for (int i = 0; i < mWidth; i++) { x = i; y = (float)(mAmplitude * Math.sin((i * 0.5f + delta) * Math.PI / 180) + mHeight * 0.98f); if (i == 0) { mPath.moveTo(x, y); } else { mPath.lineTo(x, y); } } mPath.lineTo(mWidth, mHeight+mPathDelta); mPath.lineTo(0, mHeight+mPathDelta); mPath.close(); if (mAmplitude != 0) { invalidate(); } } public void setStackedDrawable(Drawable drawable) { mBitmap = Bitmap.createBitmap(((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(), mHeight, Config.ARGB_8888); Canvas canvas = new Canvas(mBitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); } public void setAmplitude(int amplitude) { mAmplitude = amplitude; invalidate(); } public int getAmplitude() { return mAmplitude; } }