android - 如何让 Horizo​​ntalScrollView 与一个自定义 View 子项一起滚动

标签 android scrollview

我不太确定如何提出这个问题,但我需要一个 ScrollView ,它会在录制音频时与振幅可视化工具一起滚动。编辑:需要明确的是,即使有触摸和手势,ScrollView 也不会滚动。

这是带有自定义 View 的应用程序屏幕截图。红色条显示一秒的平均振幅。 enter image description here

条形从左到右填充,但当它到达边缘时不会滚动。

这是 Horizo​​ntalScrollView 和 AudioVisualizer View 的 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));
    }

}

我尝试将 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>

每当您addBar 执行此操作时:

audioVisualizer.addBar(10);
parentHsv.fullScroll(HorizontalScrollView.FOCUS_RIGHT);

关于android - 如何让 Horizo​​ntalScrollView 与一个自定义 View 子项一起滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574910/

相关文章:

android - 如何使用 Assimp 库渲染 3D 文件

android - SnackBar 导致 ScrollView 崩溃并出现非法状态异常

android - 区分customView和scroll view的触摸事件

java - 在 ScrollView 周围放置黑线边框 - Android

android - 如何使您的应用程序具有图形可移植性?

android - 监听 MainActivity 中的 SharedPreferences 更改

java - 如果使用 Android 的两个项目具有相同的图像,则隐藏 GridView 中的项目

java - C++ ifstream.getline() 明显比 Java 的 BufferedReader.readLine() 慢?

android - ScrollView distrubing ListView inside LinearLayout

Android:加快(html 格式)文本的显示