2012-04-03 14 views
4

スクロールビューのコンテンツのサイズを大きくすると、スクロールビューには子供のサイズ変更を「知る」までに時間がかかります。スクロールビューにすぐに子をチェックするように指示するにはどうしたらいいですか?Android:スクロールビューに子供のサイズが変更されたことを通知する:どのように?

私はImageViewをScrollViewのLinearLayoutに持っています。

私のScaleListener.onScaleでは、私はLinearLayoutのサイズを変更します。私はスクロールビューでスクロールを注文しようとします。 ScaleListener.onScaleで:

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView.getLayoutParams(); 
params.width = (int) (startX * scaleFactor); 
params.height = (int) (startY * scaleFactor); 
imageView.setLayoutParams(params); 

(...) 

scrollView.scrollBy(scrollX, scrollY); 

しかし、スクロールはビューがスクロールするにはあまりにも小さかったので、状況にスケーリングスクロールが可能ではなかったの前にするときに発生しません。 setLayoutParamsの後では、ビューは大きくなるはずですが、スクロールビューでは子がまだ小さいと考えるため、スクロールは発生しません。

fesms後でonScrollが再び呼び出されると、スクロールがうまくいき、子が大きくスクロール可能であることがわかりました。

スクロールビューに子供のサイズが変更されたことを直ちに通知するにはどうすればよいですか?そのため、scrollByはその子のsetLayoutParamsの直後に動作しますか?

答えて

6

ちょうど約onXXX()の方法を試した後、解決策を見つけました。 onLayoutを使用できます。スクロールを計画し、後でonLayout()で行うことができます。

はあなたのscrollviewを拡張し、追加します。

private int onLayoutScrollByX = 0; 
private int onLayoutScrollByY = 0; 

public void planScrollBy(int x, int y) { 
    onLayoutScrollByX += x; 
    onLayoutScrollByY += y; 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    doPlannedScroll(); 
} 

public void doPlannedScroll() { 
    if (onLayoutScrollByX != 0 || onLayoutScrollByY != 0) { 
     scrollBy(onLayoutScrollByX, onLayoutScrollByY); 
     onLayoutScrollByX = 0; 
     onLayoutScrollByY = 0; 
    } 
} 

さて、代わりにscrollBy(x,y)使用planScrollBy(x,y)の、あなたのコードでこれを使用します。子どもの新しいサイズが「知られている」が画面にまだ表示されていないときにスクロールを行います。

水平または垂直のスクロールビューを使用すると、一方向にしかスクロールできないため、このコードを少し変更する必要があります(またはそうではないが、もう一方の軸のスクロールは無視されます)。 TwoDScrollViewを使用しました。ウェブ上で見つけることができます。

0

あなたは呼び出すことができます。

scrollView.updateViewLayout(childView, childLayout) 
関連する問題