利用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
- 利用surfaceview实现示波器WaveView
- 利用SurfaceView显示正弦曲线,仿造示波器
- SurfaceView实现简单正余弦示波器
- SurfaceView开发示波器<略>
- 利用surfaceview实现转盘效果
- 利用SurfaceView实现转盘抽奖
- SurfaceView使用实例(示波器)
- SurfaceView使用实例(示波器)
- Android 基于SurfaceView 开发示波器
- Android实现波浪效果 - WaveView
- 安卓利用SurfaceView实现拍照功能
- Android利用SurfaceView 实现水印相机,仿钉钉
- 利用SurfaceView实现墨迹天气雪花效果
- SurfaceView的一个小应用:开发示波器
- 水流波动效果的实现WaveView
- Android WaveView实现水流波动效果
- Android 利用SurfaceView实现一个简单的计时器
- 利用SurfaceView来实现android本地视频播放
- arm-linux-strip
- Android okHttp框架
- 【腾讯云的1001种玩法】利用腾讯云快速搭建一个Alerts服务
- 六数码问题
- Java 三种会抛 ConcurrentModificationException 异常的代码实例
- 利用surfaceview实现示波器WaveView
- 使用HTTP协议访问网络--HttpURLConnection
- onchange与oninput的区别
- python打包分发
- POJ 1258 Agri-Net 最小生成树 prim
- RecyclerView多布局的简单实现
- AlexNet学习笔记-论文翻译和理解(一)
- Redis中常用的命令
- VS2015创建C语言工程