github地址:https://github.com/sddyljsx/Android-SurfView-WaveView
package neal.canvas;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;/** * Created by songxun.sx on 2015/8/14. */public class MyView extends View {    NextFrameAction nextFrameAction;    RectF rectF;    Paint paint;    Paint paint2;    Paint paint3;    Path path;    Path path1;    int width;    int height;    int w = 0;    double startTime;    int waveAmplitude;    int waveRange;    int highLevel;    public MyView(Context context) {        super(context);    }    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    private void init() {        nextFrameAction = new NextFrameAction();        width = getMeasuredWidth();        height = getMeasuredHeight();        waveRange = width;        rectF = new RectF(5, 5, width - 5, height - 5);        paint = new Paint();        paint2 = new Paint();        paint3=new Paint();        paint.setAntiAlias(true);        paint.setColor(Color.RED);        paint3.setAntiAlias(true);        paint3.setColor(0x99ff0000);        paint2.setAntiAlias(true);        paint2.setStyle(Paint.Style.STROKE);        paint2.setStrokeWidth(5);        paint2.setColor(Color.RED);        path = new Path();        path1 = new Path();        startTime = System.currentTimeMillis();        waveAmplitude = 20;        highLevel = (int) (height * (0.5) + waveAmplitude);    }    protected class NextFrameAction implements Runnable {        @Override        public void run() {            path.reset();            path1.reset();            path.addArc(rectF, 90.0f - 145.0f / 2.0f, 145.0f);            path1.addArc(rectF, 90.0f - 145.0f / 2.0f, 145.0f);            w += 5;            if (w >= (width - 5) * 2) {                w = 0;            }            for (int i = 5; i < width - 5; i++) {                path.lineTo(i, (float) (highLevel + waveAmplitude * Math.cos((float) (i + w) / (float) (width - 5) * Math.PI)));                path1.lineTo(i, (float) (highLevel - waveAmplitude * Math.cos((float) (i + w) / (float) (width - 5) * Math.PI)));            }            path.close();            path1.close();            invalidate();        }    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        init();    }    @Override    protected void onDraw(Canvas canvas) {        canvas.drawCircle(width / 2, height / 2, width / 2 - 5, paint2);        //canvas.drawArc(rectF,90.0f-145.0f/2.0f,145.0f,false,paint);        canvas.drawPath(path, paint);        canvas.drawPath(path1,paint3);        postDelayed(nextFrameAction, 4);    }}
surfaceview代码:
package neal.canvas;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PixelFormat;import android.graphics.RectF;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * Created by songxun.sx on 2015/8/17. */public class MyView2 extends SurfaceView implements SurfaceHolder.Callback {    SurfaceHolder surfaceHolder;    NextFrameAction nextFrameAction;    RectF rectF;    Paint paint;    Paint paint2;    Paint paint3;    Path path;    Path path1;    int width;    int height;    int w = 0;    double startTime;    int waveAmplitude;    int waveRange;    int highLevel;    Canvas canvas;    public MyView2(Context context) {        super(context);    }    public MyView2(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyView2(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    private void init() {        nextFrameAction = new NextFrameAction();        width = getMeasuredWidth();        height = getMeasuredHeight();        waveRange = width;        rectF = new RectF(5, 5, width - 5, height - 5);        paint = new Paint();        paint2 = new Paint();        paint3 = new Paint();        paint.setAntiAlias(true);        paint.setColor(Color.RED);        paint3.setAntiAlias(true);        paint3.setColor(0x99ff0000);        paint2.setAntiAlias(true);        paint2.setStyle(Paint.Style.STROKE);        paint2.setStrokeWidth(5);        paint2.setColor(Color.RED);        path = new Path();        path1 = new Path();        startTime = System.currentTimeMillis();        waveAmplitude = 20;        highLevel = (int) (height * (0.5) + waveAmplitude);        surfaceHolder = this.getHolder();        //为SurfaceHolder添加一个回调函数        surfaceHolder.addCallback(this);        setZOrderOnTop(true);//设置画布  背景透明        surfaceHolder.setFormat(PixelFormat.TRANSLUCENT);    }    protected class NextFrameAction implements Runnable {        @Override        public void run() {            path.reset();            path1.reset();            path.addArc(rectF, 90.0f - 145.0f / 2.0f, 145.0f);            path1.addArc(rectF, 90.0f - 145.0f / 2.0f, 145.0f);            w += 5;            if (w >= (width - 5) * 2) {                w = 0;            }            for (int i = 5; i < width - 5; i++) {               path.lineTo(i, (float) (highLevel + waveAmplitude * Math.cos((float) (i + w) / (float) (width - 5) * Math.PI)));                path1.lineTo(i, (float) (highLevel - waveAmplitude * Math.cos((float) (i + w) / (float) (width - 5) * Math.PI)));            }            path.close();            path1.close();            Draw();        }    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        init();    }    protected void Draw() {        canvas = surfaceHolder.lockCanvas();        canvas.drawColor(Color.WHITE);        canvas.drawCircle(width / 2, height / 2, width / 2 - 5, paint2);        canvas.drawArc(rectF,90.0f-145.0f/2.0f,145.0f,false,paint);        canvas.drawPath(path, paint);        canvas.drawPath(path1, paint3);        surfaceHolder.unlockCanvasAndPost(canvas);    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        ScheduledExecutorService executorService= new ScheduledThreadPoolExecutor(1);        NextFrameAction nextFrameAction=new NextFrameAction();        executorService.scheduleAtFixedRate(nextFrameAction, 4, 4, TimeUnit.MILLISECONDS);    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {    }}


   


效果图:




更多相关文章

  1. 【Unity和Android相互调用】AndroidJavaProxy的使用(以C#为主导)
  2. android之检查service运行状态函数
  3. 《第一行代码Android(第3版)》— Android(安卓)书籍
  4. Android(安卓)seekbar 滑动时上方显示进度
  5. 3. android 自动完成文本框
  6. Android应用程序资源管理器(Asset Manager)的创建过程分析
  7. Android(安卓)React Native使用原生模块
  8. Android电话来电流程源码分析
  9. 箭头函数的基础使用

随机推荐

  1. Android(安卓)UI开发第二十四篇――Actio
  2. Android中线程池的使用分析
  3. Android(安卓)基于百度语音的语音交互功
  4. 2017上半年技术文章集合【Android】—184
  5. 乔布斯对 Android(安卓)如此愤怒:不惜发起
  6. Android(安卓)对Path的旋转效果的拓展
  7. Android(安卓)Handler 消息通信机制
  8. Android项目总结之社会化分享
  9. android中adb不是内部或者外部指令以及丢
  10. 第2章 初识Android(安卓)App(第2讲)