利用surfaceview实现示波器WaveView

来源:互联网 发布:淘宝优惠券微信群号码 编辑:程序博客网 时间:2024/04/28 07:13

本文借鉴《疯狂Android讲义》中指导,实现示波器显示的View。

代码如下:


import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class WaveView extends SurfaceView implements SurfaceHolder.Callback {    private final String TAG = "WaveView";    private SurfaceHolder holder;    private Paint paint;    private int HEIGHT = 320;//画布默认高度    private int WIDTH = 320;         //画布默认宽度    private int X_OFFSET = 5;    private int cx = X_OFFSET;    private int centerY = HEIGHT / 2;    private int[] data;    private int xPosition = 0;    public WaveView(Context context) {        super(context);    }    public WaveView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public WaveView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init() {        paint = new Paint();        paint.setColor(Color.RED);        paint.setStrokeWidth(3);        holder = this.getHolder();        holder.addCallback(this);        //Log.d(TAG, "init: " + holder.toString());    }    public void setPaintColor(int color) {        paint.setColor(color);    }    public void setPaintWidth(int width) {        paint.setStrokeWidth(width);    }    public int[] getData() {        return data;    }    public void setData(int[] data) {        this.data = data;    }    public int getXPosition() {        return xPosition;    }    public void setXPosition(int xPosition) {        this.xPosition = xPosition;    }    public int getCenterY() {        return centerY;    }    public void setCenterY(int centerY) {        this.centerY = centerY;    }    public void startWave() {        Message message = new Message();        message.what = 0;        mHandler.sendMessageDelayed(message, 500);         //要等SurfaceView展示出来了。    }    private void drawBack(SurfaceHolder holder) {        Canvas canvas = holder.lockCanvas();        canvas.drawColor(Color.WHITE);     //设置白色背景        Paint p = new Paint();        p.setColor(Color.BLACK);        p.setStrokeWidth(2);        //绘制坐标轴        centerY = HEIGHT / 2;        canvas.drawLine(X_OFFSET, centerY, WIDTH, centerY, p);        canvas.drawLine(X_OFFSET, 0, X_OFFSET, HEIGHT, p);        holder.unlockCanvasAndPost(canvas);        holder.lockCanvas(new Rect(0, 0, 0, 0));        holder.unlockCanvasAndPost(canvas);    }    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case 0:                    cx = X_OFFSET;                    int len = data.length;                    if (len > 0) {                        drawBack(holder);                        for (; xPosition < len; xPosition++, cx++) {                            Log.d(TAG, String.valueOf(xPosition));                            int yPosition = centerY - data[xPosition];      //平移图像位置;                            Canvas canvas = holder.lockCanvas(new Rect(cx, yPosition - 2, cx + 2, yPosition + 2));                            canvas.drawPoint(cx, yPosition, paint);                            holder.unlockCanvasAndPost(canvas);                            try {                                Thread.sleep(30);                            } catch (Exception e) {                                e.printStackTrace();                            }                        }                    }                    break;                default:                    break;            }            super.handleMessage(msg);        }    };    @Override    public void surfaceCreated(SurfaceHolder holder) {        WIDTH = this.getWidth() - 10;//不用画到画布末尾        HEIGHT = this.getHeight();        drawBack(holder);    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        drawBack(holder);        Log.d(TAG, "changed: " + holder.toString());    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {    }}

在activity中使用:


WaveView waveView = (WaveView) findViewById(R.id.wv);int[] data = new int[800];for (int i = 0; i < 800; i++) {    data[i] = (int) (100 * Math.sin((i) * 2 * Math.PI / 150));   //放大100倍    //data[i] = (int) (100 * Math.cos((i) * 2 * Math.PI / 150));    //放大100倍}waveView.setData(data);waveView.startWave();




0 0
原创粉丝点击