25

나는 scrollview를 만들었고 그 안에 imageview가있다. 아래 이미지에서와 같은 방식으로 크기를 조정할 수있는 스크롤 기능이 필요하지만 지금까지 거의 성공하지 못했습니다.이미지 뷰에서 이미지 뷰의 크기가 어떻게 바뀌나요?

시도 할 때 이미지의 크기가 스크롤되지만 크기를 조정 한 후에 남아있는 공간이 있습니다. 어떻게 당신은 아래의 수정 것 :

이미지 : 지금까지

enter image description here

내 코드 :

activity_main.xml을

<ImageView 
      android:layout_gravity="center" 
      android:adjustViewBounds="true" 
      android:layout_width="601dp" 
      android:layout_height="250dp" 
      android:paddingTop="0dp" 
      android:paddingLeft="0dp" 
      android:paddingRight="0dp" 
      android:scaleType="fitXY" 
      android:id="@+id/contactPic" 
      android:src="@drawable/stock" 
      android:clickable="true"/> 

MainActivity :

@Override 
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { 
    final ImageView contactPicture = (ImageView) findViewById(R.id.contactPic); 
    final RelativeLayout contactLayout = (RelativeLayout) findViewById(R.id.ContactRLayout); 
    if (scrollView == contactScrollView) { 
     View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1); 
     int distanceFromPageEnd = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY())); 

     Log.e("onScrollChanged", "distance from bottom = " + String.valueOf(distanceFromPageEnd)); 
     if (distanceFromPageEnd >= 1408) 
     { 
     contactPicture.getLayoutParams().height = (distanceFromPageEnd - 1408); 
     contactPicture.requestLayout(); 
     } 
    } 

ScrollViewListener :

public interface ScrollViewListener { 

     void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy); 

    } 

ObservableScrollView : 그 시차 효과를 달성하는 방법을 아래에 간단한 예있다

public class ObservableScrollView extends ScrollView { 

    private ScrollViewListener scrollViewListener = null; 

    public ObservableScrollView(Context context) { 
     super(context); 
    } 

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

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

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

    public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { 
     super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); 
    } 

    @Override 
    protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
     super.onScrollChanged(x, y, oldx, oldy); 
     if(scrollViewListener != null) { 
      scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); 
     } 
    } 

} 
+1

검사가 iosched 어떤 응용 프로그램 소스 ... – Selvin

+0

을 iosched을? –

+0

프로젝트가 빌드 될 때 프로젝트가 실패한 것처럼 보입니다. xml을 방문하면 페이지에 표시된 모든 내용은 위에있는 구분선이있는 단어가있는 단어입니다. 지금까지 제안한 프로젝트는 도움이되지 않았습니다. 내 문제를 해결하는 방법을 모르십니까 –

답변

22

. 먼저

FrameLayoutImageView과 다른 견해를 넣어 :

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/flWrapper" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/contactPic" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/contact_photo_height" 
      android:scaleType="centerCrop" 
      android:src="@drawable/stock" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="@dimen/contact_photo_height"> 

      <!-- Other Views --> 

     </LinearLayout> 

    </FrameLayout> 
</ScrollView> 

LinearLayout (예에서 @dimen/contact_photo_height)의 높이의 위쪽 여백이 ImageViews 같다 '.

그리고 우리는 ScrollView의 스크롤 위치를 듣고 ImageView의 위치를 ​​변경해야합니다 :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    <...> 

    mScrollView = (ScrollView) findViewById(R.id.scrollView); 
    mPhotoIV = (ImageView) findViewById(R.id.contactPic); 
    mWrapperFL = (FrameLayout) findViewById(R.id.flWrapper); 

    mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ScrollPositionObserver()); 

    <...> 
} 

private class ScrollPositionObserver implements ViewTreeObserver.OnScrollChangedListener { 

    private int mImageViewHeight; 

    public ScrollPositionObserver() { 
     mImageViewHeight = getResources().getDimensionPixelSize(R.dimen.contact_photo_height); 
    } 

    @Override 
    public void onScrollChanged() { 
     int scrollY = Math.min(Math.max(mScrollView.getScrollY(), 0), mImageViewHeight); 

     // changing position of ImageView 
     mPhotoIV.setTranslationY(scrollY/2); 

     // alpha you could set to ActionBar background 
     float alpha = scrollY/(float) mImageViewHeight; 
    } 
} 
+0

프레임 레이아웃은 하나의 자식 만 가질 수 있다고 생각했습니다. – Suragch

+1

@Suragch 프레임 레이아웃은 여러 개의 자식을 가질 수 있습니다. 그것은 프레임 레이아웃의 포인트 다. 서로의 위에 모든 자식 레이아웃을 겹친다. –

+0

좋아, 나는이 방법으로 사용하지 않았다. 문서에서 : "FrameLayout은 단일 항목을 표시하기 위해 화면 영역을 차단하도록 설계되었습니다. 일반적으로 ** ChildLayout을 사용하여 단일 하위 뷰 **를 보유해야합니다. 그러나 서로 겹치는 자식없이 서로 다른 화면 크기로 확장 할 수 있습니다. ** 그러나 여러 어린이를 FrameLayout **에 추가하고 android : layout_gravity 특성을 사용하여 각 자식에 중력을 할당하여 FrameLayout 내에서 해당 위치를 제어 할 수 있습니다. " – Suragch

관련 문제