2017-04-23 74 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()來更新大小。

相關問題