2012-07-05 2 views
0

저는 새로운 Android 플랫폼 앱 개발입니다. 내 문제는 갤러리보기 및 해당 이미지를 사용하지 않고 이미지를 중앙에 잠그는 것입니다. 우리는 애니메이션을 재생하면서 움직이는 이미지를 화면의 중심에 맞춰 조정해야합니다. 현재 나는 HSV의 자식 elment로 linearlayout와 HorizontalScrollView를 사용하고 있습니다. 다중 이미지를 갖는 선형 레이아웃. 나에게 충고하는 방법을 알려주세요. 미리 감사드립니다.Imageviews를 자식으로하고 화면의 이미지 중심을 스크롤하는 동안 애니메이션을 재생해야하는 HorizontalScrollView?

답변

2

방법

이 센터

에있는보기로 애니메이션을 보여줍니다

public class HorizontalScrollSpinner extends HorizontalScrollView { 

    private ListAdapter mAdapter; 

    private int mCenterViewPosition = -1; 

    private OnSelectedItemChanged onSelectedItemChanged = new OnSelectedItemChanged() { 
     @Override 
     public void onSelectedChanged(View view, int newPosition) { 

     } 
    }; 

    public HorizontalScrollSpinner(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     this.setHorizontalFadingEdgeEnabled(true); 
     this.setHorizontalScrollBarEnabled(false); 
     this.setFadingEdgeLength(5); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     super.onLayout(changed, l, t, r, b); 

     if(getChildCount() == 0) 
      return; 

     initCenterView(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     if(getChildCount() == 0) 
      return; 

     ViewGroup parent = (ViewGroup) getChildAt(0); 

     if(parent.getChildCount() == 0) 
      return; 

     View FirstChild = parent.getChildAt(0); 

     int LeftPadding = (getWidth()/2) - (FirstChild.getMeasuredWidth()/2); 

     View LastChild = parent.getChildAt(getChildCount() - 1); 

     int RightPadding = (getWidth()/2) - (LastChild.getMeasuredWidth()/2); 

     if(parent.getPaddingLeft() != LeftPadding && parent.getPaddingRight() != RightPadding) 
     { 
      parent.setPadding(LeftPadding, parent.getPaddingTop(), RightPadding, parent.getPaddingBottom()); 
      requestLayout(); 
     } 
    } 

    private int getInternalCenterView() 
    { 
     if(getChildCount() == 0) 
      return -1; 

     int CenterView= 0; 
     int CenterX = getScrollX() + (getWidth()/2); 

     ViewGroup parent = (ViewGroup) getChildAt(0); 

     if(parent.getChildCount() == 0) 
      return -1; 

     View child = parent.getChildAt(0); 

     while(child != null && child.getRight() <= CenterX && CenterView < parent.getChildCount()) 
     { 
      CenterView++; 
      child = parent.getChildAt(CenterView); 
     } 

     if(CenterView >= parent.getChildCount()) 
      CenterView = parent.getChildCount() - 1; 

     return CenterView; 
    } 

    private int getCenterPositionFromView() 
    { 
     int CenterView = getInternalCenterView(); 

     if(mCenterViewPosition != CenterView) 
     { 
      onSelectedItemChanged.onSelectedChanged(this, CenterView); 
     } 

     mCenterViewPosition = CenterView; 

     return mCenterViewPosition; 
    } 

    public int getCenterViewPosition() 
    { 
     return mCenterViewPosition; 
    } 

    public ListAdapter getAdapter() { 
     return mAdapter; 
    } 

    public void setAdapter(ListAdapter mAdapter) { 

     this.mAdapter = mAdapter; 
     fillViewWithAdapter();  
    } 

    private void fillViewWithAdapter() 
    { 
     if(getChildCount() == 0 || mAdapter == null) 
      return; 

     ViewGroup parent = (ViewGroup) getChildAt(0); 

     parent.removeAllViews(); 

     for (int i = 0; i < mAdapter.getCount(); i++) { 
      parent.addView(mAdapter.getView(i, null, parent));   
     } 
    } 

    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 

     getCenterPositionFromView(); 

     initCenterView(); 
    } 

    private void initCenterView() 
    { 
     if(getChildCount() == 0) 
      return; 

     ViewGroup parent = (ViewGroup) getChildAt(0); 

     if(parent.getChildCount() == 0) 
      return; 

     int CenterView = getCenterViewPosition(); 

     if(CenterView == -1) 
     { 
      mCenterViewPosition = 0; 
      CenterView = 0; 
     } 

     if(CenterView != -1 && CenterView != getInternalCenterView() && parent.getChildAt(0).getLeft() >= 0) 
     { 
      scrollToSelectedIndex(); 
     } 

     if(CenterView < 0 || CenterView > parent.getChildCount()) 
      return; 

     for (int i = 0; i <= parent.getChildCount(); i++) { 

      if(!(parent.getChildAt(i) instanceof TextView)) 
       continue; 

      if(i == CenterView) 
      { 
       // Start Animation 
      } 
      else 
      { 
       // Remove Animation for other Views 
      } 
     } 


    } 

    public int getSelectedIndex() 
    { 
     return getCenterViewPosition(); 
    } 

    public void setSelectedIndex(int index) 
    { 
     if(getChildCount() == 0) 
      return; 

     ViewGroup parent = (ViewGroup) getChildAt(0); 

     if(index < 0 || index > parent.getChildCount()) 
     { 
      throw new ArrayIndexOutOfBoundsException(index); 
     } 

     mCenterViewPosition = index; 

     onSelectedItemChanged.onSelectedChanged(this, mCenterViewPosition); 

     requestLayout(); 
    } 

    protected void scrollToSelectedIndex() 
    { 
     ViewGroup parent = (ViewGroup) getChildAt(0); 

     View child = parent.getChildAt(mCenterViewPosition); 

     int ChildCenterX = child.getLeft() + (child.getMeasuredWidth()/2); 

     int ScreenCenterX = getWidth()/2; 

     int ChildScrollToX = ChildCenterX - ScreenCenterX; 


     scrollTo(ChildScrollToX, 0); 
    } 

    public interface OnSelectedItemChanged 
    { 
     public void onSelectedChanged(View view, int newPosition); 
    } 

    public OnSelectedItemChanged getOnSelectedItemChanged() { 
     return onSelectedItemChanged; 
    } 

    public void setOnSelectedItemChanged(OnSelectedItemChanged onSelectedItemChanged) { 
     this.onSelectedItemChanged = onSelectedItemChanged; 
    } 


} 

내 완전한 소스 편집 추가/HorizontalScrollView 상속과 오버라이드 (override) onMeasure는 Padding을 LinearLayout에 추가하여 첫 번째 C LinearLayout의 hild 및 Last Child는 항상 중심에 있습니다.

+0

Vivek 센터 뷰 위치 – Ganesh

+0

및 scrollToSelectedIndex()에 대한 메소드를 제공하십시오. 방법 덕분에 사전 – Ganesh

+0

샘플 소스 링크 또는 다른 현명한 [email protected] 샘플을 보내 주시기 바랍니다 vivek 도와주세요 – Ganesh

관련 문제