2015-01-20 10 views
6

Android scrollview'ım arasında gezinirken, gerektiğinde aşağı kaydırıyor.Android'de bir görüntüyü, bir Google Görüntüsünün kaydırma görünümünde nasıl merkezleyebilirim?

Ancak görüntüdeki görüntüyü merkeze sabitlemek istiyorum. Böylece, görüntüdeki kişinin yüzünü her zaman siz yukarı kayarken görürsünüz.

enter image description here

Stockguy görüntüsü:

Şimdiye kadar aşağıdaki resimde oluşturulan bu

Benzer bir etkiyi başarmak mümkün olmamıştır

enter image description here

bugüne kadar (şimdiye kadar bunu gerçekleştirmek etmeyen) Kodum:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:fillViewport="true" 
    android:scrollbars="none" 
    android:background="#FAFAFA" 
    android:id="@+id/cScrollview" 
    > 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="1100dp" 
    tools:context=".MainActivity" 
    android:id="@+id/CRLayout"> 

     <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="centerCrop" 
      android:id="@+id/contactPic" 
      android:src="@drawable/stockguy"/> 

      .... 


      </RelativeLayout> 
</ScrollView> 
+3

[Yeni PlayStore paralaks efekti nasıl yapılır] (http://stackoverflow.com/questions/25461014/how-to-do-the-new-playstore-parallax-effect) – kId

+0

Zaten uygulamış olduğunuzu mu söylüyorsunuz? İşlem çubuğunda aşağı kaydırıldığında görünecek ve başlık küçülecektir. ve henüz çalışmayan şeyler görüntüdür? – hasan83

+0

Şimdiye kadar bunu gerçekleştirmek mümkün olmamıştır sen diffenetly geçerli kullanıcı kaydırma konumunu bilmek gerekir –

cevap

1

Bunun ile farklı bir yaklaşım olur.

şu pasajı dayalı düzen inşa deneyin:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
<ImageView 
    android:id="@+id/image" 
    android:layout_width="match_parent" 
    android:background="#00FF00" 
    android:scaleType="centerCrop" 
    android:layout_height="200dp"/> 
<FrameLayout 
    android:id="@+id/content" 
    android:layout_below="@+id/image" 
    android:background="#FF0000" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 
</RelativeLayout> 

kullanma GestureDetector.SimpleOnGestureListener kullanıcı içeriği düzenine kaydırır ve açıkladığınız etkiyi elde etmek buna göre görüntü boyutunu ve alfa güncelleme yaparken algılayabilir.

1

Scrollview bir kaydırma geri arama kullanarak bu uygulayacak, bu varsayılan olarak bulunmaz ama scrollview uzatarak kendini oluşturmak kolaydır değildir:

public class UpdatingScrollView extends ScrollView { 

    private OnScrollChangedListener mScrollChangedListener; 

    public interface OnScrollChangedListener { 
     public void onScrollChanged(int x, int y, int oldx, int oldy); 
    } 

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

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

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

    public void setOnScrollChangedListener(OnScrollChangedListener listener) { 
     mScrollChangedListener = listener; 
    } 

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

Yani com.your.package.UpdatingScrollView ile düzeninde scrollview değiştirin.

UpdatingScrollView öğesinin tanımlandığı Fragman/Etkinlik bölümünde, kaydırma dinleyicisini ayarlarsınız ve kaydırma ofseti temelinde görüntünün alt kenar boşluğunu güncelleştirirsiniz. ScrollView'ın kaydettiği her 2 piksel için alt kenar boşluğunu -1 piksele güncellemek isteyeceksiniz. Bu, görüntüyü ekranın geri kalanının oranının yarısında ekrana getirecek.

Yani böyle bir şey:

scrollView.setOnScrollChangedListener(new OnScrollChangedListener() { 
    @Override 
    public void onScrollChanged(int x, int y, int oldx, int oldy) { 
     // I think y will be negative when scrolled 
     if(y >= -image.getHeight()) { 
      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) image.getLayoutParams(); 
      lp.setMargins(0, 0, 0, y/2); 
      image.setLayoutParams(lp); 
     } 
    } 
}); 
2

resmin üzerine kod aşağıdaki deneyin yayınlanmıştır gibi paralaks etkiyi elde etmek için. Bu çok basit bir yol.

Düzen:

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

    <RelativeLayout 
     android:id="@+id/rlWrapper" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

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

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

      <!-- Other Views --> 

     </LinearLayout> 

    </RelativeLayout> 
</ScrollView> 

LinearLayout yüksekliğine en büyük kenar ImageViews eşittir. '

ScrollView kaydırma konumunu Dinleme ve ImageView pozisyonunu değiştirerek:

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

    mScrollView = (ScrollView) findViewById(R.id.scrollView); 
    mPhotoIV = (ImageView) findViewById(R.id.ivContactPhoto); 
    mWrapperRL = (RelativeLayout) findViewById(R.id.rlWrapper); 

    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 can set to ActionBar background 
     float alpha = scrollY/(float) mImageViewHeight; 
    } 
} 

Umarım yardımcı olur.