25

Bir kaydırma görünümü oluşturdum ve içine bir görüntü görüntüsü yerleştirdim. Aynı görüntüyü yeniden boyutlandırmak için kaydırma yapmak istiyorum, ancak aşağıdaki resimde yapılmıştı ama şimdiye kadar çok az başarı elde ettim.Bu görüntüde yapıldığı gibi, resim görünümümün kaydırma görünümümde nasıl yeniden boyutlandırılır?

Denemelerimde görüntü kaydırmada yeniden boyutlandırılır, ancak yeniden boyutlandırmanın ardından boşluk bırakılır. Nasıl aşağıda değişiklik yapacağı:

Resim: Şimdiye kadar

enter image description here

My Code:

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: o paralaks etkisi nasıl elde edilebileceğini gösterir aşağıda basit bir örnek yoktur

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

onay iosched ne uygulama kaynağını ... – Selvin

+0

iosched? –

+0

Yapıldığı zaman proje başarısız olur ve xml'yi ziyaret ettiğimde, sayfada gösterilen tüm sözcüklerin üzerinde bir bölücü olan hoparlörler vardır. Şimdiye kadar önerdiğin proje hiçbir yardımda bulunmadı. Sorunumu nasıl çözeceğimi bilmiyor musunuz? –

cevap

22

. İlk

, FrameLayout içine ImageView ve diğer görünümleri koyun:

<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 (bizim örneğimizde @dimen/contact_photo_height) ler yüksekliği en marjı ImageViews eşittir '.

Sonra ScrollView kaydırma konumunu dinlemek ve ImageView konumunu değiştirmek gerekir:

@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

Çerçeve düzeninin sadece bir çocuğu olabileceğini düşündüm. – Suragch

+1

@Suragch çerçeve düzenlerinde birden fazla çocuk olabilir. bir çerçeve düzeninin noktası budur, her alt düzenini birbirinin üzerine yerleştirir. –

+0

Tamam, daha önce bu şekilde kullanmamıştım. Belgelerden: "FrameLayout, tek bir öğeyi görüntülemek için ekrandaki bir alanı engelleyecek şekilde tasarlanmıştır. Genel olarak, ** FrameLayout tek bir çocuk görünümünü ** tutmak için kullanılmalıdır, çünkü çocuk görünümlerini organize etmek zor olabilir. Birbiriyle örtüşen çocuklar olmadan farklı ekran boyutlarına ölçeklenebilen bir yoldur. ** Bununla birlikte, bir FrameLayout ** 'a birden fazla çocuk ekleyebilir ve android: layout_gravity özelliğini kullanarak her bir çocuğa yerçekimi atayarak FrameLayout içindeki konumlarını kontrol edebilirsiniz. " – Suragch

İlgili konular