2017-04-23 50 views
1

我不太清楚如何问这个问题,但我需要一个滚动视图,它将随着幅度可视化器一起滚动,因为它会记录音频。编辑:要清楚,ScrollView即使触摸和手势也不滚动。如何使Horizo​​ntalScrollView滚动一个自定义View子

下面是具有自定义视图的应用程序的屏幕截图。红色条显示一秒钟的平均幅度。 enter image description here

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

下面是该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时滚动,但仍然不起作用。

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

回答

2

更改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); 
+0

对不起,我原来的帖子并不清楚。即使触摸手势,我也无法滚动。我加了这个,但它没有改变任何东西。但是你确实解决了我遇到的另一个问题。 – triggdev

0

我解决它。我没有覆盖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()来更新大小。

相关问题