【问题标题】:How to get HorizontalScrollView to scroll with one custom View child如何让 Horizo​​ntalScrollView 滚动一个自定义 View 子项
【发布时间】:2017-04-25 05:12:54
【问题描述】:

我不太确定如何问这个问题,但我需要一个滚动视图,它可以在记录音频时使用幅度可视化器滚动。编辑:要清楚,即使触摸和手势,ScrollView 也不会滚动。

这是带有自定义视图的应用的屏幕截图。红条显示一秒的平均幅度。

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

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

}

我尝试将 AudioVisualizer 宽度设置为 2000 之类的值,只是为了看看当孩子明显大于 ScrollView 时它是否会滚动,但它仍然不起作用。

我猜我错过了一些简单的东西。

【问题讨论】:

    标签: android scrollview


    【解决方案1】:

    像这样改变你的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);
    

    【讨论】:

    • 对不起,我在原帖中不清楚。即使使用触摸手势,我也无法滚动。我添加了这个,但它没有改变任何东西。但是,您确实解决了我遇到的另一个问题。
    【解决方案2】:

    我解决了。我没有覆盖 onMeasure。这是我的代码:

    @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() 来更新大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多