Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带移动线的音频可视化android代码_Android - Fatal编程技术网

带移动线的音频可视化android代码

带移动线的音频可视化android代码,android,Android,我需要编写音频可视化代码,显示图形和指示当前位置的移动线。我已经编写了代码来获取视图中的图形。我从MediaRecorder获得振幅,并使用Canvas.drawline获得图形。为了得到指示当前位置的移动线,它不断变化-我该怎么做?我画的矩形或直线的形状不断地被画出来。如何使前一个(直线或矩形)消失?或者只是让形状移动到新的坐标 我只是发布VisualizerView代码 public class VisualizerView extends View { private static fi

我需要编写音频可视化代码,显示图形和指示当前位置的移动线。我已经编写了代码来获取视图中的图形。我从MediaRecorder获得振幅,并使用Canvas.drawline获得图形。为了得到指示当前位置的移动线,它不断变化-我该怎么做?我画的矩形或直线的形状不断地被画出来。如何使前一个(直线或矩形)消失?或者只是让形状移动到新的坐标

我只是发布VisualizerView代码

public class VisualizerView extends View {

private static final int LINE_WIDTH = 5; //width of visualier lines
private static final int LINE_SCALE = 150; //scales visualiEr lines
private List<Float> amplitudes;
private int viewWidth;
private int viewHeight;
private Paint linePaint; //line drawing characteristics
private Paint currentLinePointer;
ShapeDrawable mRect;

public VisualizerView (Context ctx, AttributeSet attrs){
    super (ctx, attrs);
    linePaint = new Paint ();
    linePaint.setColor(Color.GREEN);
    linePaint.setStrokeWidth(LINE_WIDTH);

    currentLinePointer = new Paint();
    currentLinePointer.setColor(Color.TRANSPARENT);
    currentLinePointer.setStrokeWidth(LINE_WIDTH);

    mRect = new ShapeDrawable(new RectShape());
    mRect.getPaint().setColor(Color.RED);

}

//when dimensions of view changes
@Override
public void onSizeChanged (int w, int h, int oldW, int newH){
    viewWidth = w;
    viewHeight = h;
    amplitudes = new ArrayList<Float>(viewWidth/LINE_WIDTH);

}

@Override
public void onDraw (Canvas canvas){
    int middle = viewHeight/2; 
    int curX = 0;

    //for each item in amplitudes Arraylist
    for (float power: amplitudes){
        float scaledHeight = power/LINE_SCALE; //scale the power
        curX += LINE_WIDTH ; //imcrease by line widht

       // currentLinePointer.setColor(Color.RED);
       // canvas.drawLine(curX, middle + viewHeight/2,  curX, middle -viewHeight/2, currentLinePointer);

        mRect.setVisible(true, true);
        mRect.setBounds ((int)curX , middle - viewHeight/2, (int) curX+ LINE_WIDTH, middle + viewHeight/2);
        mRect.draw(canvas);
        canvas.drawLine(curX, middle + scaledHeight/2, curX, middle - scaledHeight/2, linePaint);

      //THIS RECTANGLE NEEDS TO KEEP MOVING .... CANNOT FIGURE HOW TO MOVE IT.
        mRect.setVisible(false, false);
        mRect.invalidateSelf();

    }

}

public void clear (){
    amplitudes.clear();
}

public void addAmplitude (float amplitude){
    amplitudes.add(amplitude);

    if (amplitudes.size() * LINE_WIDTH >= viewWidth){
        amplitudes.remove(0); //remove the oldest width
    }
}

}
public类可视化视图扩展视图{
私有静态final int LINE_WIDTH=5;//可视化程序行的宽度
私有静态最终整型线_SCALE=150;//缩放可视器线
私有列表振幅;
私有int视图宽度;
私家车内景高度;
私有绘制线条绘制;//线条绘制特征
专用线指针;
可成形磁共振成像;
公共可视化视图(上下文ctx、属性集属性){
超级(ctx、ATTR);
linePaint=新油漆();
linePaint.setColor(颜色为绿色);
linePaint.设置行程宽度(线宽);
currentLinePointer=新绘制();
currentLinePointer.setColor(Color.TRANSPARENT);
currentLinePointer.setStrokeWidth(线宽);
mRect=新的ShapedRavable(新的RectShape());
mRect.getPaint().setColor(Color.RED);
}
//当视图的尺寸发生变化时
@凌驾
已更改尺寸上的公共空隙(整数w、整数h、整数oldW、整数newH){
视宽=w;
视高=h;
振幅=新阵列列表(视图宽度/线宽);
}
@凌驾
公共空白onDraw(画布){
int middle=视图高度/2;
int-curX=0;
//对于振幅数组列表中的每个项目
用于(浮动功率:振幅){
float scaledHeight=power/LINE\u SCALE;//缩放功率
curX+=线宽;//按线宽增加
//currentLinePointer.setColor(颜色为红色);
//画布.绘制线(curX,middle+viewHeight/2,curX,middle-viewHeight/2,currentLinePointer);
mRect.setVisible(真,真);
mRect.setBounds((int)curX,中间-视图高度/2,(int)curX+线宽,中间+视图高度/2);
绘画(画布);
画布.抽绳(curX,中间+缩放高度/2,curX,中间-缩放高度/2,linePaint);
//此矩形需要继续移动…无法确定如何移动它。
mRect.setVisible(假,假);
mRect.invalidateSelf();
}
}
公共空间清除(){
振幅。清除();
}
公共振幅(浮动振幅){
振幅。添加(振幅);
if(振幅.size()*线宽>=视图宽度){
振幅。删除(0);//删除最早的宽度
}
}
}

一个相当愚蠢的错误。我需要让线或矩形代码在当前位置线之外,在onDraw中绘制振幅的循环之外。解决了

    @Override
    public void onDraw (Canvas canvas){
    int middle = viewHeight/2; //middle of view
    int curX = 0;

    //for each item in amplitudes Arraylist
    for (float power: amplitudes){
        float scaledHeight = power/LINE_SCALE; //scale the power
        curX += LINE_WIDTH ; //imcrease by line widht

        // draw a line representing this item in the amplitudes ArrayList

        canvas.drawLine(curX, middle + scaledHeight/2, curX, middle - scaledHeight/2, linePaint);


    }
    canvas.drawLine(curX, middle + viewHeight/2,  curX, middle -viewHeight/2, currentLinePointer);

}

一个相当愚蠢的错误。我需要让线或矩形代码在当前位置线之外,在onDraw中绘制振幅的循环之外。解决了

    @Override
    public void onDraw (Canvas canvas){
    int middle = viewHeight/2; //middle of view
    int curX = 0;

    //for each item in amplitudes Arraylist
    for (float power: amplitudes){
        float scaledHeight = power/LINE_SCALE; //scale the power
        curX += LINE_WIDTH ; //imcrease by line widht

        // draw a line representing this item in the amplitudes ArrayList

        canvas.drawLine(curX, middle + scaledHeight/2, curX, middle - scaledHeight/2, linePaint);


    }
    canvas.drawLine(curX, middle + viewHeight/2,  curX, middle -viewHeight/2, currentLinePointer);

}

请发你的代码谢谢。请发你的代码谢谢。刚刚发布