2014-05-05 116 views
0

我上旋轉視圖的工作,以顯示類別360旋轉旋轉視圖。旋轉木馬視圖有360度旋轉。我正在使用this library。旋轉傳送帶視圖被創建,但我有一個問題。我只想顯示carosul的前臉。如何實現機器人

第一部分

如何隱藏旋轉視圖的背面?

第2部分

我沒有得到這個問題的時候用靜態圖像的工作。

這對於靜態旋轉視圖元素庫的工作。我對「Carousel.java」進行了一些更改,以便從服務器加載輪播視圖元素。但我得到例外。如果我評論線「getChildDrawingOrder(INT childCount,int i)以」方法&回報我,然後例外沒有得到,但只有一個旋轉視圖顯示元素。

異常

Same Exception

Carousel.java

public class Carousel extends CarouselSpinner implements GestureDetector.OnGestureListener { 
private ImageLoader imageLoaderobj; 
ImageAdapter adapter; 
private static final String TAG = Carousel.class.getSimpleName(); 
private static final boolean localLOGV = false; 
private static final int MIN_QUANTITY = 3; 
private static final int MAX_QUANTITY = 16; 
private static final float MAX_THETA = 15.0f; 
private static final int SCROLL_TO_FLING_UNCERTAINTY_TIMEOUT = 250; 
private AdapterContextMenuInfo mContextMenuInfo; 
    private int mAnimationDuration = 900;  
    private Camera mCamera = new Camera(); 
    private Runnable mDisableSuppressSelectionChangedRunnable = new Runnable() { 
    public void run() { 
    mSuppressSelectionChanged = false; 
    selectionChanged(); 
    } 
}; 
    private int mDownTouchPosition; 
    private View mDownTouchView; 
    private FlingRotateRunnable mFlingRunnable = new FlingRotateRunnable(); 
    private GestureDetector mGestureDetector; 
    private int mGravity; 
    private boolean mIsFirstScroll; 
    private int mMaxQuantity = MAX_QUANTITY; 
    private int mMinQuantity = MIN_QUANTITY; 
    private boolean mReceivedInvokeKeyDown; 
    private View mSelectedChild;   
    private boolean mShouldCallbackDuringFling = true; 
    private boolean mShouldCallbackOnUnselectedItemClick = true; 
    private boolean mShouldStopFling; 
    private boolean mSuppressSelectionChanged; 
    private float mTheta = (float)(0.0f*(Math.PI/180.0)); 
    private boolean mUseReflection=false; 
    public Carousel(Context context) { 
this(context, null); 
    imageLoaderobj=new ImageLoader(context); 
} 
public Carousel(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
    imageLoaderobj=new ImageLoader(context); 
} 
public Carousel(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    imageLoaderobj=new ImageLoader(context); 
    setChildrenDrawingOrderEnabled(true); 
    mGestureDetector = new GestureDetector(this.getContext(), this); 
    mGestureDetector.setIsLongpressEnabled(true); 
    setStaticTransformationsEnabled(true); 
    TypedArray arr = getContext().obtainStyledAttributes(attrs, R.styleable.Carousel); 
    mAnimationDuration = arr.getInteger(R.styleable.Carousel_android_animationDuration, 400); 
    mUseReflection = arr.getBoolean(R.styleable.Carousel_UseReflection, false); 
    int selectedItem = arr.getInteger(R.styleable.Carousel_SelectedItem, 0); 
     int min = arr.getInteger(R.styleable.Carousel_minQuantity, MIN_QUANTITY); 
    int max = arr.getInteger(R.styleable.Carousel_maxQuantity, MAX_QUANTITY); 
    float mTheta = arr.getFloat(R.styleable.Carousel_maxTheta, MAX_THETA); 
    if(mTheta > MAX_THETA || mTheta < 0.0f) 
     mTheta = MAX_THETA; 
      mMinQuantity = min < MIN_QUANTITY ? MIN_QUANTITY : min; 
    mMaxQuantity = max > MAX_QUANTITY ? MAX_QUANTITY : max; 
     if(arr.length() < mMinQuantity || arr.length() > mMaxQuantity) 
     throw new IllegalArgumentException("Invalid set of items."); 
     } 
/** customize carouselview programmitically */ 
    public void initilize(ArrayList<String> images,ArrayList<String> names,int selectedItem) 
    { adapter = new ImageAdapter(getContext()); 
     adapter.SetImages(images, names, mUseReflection); 
     adapter.notifyDataSetChanged(); 
      setAdapter(adapter); 
     if(selectedItem < 0 || selectedItem >= adapter.getCount()) 
      selectedItem = 0; 
     // next time we go through layout with this value 
     setNextSelectedPositionInt(selectedItem); 
    } 
    public void adapterNotify() 
    { adapter.notifyDataSetChanged(); 
    } 
    @Override 
protected int computeHorizontalScrollExtent() { 
    return 1; 
} 
    @Override 
protected int computeHorizontalScrollOffset() { 
    return mSelectedPosition; 
} 
    @Override 
protected int computeHorizontalScrollRange() { 
     return mItemCount; 
} 
    @Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean retValue = mGestureDetector.onTouchEvent(event); 
    int action = event.getAction(); 
    if (action == MotionEvent.ACTION_UP) { 
     onUp(); 
    } else if (action == MotionEvent.ACTION_CANCEL) { 
     onCancel(); 
    } 
    return retValue; 
}  
    @Override 
protected ContextMenuInfo getContextMenuInfo() { 
    return mContextMenuInfo; 
}  
    @Override 
public boolean showContextMenu() { 
    if (isPressed() && mSelectedPosition >= 0) { 
     int index = mSelectedPosition - mFirstPosition; 
     View v = getChildAt(index); 
     return dispatchLongPress(v, mSelectedPosition, mSelectedRowId); 
    }   
    return false; 
} 
    @Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_DPAD_LEFT: 
     ////if (movePrevious()) { 
      playSoundEffect(SoundEffectConstants.NAVIGATION_LEFT); 
     ////} 
     return true; 
    case KeyEvent.KEYCODE_DPAD_RIGHT: 
     /////if (moveNext()) { 
      playSoundEffect(SoundEffectConstants.NAVIGATION_RIGHT); 
     ////} 
     return true; 
    case KeyEvent.KEYCODE_DPAD_CENTER: 
    case KeyEvent.KEYCODE_ENTER: 
     mReceivedInvokeKeyDown = true; 
     } 
    return super.onKeyDown(keyCode, event); 
} 
    @Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_DPAD_CENTER: 
    case KeyEvent.KEYCODE_ENTER: { 
       if (mReceivedInvokeKeyDown) { 
      if (mItemCount > 0) { 
        dispatchPress(mSelectedChild); 
       postDelayed(new Runnable() { 
        public void run() { 
         dispatchUnpress(); 
        } 
       }, ViewConfiguration.getPressedStateDuration()); 

       int selectedIndex = mSelectedPosition - mFirstPosition; 
       performItemClick(getChildAt(selectedIndex), mSelectedPosition, mAdapter 
         .getItemId(mSelectedPosition)); 
      } 
     } 
       mReceivedInvokeKeyDown = false; 
        return true; 
    } 
    } 
    return super.onKeyUp(keyCode, event); 
}  
     @Override 
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { 
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); 
      if (gainFocus && mSelectedChild != null) { 
     mSelectedChild.requestFocus(direction); 
    } 
    }  
    @Override 
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 
    return p instanceof LayoutParams; 
} 
    @Override 
protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 
    return new LayoutParams(p); 
} 
    @Override 
public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { 
    return new LayoutParams(getContext(), attrs); 
} 
    @Override 
public void dispatchSetSelected(boolean selected) { 
     } 
@Override 
protected void dispatchSetPressed(boolean pressed) { 
    if (mSelectedChild != null) { 
     mSelectedChild.setPressed(pressed); 
    } 
} 
    @Override 
public boolean showContextMenuForChild(View originalView) { 
    final int longPressPosition = getPositionForView(originalView); 
    if (longPressPosition < 0) { 
     return false; 
    }  final long longPressId = mAdapter.getItemId(longPressPosition); 
    return dispatchLongPress(originalView, longPressPosition, longPressId); 
} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
     return event.dispatch(this, null, null); 
}  @Override 
protected int getChildDrawingOrder(int childCount, int i) { 
    ArrayList<CarouselItem> sl = new ArrayList<CarouselItem>(); 
    for(int j = 0; j < childCount; j++) 
    { CarouselItem view = (CarouselItem)getAdapter().getView(j,null, null); 
    if(i == 0) 
    view.setDrawn(false); 
    sl.add((CarouselItem)getAdapter().getView(j,null, null)); 
     } 
    Collections.sort(sl); 
    // Get first undrawn item in array and get result index 
    int idx = 0; 
    for(CarouselItem civ : sl) 
    { 
    if(!civ.isDrawn()) 
    { civ.setDrawn(true); 
     idx = civ.getIndex(); 
     break; 
    } 
     } 
    return idx; 
} 
    @Override 
protected boolean getChildStaticTransformation(View child, Transformation transformation) { 
    transformation.clear(); 
    transformation.setTransformationType(Transformation.TYPE_MATRIX); 
    float centerX = (float)getWidth()/2, centerY = (float)getHeight()/2; 
    mCamera.save(); 
    final Matrix matrix = transformation.getMatrix(); 
    mCamera.translate(((CarouselItem)child).getItemX(), ((CarouselItem)child).getItemY(), 
    ((CarouselItem)child).getItemZ()); 
    mCamera.getMatrix(matrix); 
    matrix.preTranslate(-centerX, -centerY); 
    matrix.postTranslate(centerX, centerY); 
    float[] values = new float[9]; 
    matrix.getValues(values); 
    mCamera.restore(); 
    Matrix mm = new Matrix(); 
    mm.setValues(values); 
    ((CarouselItem)child).setCIMatrix(mm); 
    child.invalidate(); 
    return true; 
}  
    void layout(int delta, boolean animate){ 
    if (mDataChanged) { 
     handleDataChanged(); 
    } 
      if (getCount() == 0) { 
     resetList(); 
     return; 
    } 
      if (mNextSelectedPosition >= 0) { 
     setSelectedPositionInt(mNextSelectedPosition); 
    }   
     recycleAllViews();   
       detachAllViewsFromParent(); 
       int count = getAdapter().getCount(); 
    float angleUnit = 360.0f/count; 
    float angleOffset = mSelectedPosition * angleUnit; 
    for(int i = 0; i< getAdapter().getCount(); i++){ 
     float angle = angleUnit * i - angleOffset; 
     if(angle < 0.0f) 
      angle = 360.0f + angle; 
     makeAndAddView(i, angle);   
    } 
      mRecycler.clear(); 
    invalidate(); 
    setNextSelectedPositionInt(mSelectedPosition); 
      checkSelectionChanged(); 
       mNeedSync = false; 
      updateSelectedItemMetadata(); 
    } 
    @Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    mInLayout = true; 
    layout(0, false); 
    mInLayout = false; 
}  
    @Override 
void selectionChanged() { 
    if (!mSuppressSelectionChanged) { 
     super.selectionChanged(); 
    } 
}  
    @Override 
void setSelectedPositionInt(int position) { 
    super.setSelectedPositionInt(position); 
    super.setNextSelectedPositionInt(position); 
     updateSelectedItemMetadata(); 
} 
private class FlingRotateRunnable implements Runnable { 
     private Rotator mRotator; 
    private float mLastFlingAngle; 
     public FlingRotateRunnable(){ 
     mRotator = new Rotator(getContext()); 
    } 
    private void startCommon() { 
       removeCallbacks(this); 
    } 
    public void startUsingVelocity(float initialVelocity) { 
     if (initialVelocity == 0) return; 
        startCommon(); 
        mLastFlingAngle = 0.0f; 
        mRotator.fling(initialVelocity); 
       post(this); 
    }   
      public void startUsingDistance(float deltaAngle) { 
     if (deltaAngle == 0) return; 
       startCommon(); 
       mLastFlingAngle = 0; 
     synchronized(this) 
     { 
      mRotator.startRotate(0.0f, -deltaAngle, mAnimationDuration); 
     } 
     post(this); 
    } 
    public void stop(boolean scrollIntoSlots) { 
     removeCallbacks(this); 
     endFling(scrollIntoSlots); 
    }   
    private void endFling(boolean scrollIntoSlots) { 
    synchronized(this){ 
    mRotator.forceFinished(true); 
     } 
       if (scrollIntoSlots) scrollIntoSlots(); 
    } 
     public void run() { 
     if (Carousel.this.getChildCount() == 0) { 
      endFling(true); 
      return; 
     }   
      mShouldStopFling = false; 
       final Rotator rotator; 
     final float angle; 
     boolean more; 
     synchronized(this){ 
      rotator = mRotator; 
      more = rotator.computeAngleOffset(); 
      angle = rotator.getCurrAngle();    
     } 
      float delta = mLastFlingAngle - angle;       
     trackMotionScroll(delta); 
      if (more && !mShouldStopFling) { 
      mLastFlingAngle = angle; 
      post(this); 
     } else { 
      mLastFlingAngle = 0.0f; 
      endFling(true); 
     }    
      } 
    } 
private class ImageAdapter extends BaseAdapter { 
    private Context mContext; 
    private ArrayList<CarouselItem> mImages; 
    public ImageAdapter(Context c) { 
     mContext = c; 
    }  
     public void SetImages(ArrayList<String> array, ArrayList<String> names, boolean reflected) 
    { 

     if(names != null) 
      if(array.size() != names.size()) 
       throw new RuntimeException("Images and names arrays length doesn't match"); 
      final int reflectionGap = 4; 
     mImages=new ArrayList<CarouselItem>(); 
     for(int i = 0; i< array.size(); i++) 
     { 
      Bitmap originalImage=imageLoaderobj.getBitmap(array.get(i)) ;    if(originalImage!=null) 
      { 
      originalImage=AppUtiles.getCroppedBitmap(originalImage); 
      if(reflected){ 
       int width = originalImage.getWidth(); 
       int height = originalImage.getHeight(); 
       Matrix matrix = new Matrix(); 
       matrix.preScale(1, -1); 
           Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 
         height/2, width, height/2, matrix, false); 
       Bitmap bitmapWithReflection = Bitmap.createBitmap(width, 
         (height + height/2), Config.ARGB_8888); 
       Canvas canvas = new Canvas(bitmapWithReflection); 
       // Draw in the original image 
       canvas.drawBitmap(originalImage, 0, 0, null); 
       // Draw in the gap 
       Paint deafaultPaint = new Paint(); 
       canvas.drawRect(0, height, width, height + reflectionGap, 
         deafaultPaint); 
         canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, 
         null); 
        Paint paint = new Paint(); 
       LinearGradient shader = new LinearGradient(0, 
         originalImage.getHeight(), 0, 
         bitmapWithReflection.getHeight() + reflectionGap, 
         0x70ffffff, 0x00ffffff, TileMode.CLAMP);     // Set the paint to use this shader (linear gradient) 
       paint.setShader(shader);      
       paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
       gradient 
       canvas.drawRect(0, height, width, 
         bitmapWithReflection.getHeight() + reflectionGap, paint); 

       originalImage = bitmapWithReflection; 
      } 

      CarouselItem item = new CarouselItem(mContext); 
      item.setIndex(i); 
      item.setImageBitmap(originalImage); 
      if(names != null) 
       item.setText(names.get(i)); 

      mImages.add(item); 
      } 
     } 
       } 
    public int getCount() { 
     if(mImages == null) 
      return 0; 
     else 
      return mImages.size(); 
    } 
    public Object getItem(int position) { 
     return position; 
    } 
    public long getItemId(int position) { 
     return position; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) { 

     convertView=mImages.get(position); 
     if(mImages.get(position).getCurrentAngle()<270&&mImages.get(position).getCurrentAngle()>90) 
     { 
      convertView.setVisibility(View.INVISIBLE); 
     }else{ 
      convertView.setVisibility(View.VISIBLE); 
     } 
     return convertView; 
    } 

}  

    public boolean onDown(MotionEvent e) { 
      mFlingRunnable.stop(false); 

    mDownTouchPosition = pointToPosition((int) e.getX(), (int) e.getY()); 
      if (mDownTouchPosition >= 0) { 
     mDownTouchView = getChildAt(mDownTouchPosition - mFirstPosition); 
     mDownTouchView.setPressed(true); 
    } 
        mIsFirstScroll = true; 
       return true; 
} 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    if (!mShouldCallbackDuringFling) { 
           // Remove any future code to set mSuppressSelectionChanged = false 
     removeCallbacks(mDisableSuppressSelectionChangedRunnable); 
     if (!mSuppressSelectionChanged) mSuppressSelectionChanged = true; 
    } 

    mFlingRunnable.startUsingVelocity((int) velocityX); 
      return true; 
} 
public void onLongPress(MotionEvent e) { 
      if (mDownTouchPosition < 0) { 
     return; 
    } 
    performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 
    long id = getItemIdAtPosition(mDownTouchPosition); 
    dispatchLongPress(mDownTouchView, mDownTouchPosition, id); 

} 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 

    if (localLOGV) Log.v(TAG, String.valueOf(e2.getX() - e1.getX())); 
      getParent().requestDisallowInterceptTouchEvent(true); 

    if (!mShouldCallbackDuringFling) { 
     if (mIsFirstScroll) { 
          if (!mSuppressSelectionChanged) mSuppressSelectionChanged = true; 
      postDelayed(mDisableSuppressSelectionChangedRunnable, SCROLL_TO_FLING_UNCERTAINTY_TIMEOUT); 
     } 
    } else { 
     if (mSuppressSelectionChanged) mSuppressSelectionChanged = false; 
    } 
      trackMotionScroll(/* -1 * */ (int) distanceX); 
      mIsFirstScroll = false; 
    return true; 
} 
public boolean onSingleTapUp(MotionEvent e) { 
    if (mDownTouchPosition >= 0) { 
       if (mShouldCallbackOnUnselectedItemClick || mDownTouchPosition == mSelectedPosition) { 
      performItemClick(mDownTouchView, mDownTouchPosition, mAdapter 
        .getItemId(mDownTouchPosition)); 
     } 
        return true; 
    } 
      return false; 
} 
    public void onShowPress(MotionEvent e) { 
} 

private void Calculate3DPosition(CarouselItem child, int diameter, float angleOffset){ 

    angleOffset = angleOffset * (float)(Math.PI/180.0f);   

    float x = - (float)(diameter/2 * android.util.FloatMath.sin(angleOffset)) + diameter/2 - child.getWidth()/2; 
    float z = diameter/2 * (1.0f - (float)android.util.FloatMath.cos(angleOffset)); 
    float y = - getHeight()/2 + (float) (z * android.util.FloatMath.sin(mTheta)); 
    child.setItemX(x); 
    child.setItemZ(z); 
    child.setItemY(y); 
     } 
    private int calculateTop(View child, boolean duringLayout) { 
    int myHeight = duringLayout ? getMeasuredHeight() : getHeight(); 
    int childHeight = duringLayout ? child.getMeasuredHeight() : child.getHeight(); 
      int childTop = 0; 
    switch (mGravity) { 
    case Gravity.TOP: 
     childTop = mSpinnerPadding.top; 
     break; 
    case Gravity.CENTER_VERTICAL: 
     int availableSpace = myHeight - mSpinnerPadding.bottom 
       - mSpinnerPadding.top - childHeight; 
     childTop = mSpinnerPadding.top + (availableSpace/2); 
     break; 
    case Gravity.BOTTOM: 
     childTop = myHeight - mSpinnerPadding.bottom - childHeight; 
     break; 
    } 
    return childTop; 
}  
    private boolean dispatchLongPress(View view, int position, long id) { 
    boolean handled = false; 
      if (mOnItemLongClickListener != null) { 
     handled = mOnItemLongClickListener.onItemLongClick(this, mDownTouchView, 
       mDownTouchPosition, id); 
    } 
    if (!handled) { 
     mContextMenuInfo = new AdapterContextMenuInfo(view, position, id); 
     handled = super.showContextMenuForChild(this); 
    } 
    if (handled) { 
     performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 
    } 
    return handled; 
}  
    private void dispatchPress(View child) { 
     if (child != null) { 
     child.setPressed(true); 
    } 
     setPressed(true); 
} 
    private void dispatchUnpress() { 
     for (int i = getChildCount() - 1; i >= 0; i--) { 
     getChildAt(i).setPressed(false); 
    } 
     setPressed(false); 
}    
private int getCenterOfGallery() { 
    return (getWidth() - Carousel.this.getPaddingLeft() - Carousel.this.getPaddingRight())/2 + 
     Carousel.this.getPaddingLeft(); 
} 
    private static int getCenterOfView(View view) { 
    return view.getLeft() + view.getWidth()/2; 
} 
    float getLimitedMotionScrollAmount(boolean motionToLeft, float deltaX) { 
    int extremeItemPosition = motionToLeft ? Carousel.this.getCount() - 1 : 0; 
    View extremeChild = getChildAt(extremeItemPosition - Carousel.this.getFirstVisiblePosition()); 
      if (extremeChild == null) { 
     return deltaX; 
    } 
      int extremeChildCenter = getCenterOfView(extremeChild); 
    int galleryCenter = getCenterOfGallery(); 
      if (motionToLeft) { 
     if (extremeChildCenter <= galleryCenter) { 
      return 0; 
     } 
    } else { 
     if (extremeChildCenter >= galleryCenter) { 
      return 0; 
     } 
    } 
    int centerDifference = galleryCenter - extremeChildCenter; 

    return motionToLeft 
      ? Math.max(centerDifference, deltaX) 
      : Math.min(centerDifference, deltaX); 
} 
    int getLimitedMotionScrollAmount(boolean motionToLeft, int deltaX) { 
    int extremeItemPosition = motionToLeft ? mItemCount - 1 : 0; 
    View extremeChild = getChildAt(extremeItemPosition - mFirstPosition); 

    if (extremeChild == null) { 
     return deltaX; 
    } 
      int extremeChildCenter = getCenterOfView(extremeChild); 
    int galleryCenter = getCenterOfGallery(); 
      if (motionToLeft) { 
     if (extremeChildCenter <= galleryCenter) { 
         return 0; 
     } 
    } else { 
     if (extremeChildCenter >= galleryCenter) { 
      return 0; 
     } 
    }  
     int centerDifference = galleryCenter - extremeChildCenter; 
    return motionToLeft 
      ? Math.max(centerDifference, deltaX) 
      : Math.min(centerDifference, deltaX); 
}  
    private void makeAndAddView(int position, float angleOffset) { 
    CarouselItem child; 
     if (!mDataChanged) { 
     child = (CarouselItem)mRecycler.get(position); 
     if (child != null) { 
      setUpChild(child, child.getIndex(), angleOffset); 
     } 
     else 
     {        child = (CarouselItem)mAdapter.getView(position, null, this); 

      // Position the view 
      setUpChild(child, child.getIndex(), angleOffset);    
     } 
     return; 
    } 
    child = (CarouselItem)mAdapter.getView(position, null, this); 
    setUpChild(child, child.getIndex(), angleOffset); 
    }  
    void onCancel(){ 
    onUp(); 
} 
private void onFinishedMovement() { 
    if (mSuppressSelectionChanged) { 
     mSuppressSelectionChanged = false; 
       super.selectionChanged(); 
    } 
    checkSelectionChanged(); 
    invalidate(); 

}  
    void onUp(){ 
    if (mFlingRunnable.mRotator.isFinished()) { 
     scrollIntoSlots(); 
    }   
    dispatchUnpress();  
} 
    private void scrollIntoSlots(){ 
      if (getChildCount() == 0 || mSelectedChild == null) return; 
      float angle; 
    int position; 
     ArrayList<CarouselItem> arr = new ArrayList<CarouselItem>(); 

    for(int i = 0; i < getAdapter().getCount(); i++) 
     arr.add(((CarouselItem)getAdapter().getView(i, null, null))); 
      Collections.sort(arr, new Comparator<CarouselItem>(){ 
     public int compare(CarouselItem c1, CarouselItem c2) { 
      int a1 = (int)c1.getCurrentAngle(); 
      if(a1 > 180) 
       a1 = 360 - a1; 
      int a2 = (int)c2.getCurrentAngle(); 
      if(a2 > 180) 
       a2 = 360 - a2; 
      return (a1 - a2) ; 
     }   
    }); 

    angle = arr.get(0).getCurrentAngle(); 
     if(angle > 180.0f) 
     angle = -(360.0f - angle); 
     if(angle != 0.0f) 
    {   mFlingRunnable.startUsingDistance(-angle); 
    } 
    else 
    {     position = arr.get(0).getIndex(); 
     setSelectedPositionInt(position); 
     onFinishedMovement(); 
    } 
} 
void scrollToChild(int i){  
    CarouselItem view = (CarouselItem)getAdapter().getView(i, null, null); 
    float angle = view.getCurrentAngle(); 
      if(angle == 0) 
     return; 
      if(angle > 180.0f) 
     angle = 360.0f - angle; 
    else 
     angle = -angle; 

    mFlingRunnable.startUsingDistance(angle); 
}  
    public void setCallbackDuringFling(boolean shouldCallback) { 
    mShouldCallbackDuringFling = shouldCallback; 
} 

public void setCallbackOnUnselectedItemClick(boolean shouldCallback) { 
    mShouldCallbackOnUnselectedItemClick = shouldCallback; 
} 
public void setAnimationDuration(int animationDurationMillis) { 
    mAnimationDuration = animationDurationMillis; 
} 
    public void setGravity(int gravity){ 
    if (mGravity != gravity) { 
     mGravity = gravity; 
     requestLayout(); 
    } 
}  

private void setUpChild(CarouselItem child, int index, float angleOffset) { 
     addViewInLayout(child, -1 /*index*/, generateDefaultLayoutParams()); 
    child.setSelected(index == mSelectedPosition); 
     int h; 
    int w; 
    int d; 
     if(mInLayout) 
    { 
     w = child.getMeasuredWidth(); 
     h = child.getMeasuredHeight(); 
     d = getMeasuredWidth(); 
     } 
    else 
    {  w = child.getMeasuredWidth(); 
     h = child.getMeasuredHeight(); 
     d = getWidth(); 
      } 
    child.setCurrentAngle(angleOffset); 
     child.measure(w, h); 
    int childLeft; 
     int childTop = calculateTop(child, true); 
     childLeft = 0; 
    child.layout(childLeft, childTop, w, h); 
    Calculate3DPosition(child, d, angleOffset); 

} 
    void trackMotionScroll(float deltaAngle) { 
     if (getChildCount() == 0) { 
     return; 
    } 
      for(int i = 0; i < getAdapter().getCount(); i++){ 
       CarouselItem child = (CarouselItem)getAdapter().getView(i, null, null); 
      float angle = child.getCurrentAngle(); 
     angle += deltaAngle; 

     while(angle > 360.0f) 
      angle -= 360.0f; 

     while(angle < 0.0f) 
      angle += 360.0f; 

     child.setCurrentAngle(angle); 
     Calculate3DPosition(child, getWidth(), angle); 
       } 
      mRecycler.clear();   
      invalidate(); 
} 
    private void updateSelectedItemMetadata() { 
      View oldSelectedChild = mSelectedChild; 
    View child = mSelectedChild = getChildAt(mSelectedPosition - mFirstPosition); 
    if (child == null) { 
     return; 
    } 
    child.setSelected(true); 
    child.setFocusable(true); 
    if (hasFocus()) { 
     child.requestFocus(); 
    } 
      if (oldSelectedChild != null) { 
        oldSelectedChild.setSelected(false); 
        oldSelectedChild.setFocusable(false); 
    } 
     } 
     } 

感謝。

+0

我想你應該嘗試自己做,並告訴你做了什麼,問之前... –

+0

我嘗試過,但沒有解決問題。 – mukesh

+0

您更新了CodeProject的旋轉木馬,以隱藏背面?如果是的話,分享你做的...如果你剛剛複製了代碼而沒有試圖根據你的需要進行成本分配,那麼祝你好運... –

回答

0

我不知道如果我用你使用相同的庫,但我覺得我在一個點上也有類似的問題的第2部分。確保您要麼提供佔位符圖像,要麼專門設置輪播中項目的尺寸,以便在從服務器加載時,輪播仍然可以正確執行所有測量。

+0

@我沒有使用佔位符。從服務器下載位圖後,我縮放它需要高度和寬度 – mukesh

+0

你能解釋更多嗎? – mukesh

+0

旋轉木馬使用視圖的尺寸來設置自己。如果您沒有設置大小的每個項目的佔位符或佈局,它認爲大小爲0,這會將事情搞砸。確保您在適配器中使用的佈局將其明確設置爲尺寸標註(而不是使用wrap_content),或者使用佔位符圖像,以便它可以使用它來測量視圖的尺寸。 – anakin78z

0

您可以使用ViewPager並創建一個函數,該函數將每隔一定的秒數更改視圖,以使其看起來像旋轉木馬。

+0

但如何給它圓形? – mukesh