【发布时间】:2014-08-11 17:24:48
【问题描述】:
我有一个自定义视图,我想用它在折线图中显示通过麦克风传入的音频幅度。 得到幅度和我没有问题的所有东西,画线也不是什么问题。
我想要做的是显示从最右边开始向左移动的幅度。因此,对于每个新样本,我想将位图向左平移,然后从最后一个点画一条线到新点。我不确定实现这一目标的最简单方法是什么。我最初能够通过绘制路径并在每个样本的路径中添加一个新点来做到这一点,问题是大约一分钟后路径太大而无法绘制。所以我想了想,想改用缓存位图,在每次迭代时翻译它,然后从最后一点绘制到新点。然而,这很棘手(在实验之后)。当我翻译位图时,它不会将最左边的像素移出位图,它只是将整个位图移动到画布中,我无法将像素写入右侧。 下面是对我正在尝试做的事情的描述:
鉴于此:
我想把它翻译到左边:
然后画一条线到右边空间空间的一个新点
当然,第 2 步和第 3 步应该基本上同时进行。
我怎样才能做到这一点?我对新想法持开放态度,比如可能将所有积分保存为最多 1 个屏幕,并在每次 onDraw 调用时将它们绘制出来。我更愿意将它们保存在位图中并进行某种翻译/剪辑等,以实现同样的目标,而开销可能更少。
private static final int MAX_AMPLITUDE = 32767;
float lx, ly;
private Paint mPaint;
private Bitmap mBitmap;
private Canvas mCanvas;
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(Color.Black);
}
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
if (mBitmap != null) {
mBitmap.recycle();
}
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
height = h;
width = w;
ly = height;
lx = width;
amplitudeDivisor = ((float) MAX_AMPLITUDE / (float) height);
}
@Override
public void onDraw(Canvas canvas) {
mAmplitude = (float)(MAX_AMPLITUDE * Math.random());
float dx = width - delta;
float dy = height - (mAmplitude / amplitudeDivisor);
mCanvas.drawLine(lx, ly, dx, dy, mPaint);
mCanvas.translate(-delta, 0);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
lx = dx;
ly = dy;
delta+=10;
postInvalidateDelayed(200);
}
以上只是一个示例,我现在只是使用幅度的随机值来简化。我已经尝试了很多没有运气的事情。任何帮助将不胜感激。
【问题讨论】:
-
大声告诉我。
-
我应该是一名图形艺术家。 =p
标签: android bitmap android-canvas android-custom-view