整理了一个 android 上的波形图及柱状图绘制控件





[说明:以前画过波形图,最近又需要画,略不同,但还得重复写。在网上搜了一下,只找到一个复杂的框架,而我们往往只需要画简单的波形或柱状图。所以我整理提取了过去的代码,有了这个简洁的波形及柱状图控件。实现上很简单,关键在于,怎样简单,又可灵活定制来适用于通常的应用场景。比如在画图之外增加了进度条及触碰反馈功能,就可适用于录音及播音的场景]

SimpleWaveform 显示一串数据为波形图,或者条状图

SimpleWaveform 可以高度定制:

(1)可以显示原始的正负数据,也可以取绝对值来显示数据的幅度
(2)数据可以直接对应像素,也可以是满幅的百分比。控件会自动检测自己的宽度及高度像素
(3)可以选择显示:柱状条 /峰值轮廓 /x 轴
(4)可以选择怎样连接峰值来画出轮廓
(5)其 x 轴可以放在控件的顶部 /中间 /底部
(6)可以设定柱状条的宽度与间隔
(7)可以设定所有的笔,包括柱条 /轮廓 /x 轴 /背景,前两者是两支笔
(8)用两支笔来画前后两部分,这样就有不同的颜色来标识进度
(9)波形图可以从左边或右边开始
(10)如果你手指碰触视图,监听器可以返回碰触的柱条位置

常见用法

(1)当你录音时可以用 SimpleWaveform 来显示声波,请参考 advance demo1
(2)嵌入为 recycler view 的元素,通过左右滑动来显示很长的波形图,请参考 advance demo2

从 github 下载 demo apk

在 github 上查看 SimpleWaveform 源码

demo1: 显示正负数据
此处输入图片的描述
demo2: 柱状图
此处输入图片的描述
demo3: 显示振幅绝对值
此处输入图片的描述
demo4: 显示声波
此处输入图片的描述
advance demo1: 显示录音得到音频输入
此处输入图片的描述
advance demo2: 嵌入到横向的 recycler view 中显示很长时间的录音
此处输入图片的描述

控件用法:

(1)直接拷贝 SimpleWaveform.java 到项目. 目前我还不懂得怎么制作一个 gradle 模块.
(2)查看及拷贝 demo1~4 及 advance demo1~2 代码,位于文件 SimpleWaveformDemo.java 中. 使用非常的直观简单,并且有缺省设置,只要添加数据链表,然后可以省略后续设置并直接显示.

这里是例子 demo3 ,看一下注释即可:

private void demo3() {

    //restore default setting, you can omit all following setting and goto the final refresh() show
    simpleWaveform.init();

    LinkedList<Integer> ampList = new LinkedList<>();
    //generate random data
    for (int i = 0; i < 80; i++) {
        ampList.add(randomInt(-50, 50));
    }
    simpleWaveform.setDataList(ampList);//input data to show

    //define bar gap
    simpleWaveform.barGap = 30;

    //define x-axis direction
    simpleWaveform.modeDirection = SimpleWaveform.MODE_DIRECTION_LEFT_RIGHT;

    //define if draw opposite pole when show bars
    simpleWaveform.modeAmp = SimpleWaveform.MODE_AMP_ABSOLUTE;
    //define if the unit is px or percent of the view's height
    simpleWaveform.modeHeight = SimpleWaveform.MODE_HEIGHT_PERCENT;
    //define where is the x-axis in y-axis
    simpleWaveform.modeZero = SimpleWaveform.MODE_ZERO_CENTER;
    //if show bars?
    simpleWaveform.showBar = true;

    //define how to show peaks outline
    simpleWaveform.modePeak = SimpleWaveform.MODE_PEAK_PARALLEL;
    //if show peaks outline?
    simpleWaveform.showPeak = true;

    //show x-axis
    simpleWaveform.showXAxis = true;
    xAxisPencil.setStrokeWidth(1);
    xAxisPencil.setColor(0x88ffffff);//the first 0x88 is transparency, the next 0xffffff is color
    simpleWaveform.xAxisPencil = xAxisPencil;

    //define pencil to draw bar
    barPencilFirst.setStrokeWidth(15);
    barPencilFirst.setColor(0xff1dcf0f);
    simpleWaveform.barPencilFirst = barPencilFirst;
    barPencilSecond.setStrokeWidth(15);
    barPencilSecond.setColor(0xff1dcfcf);
    simpleWaveform.barPencilSecond = barPencilSecond;

    //define pencil to draw peaks outline
    peakPencilFirst.setStrokeWidth(5);
    peakPencilFirst.setColor(0xfffe2f3f);
    simpleWaveform.peakPencilFirst = peakPencilFirst;
    peakPencilSecond.setStrokeWidth(5);
    peakPencilSecond.setColor(0xfffeef3f);
    simpleWaveform.peakPencilSecond = peakPencilSecond;

    //the first part will be draw by PencilFirst
    simpleWaveform.firstPartNum = 20;//first 20 bars will be draw by first pencil

    //define how to clear screen
    simpleWaveform.clearScreenListener = new SimpleWaveform.ClearScreenListener() {
        @Override
        public void clearScreen(Canvas canvas) {
            canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        }
    };
    // set touch listener
    simpleWaveform.progressTouch = new SimpleWaveform.ProgressTouch() {
        @Override
        public void progressTouch(int progress, MotionEvent event) {
            Log.d("", "you touch at: " + progress);
            simpleWaveform.firstPartNum = progress;//set touch position back to its progress
            simpleWaveform.refresh();
        }
    };
    //show...
    simpleWaveform.refresh();

    demo_introduce.setText("demo3: amplitude bar");
}

<maxproj.com.simplewaveform.SimpleWaveform
    android:id="@+id/simplewaveform"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:layout_margin="10dp" />
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的示例代码,可以绘制一个简单的柱状图: 首先,在你的布局xml文件中添加一个自定义View: ```xml <com.example.myapplication.BarChartView android:id="@+id/barChartView" android:layout_width="match_parent" android:layout_height="300dp" /> ``` 然后,在你的java文件中实现这个自定义View: ```java public class BarChartView extends View { private Paint mPaint; private List<Bar> mBars; public BarChartView(Context context) { super(context); init(); } public BarChartView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public BarChartView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 初始化画笔 mPaint = new Paint(); mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.FILL); mPaint.setAntiAlias(true); mPaint.setTextSize(20); // 初始化柱状图数据 mBars = new ArrayList<>(); mBars.add(new Bar("Jan", 100)); mBars.add(new Bar("Feb", 200)); mBars.add(new Bar("Mar", 150)); mBars.add(new Bar("Apr", 300)); mBars.add(new Bar("May", 250)); mBars.add(new Bar("Jun", 180)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制坐标轴 mPaint.setColor(Color.BLACK); canvas.drawLine(50, 250, 450, 250, mPaint); canvas.drawLine(50, 250, 50, 50, mPaint); // 绘制柱状图 float barWidth = (400 - mBars.size() * 10) / mBars.size(); for (int i = 0; i < mBars.size(); i++) { Bar bar = mBars.get(i); float left = 60 + i * (barWidth + 10); float top = 250 - bar.getHeight(); float right = left + barWidth; float bottom = 250; canvas.drawRect(left, top, right, bottom, mPaint); // 绘制柱状图上的文字 mPaint.setColor(Color.WHITE); String text = bar.getLabel() + " " + bar.getValue(); float textWidth = mPaint.measureText(text); float textX = left + (barWidth - textWidth) / 2; float textY = top - 10; canvas.drawText(text, textX, textY, mPaint); } } private static class Bar { private String label; private float value; public Bar(String label, float value) { this.label = label; this.value = value; } public String getLabel() { return label; } public float getValue() { return value; } public float getHeight() { return value / 300 * 200; } } } ``` 这个自定义View会绘制一个包含6个柱状条的简单柱状图,并且每个柱状条都包含一个标签和一个值。你可以根据你的需求修改这个自定义View来绘制一个更加复杂的柱状图
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值