2

私は実装したレイアウトScrollViewに関する多数のビューを含む を持っています。ビューの、展開または折りたたみのいずれかです。したがって、ビューが展開されると、ビューが画面の上に来るようにプログラムで移動したいと思います。下の画像を参照してくださいLinearLayoutexpandcollapseOnClickScrollView

ここに画像の説明を入力

ScrollView赤線の長さまで動かしたいです。childには(4:ステータス バーの通知) とがScrollView含まれます。さらに、組み合わせの上または下にビューが含まれる場合と含まれない場合があります。私は CustomScrollView を使用しました。TextViewImageViewScrollViewTextView ImageViewscroll Y

public int newY=0;
@Override
protected void onScrollChanged(int X, int Y, int oldX, int oldY) {
    super.onScrollChanged(X, Y, oldX, oldY);
    this.newY=Y;
}

そのために、次のロジックを使用しました

 public void translateView(View view){
    int[] xy =new int[2];
   //view = ImageView
    view.getLocationOnScreen(xy);
    int scrollY = xy[1]+view.getBottom();
    //screenHeight =ScreenHeight of the phone
    if(scrollY>screenHeight){
      //heading textView
        textView.getLocationOnScreen(xy);
        int diff = screenHeight-xy[1];
        diff =Math.abs(diff);
        int moveHeight = (int) (scrollView.newY+diff);
        scrollView.smoothScrollTo(0, moveHeight);

    }
}

yしたがって、基本的に私がやろうとしているのは、位置の違いを見つけてTextView、画面の高さでそれを減算し、ScrollViewそれらの違いまでスクロールして、ビューが上に表示されるようにすることです.しかし、それは機能していません.これを達成する方法についてのアイデア.

4

1 に答える 1

0

私は自分が間違っていたことを見つけました。StatusBar私の場合、各画面は で構成されていActionBarます。そのため、View Y位置を計算するときは画面の上から計算し、の増分値を使用するたびにScrollView Scroll、ビューを画面の上に移動していました。実際のソリューションはなれ

public void translateView(final View view){
    int[] xy =new int[2];
    view.getLocationOnScreen(xy);
    int scrollY = xy[1]+view.getBottom();


    if(scrollY>DataHolder.screenHeight){
        handle.getLocationOnScreen(xy);
        int actualY=xy[1]-DataHolder.actionbarHeight-DataHolder.statusBarHeight;
        int moveHeight = (int) (scrollView.newY+actualY);
        scrollView.smoothScrollTo(0, moveHeight);   
    }
}

これを行うことで、私のビューは自動的に画面の上部に到達します

于 2013-03-18T11:39:44.710 に答える