在自定义ScrollView onScrollChanged中更改视图高度

时间:2014-09-30 15:47:48

标签: android android-custom-view custom-scrolling

我试图发挥以下效果:

example

我有一个自定义ScrollView(在oder中获取onScrollChanged侦听器)和一个自定义视图。在自定义视图中,我成功放置了我想要的项目。

这是我的customView:

public class CustomView extends FrameLayout {

private TextView nameView;
private TextView emailView;
private ImageView addressView;
private Tracks track ;
private double scrollProgress = 0.0;
private double topViewScaleFactor = 2.0;
private double collapsedViewHeight = 200.0;
private double expandedViewHeight = 700.0; 
private double scrollProgressPerView = expandedViewHeight;

View v;
View firstItem;
View secondView;


          int itemMinHeight = 200;
          int itemMaxHeight = 700;

public CustomView(MyScrollView paramEventListView, Context paramContext){

           super(paramContext);
}        



public CustomView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub

}


public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub

}


public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub

}

    @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // TODO Auto-generated method stub
    int m = getMeasuredWidth();


         int itemWidth = (r-l)/getChildCount();
       //  int itemHeight = (b-t)/getChildCount();


         firstItem = getChildAt(0);
        //firstItem.layout(0, 0, r-l, itemMaxHeight);
         firstItem.measure(View.MeasureSpec.makeMeasureSpec(m, MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(itemMaxHeight, MeasureSpec.EXACTLY));
         firstItem.layout(0, 0, r-l, itemMaxHeight);

         secondView = getChildAt(1);
         secondView.measure(View.MeasureSpec.makeMeasureSpec(m, MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(itemMinHeight, MeasureSpec.EXACTLY));
         secondView.layout(0, itemMaxHeight, r-l, itemMinHeight+itemMaxHeight);

         int FirstAndSEcondItemHeight = firstItem.getHeight() + secondView.getHeight();
         for(int i=2; i< this.getChildCount(); i++){
              v = getChildAt(i);
          //  v.layout(itemWidth*i, 0, (i+1)*itemWidth, b-t); 

             v.layout(0, FirstAndSEcondItemHeight + (itemMinHeight*(i-2)), r-l, FirstAndSEcondItemHeight + ((i-1)*itemMinHeight)); 
         }


}


    @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // TODO Auto-generated method stub
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);



    int heightMeasured = 0;
    /*for each child get height and
    heightMeasured += childHeight;*/
     for(int i=0; i< this.getChildCount(); i++){
         heightMeasured += getChildAt(i).getHeight();
     }

    //If I am in a scrollview i got heightmeasurespec == 0, so
    if(heightMeasureSpec == 0){
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightMeasured, MeasureSpec.EXACTLY);
    }

    setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize(this.getSuggestedMinimumHeight(), heightMeasureSpec));
}

这是我的自定义ScrollView:

public class MyScrollView extends ScrollView{



public MyScrollView(Context context) {
    super(context);

}

public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    add(context);
} 

public MyScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setScrollViewListener(ScrollViewListener scrollViewListener) {
    this.scrollViewListener = scrollViewListener;


}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
    super.onScrollChanged(x, y, oldx, oldy);

 // How can I acces to each child in the customView class, and change their height depending on the scrollChanged


}

但是现在我需要在滚动滚动视图时更改项目高度。我不知道在onScrollChanged中要放什么...... 如果有人有想法?

由于

1 个答案:

答案 0 :(得分:0)

也许您想通过调用invalidate()来强制重绘视图?

来自评论:我认为您需要在onMeasure方法中移动代码以替换&#34; TODO&#34;存根,以便在操作后调用super.onMeasure()。并确保您将新的宽度/高度计算传递给它。