0

我想将用户在 android 屏幕上手绘的线条“采样”到一个数组中。x 坐标是等距的,很可能是一维数组的索引。

举个例子来说明我的意思,如果用户绘制一个近似正弦波,我想创建一个数组,可以将该近似正弦波转换为另一个图形,或用于音频合成。

我对一种方法有一个基本的想法,从一个数组开始:

float samples[] = new float[100] // or some other arbitrary number

然后是 ontouch 方法:

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE){
            // assume we translate x into relative index from 0-99 at this point
            if(!xHasPoint(x, samples)){
                drawNewPoint();
                samples[x] = y;
            }
            invalidate();
            return true;
        }
        else{
            invalidate();
            return false;
        }
    }

private static boolean xHasPoint(float x, float[] a){
    if(a[x] == !null){
         return true;
    }
    else{
         return false;
    }
}

所以我的问题是,你能提出一个更好的方法来解决这个问题吗?我预见到必须推断出大量数据......在最后循环遍历数组并从最近的非空值中分配空索引平均值,诸如此类。

另一方面,如果这看起来没有错,我是否遗漏了任何重要的大局考虑?

4

2 回答 2

1

唯一的问题是,一旦您的数组已满,您将无法继续添加更多点。我建议您使用可增长的数据结构。

例如,如果它是一个 ArrayList,您可以继续添加任意数量的点(理论上)。

我不太了解方法hasPoints。理想情况下,在绘制自身时,您应该同时进行采样和插值,并且还可以平滑曲线。

更新:是的,如果是这种情况,那么您只能尝试仅在它移动时注册一个点,例如超过 4 个像素,然后以某种方式通过在前一个点和下一个点之间平滑它来插入和绘制曲线。而且,我猜你还需要捕获 y 点。

于 2012-11-16T06:50:05.340 回答
1

你的逻辑可能有问题。因为一次只触发一个触摸事件,即 ACTION_DOWN 或 ACTION_MOVE。因此您在 if() 块中编写的逻辑将不会被执行。

于 2012-11-16T07:26:31.503 回答