Android 如何使HorizontalScrollView与一个自定义视图子项一起滚动

Android 如何使HorizontalScrollView与一个自定义视图子项一起滚动,android,scrollview,Android,Scrollview,我不太清楚如何问这个问题,但我需要一个scrollview,它将与振幅可视化工具滚动,因为它记录音频。编辑:要清楚,滚动视图即使有触摸和手势也不会滚动 这是一个带有自定义视图的应用程序的屏幕截图。红色条表示每秒的平均振幅。 条形图从左向右填充,但到达边缘时不会滚动 以下是HorizontalScrollView和AudioVisualizer视图的XML: <HorizontalScrollView android:id="@+id/hsv" android:layout

我不太清楚如何问这个问题,但我需要一个scrollview,它将与振幅可视化工具滚动,因为它记录音频。编辑:要清楚,滚动视图即使有触摸和手势也不会滚动

这是一个带有自定义视图的应用程序的屏幕截图。红色条表示每秒的平均振幅。

条形图从左向右填充,但到达边缘时不会滚动

以下是HorizontalScrollView和AudioVisualizer视图的XML:

<HorizontalScrollView
    android:id="@+id/hsv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <com.blueteam.audiotes.AudioVisualizer
        android:id="@+id/visualizer"
        android:layout_width="match_parent"
        android:layout_height="200dp" />

</HorizontalScrollView>

以下是AudioVisualizer元素的代码:

package com.blueteam.audiotes;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;

import java.util.ArrayList;

/**
 * Created by tanner on 3/21/17.
 */

public class AudioVisualizer extends View {

    private final int BAR_WIDTH = 10;
    private final int BAR_STARTING_POINT = 0;
    private final int BAR_SPACE = 2;
    private final int BAR_BOTTOM = 200;
    private final int BAR_MINIMUM_HEIGHT = 20;

    private ArrayList<Rect> bars;
    private Paint paint;
    private ArrayList<Tag> tags;

    public AudioVisualizer(Context context, AttributeSet attrs) {
        super(context, attrs);
        bars = new ArrayList<Rect>();
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        for(Rect r : bars)
            canvas.drawRect(r.left, r.top, r.right, r.bottom, paint);
    }

    public void addBar(int height) {
        if (height < BAR_MINIMUM_HEIGHT)
            height = BAR_MINIMUM_HEIGHT;
        else if (height > BAR_BOTTOM)
            height = BAR_BOTTOM;
        bars.add(new Rect(BAR_STARTING_POINT + bars.size() * (BAR_SPACE + BAR_WIDTH),
            BAR_BOTTOM - height,
            (BAR_STARTING_POINT + bars.size() * (BAR_SPACE + BAR_WIDTH)) + BAR_WIDTH,
            BAR_BOTTOM));
    }

}
package com.blueteam.audiotes;
导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Path;
导入android.graphics.Rect;
导入android.util.AttributeSet;
导入android.view.view;
导入java.util.ArrayList;
/**
*tanner于2017年3月21日创作。
*/
公共类AudioVisualizer扩展视图{
专用最终整流罩宽度=10;
专用最终整型条起点=0;
专用最终整型条_空间=2;
专用最终整流罩底部=200;
专用最终内螺纹最小高度=20;
私人酒吧;
私人油漆;
私有ArrayList标签;
公共音频可视化工具(上下文、属性集属性){
超级(上下文,attrs);
bars=新的ArrayList();
油漆=新油漆();
油漆。设置颜色(颜色。红色);
绘制.设置样式(绘制.样式.填充和笔划);
}
@凌驾
受保护的void onDraw(画布){
用于(矩形r:条形)
画布.drawRect(右左、右上、右右下、油漆);
}
公共空白添加栏(内部高度){
if(高度<最小高度)
高度=杆的最小高度;
否则如果(高度>条形图底部)
高度=杆底;
添加(新矩形(条形起点+条形尺寸()*(条形间距+条形宽度),
杆底高度,
(条形起点+条形.size()*(条形间距+条形宽度))+条形宽度,
巴(下);
}
}
我试着将AudioVisualizer的宽度设置为2000左右,只是想看看当孩子明显大于ScrollView时,它是否会滚动,但它仍然不起作用


我猜我遗漏了一些简单的东西。

如下更改您的xml:

<HorizontalScrollView
    android:id="@+id/hsv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <com.blueteam.audiotes.AudioVisualizer
        android:id="@+id/visualizer"
        android:layout_width="wrap_content"
        android:layout_height="200dp" />

</HorizontalScrollView>

我解决了。我没有在测量时超越。这是我的密码:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = (BAR_WIDTH + BAR_SPACE) * bars.size();
    setMeasuredDimension(width, MeasureSpec.getSize(heightMeasureSpec));
}

我还需要在v.invalidate()之前调用v.requestLayout()来更新大小。

很抱歉,我在原始帖子中不清楚。我甚至不能用触摸手势滚动。我添加了这个,但它没有改变任何东西。但是你解决了我遇到的另一个问题。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = (BAR_WIDTH + BAR_SPACE) * bars.size();
    setMeasuredDimension(width, MeasureSpec.getSize(heightMeasureSpec));
}