Change view height inside custom ScrollView onScrollChanged

I am trying to make the following effect:

example

I have my own ScrollView (in another to get an onScrollChanged listener) and a custom view inside it. In the custom view, I can manage to position the element the way I want.

Here's my 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));
}

      

Here's my custom 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


}

      

But now I need to change the height of the element on the scrolling scroll. I don't know what to add to onScrollChanged ... If anyone has an idea?

thank

+3


source to share


1 answer


Perhaps you want to force redraw the view by calling invalidate()

?



From a comment: I think you need to move your code in the onMeasure method to replace the TODO stub so that super.onMeasure () is called after your manipulations. And make sure you pass the new width / height calculations to it.

0


source







All Articles