Question

Im trying to use Neil Davies's CoverFlow Widget v2 as a fragment activity. Im expecting something like thisenter image description here

Instead Im getting thisenter image description here

Clearly something is wrong in my implementation, but since Im seeing no errors or crashes..Im kinda lost as to where to look. Anywho below is the java and xml code

SampleTabsDefault.java

 public class SampleTabsDefault extends FragmentActivity {


private static final String[] CONTENT = new String[] { "Tab 1", "Tab 2", "Tab 3", "Tab 4", "Tab 5", "Tab 6",
    "Tab 7","Tab 8","Tab 9","Tab 10","Tab 11","Tab 12","Tab 13","Tab 14" 
    ,"Tab 15","Tab 16"};

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_tabs_2);

    FragmentPagerAdapter adapter = new MyNavTabs(getSupportFragmentManager());

    ViewPager pager = (ViewPager)findViewById(R.id.pager);
    pager.setAdapter(adapter);

    TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
    indicator.setViewPager(pager);


}



class MyNavTabs extends FragmentPagerAdapter {///////maybe this needs to be in fragment to to call CoverFlowExampleFragment
    public MyNavTabs(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch(position)
        {
                case 0:
                     TestFragment fragment = new TestFragment();  
                     return fragment;

                 case 1:
                     TestFragment2 fragment2 = new TestFragment2();  
                     return fragment2;

          }

                     TestFragment3 fragment3 = new TestFragment3();  
                     return fragment3;


    }

    @Override
    public CharSequence getPageTitle(int position) {
        return CONTENT[position % CONTENT.length].toUpperCase();
    }

    @Override
    public int getCount() {
      return CONTENT.length;
    }
}public void onBackPressed() {

    finish();
    super.onBackPressed();
}

}

simple_tabs_2.xml

  <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<com.viewpagerindicator.TabPageIndicator
    android:id="@+id/indicator"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    />
<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:background="@drawable/bkg_gradient"/>

 </LinearLayout>  

TestFragment2.java

  public final class TestFragment2 extends Fragment {


TextView et;
TextView text;

SharedPreferences sp;
View myView;
CheckBox cb;
int counter_score;
int counter_score_this;
int counter_score_b;
int counter_score_c;
int counter_score_d;
int counter_score_e;
int GotSaved_ABC, GotSaved_EYE;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    counter_score=0;
    counter_score_this =0;
    counter_score_b =0;
    counter_score_c =0;
    counter_score_d =0;
    counter_score_e =0;


}




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View myView = inflater.inflate(R.layout.fragment_2, container, false);
     text = (TextView)myView.findViewById(R.id.textView1);
     et = (TextView)myView.findViewById(R.id.textView3);
     cb = (CheckBox) myView.findViewById(R.id.checkBox1);
    /// FragmentPagerAdapter adapter = new ScrollGallery(getChildFragmentManager());

   ///  ViewPager pager = (ViewPager)myView.findViewById(R.id.pager);
   //  pager.setAdapter(adapter);

     //TabPageIndicator indicator = (TabPageIndicator)myView.findViewById(R.id.indicator);
     //indicator.setViewPager(pager);
     CoverFlow mycoverFlow = new CoverFlow(getActivity());

     mycoverFlow.setAdapter(new ImageAdapter(getActivity()));

     ImageAdapter coverImageAdapter =  new ImageAdapter(getActivity());

     //coverImageAdapter.createReflectedImages();

     mycoverFlow.setAdapter(coverImageAdapter);

     mycoverFlow.setSpacing(-25);
     mycoverFlow.setSelection(4, true);
     mycoverFlow.setAnimationDuration(1000);

    loadPrefs();
    return myView;

}

private void loadPrefs() {
    int questions_int =156;
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
    GotSaved_ABC = sp.getInt("NAME", GotSaved_ABC);
    GotSaved_EYE = sp.getInt("NAME2", GotSaved_EYE);
    counter_score = GotSaved_ABC;
    counter_score_this =GotSaved_EYE;
    //////counter_score_2 = make it equal to whatever..
    int percentage = (int)( GotSaved_ABC + GotSaved_EYE * 100.0 / questions_int + 0.5);
    text.setText(percentage +"%");



//}
///class ScrollGallery extends FragmentPagerAdapter {///////this maybe needs to be in    fragment to to call CoverFlowExampleFragment
   // public ScrollGallery(FragmentManager fm) {
       // super(fm);
   /// }

    //@Override
   // public Fragment getItem(int position) {

       // return CoverFlowExampleFragment.getActivity();
    }
public class ImageAdapter extends BaseAdapter {
    int mGalleryItemBackground;
    private Context mContext;

    private FileInputStream fis;

    private Integer[] mImageIds = {
      R.drawable.kasabian_kasabian,
            R.drawable.starssailor_silence_is_easy,
            R.drawable.killers_day_and_age,
            R.drawable.garbage_bleed_like_me,
            R.drawable.death_cub_for_cutie_the_photo_album,
            R.drawable.kasabian_kasabian,
            R.drawable.massive_attack_collected,
            R.drawable.muse_the_resistance,
            R.drawable.starssailor_silence_is_easy
    };

    private ImageView[] mImages;

    public ImageAdapter(Context c) {
     mContext = c;
     mImages = new ImageView[mImageIds.length];
    }
 public boolean createReflectedImages() {
         //The gap we want between the reflection and the original image
         final int reflectionGap = 4;


         int index = 0;
         for (int imageId : mImageIds) {
       Bitmap originalImage = BitmapFactory.decodeResource(getResources(), 
         imageId);
          int width = originalImage.getWidth();
          int height = originalImage.getHeight();


          //This will not scale but will flip on the Y axis
          Matrix matrix = new Matrix();
          matrix.preScale(1, -1);

          //Create a Bitmap with the flip matrix applied to it.
          //We only want the bottom half of the image
          Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height/2,    width, height/2, matrix, false);


          //Create a new bitmap with same width but taller to fit reflection
          Bitmap bitmapWithReflection = Bitmap.createBitmap(width 
            , (height + height/2), Config.ARGB_8888);

         //Create a new Canvas with the bitmap that's big enough for
         //the image plus gap plus reflection
         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);
         //Draw in the reflection
         canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null);

         //Create a shader that is a linear gradient that covers the reflection
         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); 
         //Set the Transfer mode to be porter duff and destination in
         paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
         //Draw a rectangle using the paint with our linear gradient
         canvas.drawRect(0, height, width, 
           bitmapWithReflection.getHeight() + reflectionGap, paint); 

         ImageView imageView = new ImageView(mContext);
         imageView.setImageBitmap(bitmapWithReflection);
         imageView.setLayoutParams(new CoverFlow.LayoutParams(120, 180));
         imageView.setScaleType(ScaleType.MATRIX);
         mImages[index++] = imageView;

         }
      return true;
 }

    public int getCount() {
        return mImageIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

     //Use this code if you want to load from resources
        ImageView i = new ImageView(mContext);
        i.setImageResource(mImageIds[position]);
        i.setLayoutParams(new CoverFlow.LayoutParams(130, 130));
        i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

        //Make sure we set anti-aliasing otherwise we get jaggies
        BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();
        drawable.setAntiAlias(true);
        return i;

     //return mImages[position];
    }
  /** Returns the size (0.0f to 1.0f) of the views 
     * depending on the 'offset' to the center. */ 
     public float getScale(boolean focused, int offset) { 
       /* Formula: 1 / (2 ^ offset) */ 
         return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset))); 
     } 

  }

    //@Override
    ///public int getCount() {
        // TODO Auto-generated method stub
        //return 0;
    //}

       }

fragment_2.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"  android:weightSum="3"   android:orientation="horizontal" android:layout_gravity="center_horizontal" >  
<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Check this box" />
<TextView
    android:id="@+id/textView1"
    android:layout_width="200dp"
    android:layout_height="180dp"
    android:layout_marginLeft="-55dp"
    android:layout_marginTop="112dp"
    android:background="@drawable/blue_main_score"
    android:gravity="center_horizontal|center_vertical"
    android:text="0"
    android:shadowColor="@android:color/black"
    android:shadowRadius="7.0"
    android:shadowDx="1.0"
    android:shadowDy="1.0"
    android:textColor="#f5f5f5f5"
    android:textSize="50dp"
    android:textStyle="bold"
    android:visibility="visible" />


<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="left"

    android:text="Fragment TEST"
    android:textSize="48sp"
    android:id="@+id/textView3"/>

</LinearLayout>

</LinearLayout>

*edit forgot the CoverFlow.java

  public class CoverFlow extends Gallery {

  /**
  * Graphics Camera used for transforming the matrix of ImageViews
  */
private Camera mCamera = new Camera();

 /**
 * The maximum angle the Child ImageView will be rotated by
 */    
private int mMaxRotationAngle = 90;

 /**
 * The maximum zoom on the centre Child
 */
private int mMaxZoom = -500;

 /**
 * The Centre of the Coverflow 
 */   
private int mCoveflowCenter;

  public CoverFlow(Context context) {
  super(context);
  this.setStaticTransformationsEnabled(true);
  }

   public CoverFlow(Context context, AttributeSet attrs) {
   super(context, attrs);
    this.setStaticTransformationsEnabled(true);
  }

  public CoverFlow(Context context, AttributeSet attrs, int defStyle) {
   super(context, attrs, defStyle);
   this.setStaticTransformationsEnabled(true);   
  }

   /**
   * Get the max rotational angle of the image
   * @return the mMaxRotationAngle
   */
   public int getMaxRotationAngle() {
   return mMaxRotationAngle;
   }

   /**
   //* Set the max rotational angle of each image
   * @param maxRotationAngle the mMaxRotationAngle to set
    */
   public void setMaxRotationAngle(int maxRotationAngle) {
   mMaxRotationAngle = maxRotationAngle;
   }

  /**
   * Get the Max zoom of the centre image
   * @return the mMaxZoom
   */
  public int getMaxZoom() {
  return mMaxZoom;
  }

   /**
   * Set the max zoom of the centre image
   * @param maxZoom the mMaxZoom to set
   */
   public void setMaxZoom(int maxZoom) {
   mMaxZoom = maxZoom;
   }

    /**
    * Get the Centre of the Coverflow
    * @return The centre of this Coverflow.
    */
    private int getCenterOfCoverflow() {
    return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2 + getPaddingLeft();
    }

     /**
     * Get the Centre of the View
     * @return The centre of the given view.
     */
    private static int getCenterOfView(View view) {
    return view.getLeft() + view.getWidth() / 2;
    }  
    /**
    * {@inheritDoc}
    *
     * @see #setStaticTransformationsEnabled(boolean) 
    */ 
   protected boolean getChildStaticTransformation(View child, Transformation t) {

  final int childCenter = getCenterOfView(child);
  final int childWidth = child.getWidth() ;
  int rotationAngle = 0;

   t.clear();
   t.setTransformationType(Transformation.TYPE_MATRIX);

    if (childCenter == mCoveflowCenter) {
        transformImageBitmap((ImageView) child, t, 0);
    } else {      
        rotationAngle = (int) (((float) (mCoveflowCenter - childCenter)/ childWidth) *     mMaxRotationAngle);
        if (Math.abs(rotationAngle) > mMaxRotationAngle) {
         rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;   
        }
        transformImageBitmap((ImageView) child, t, rotationAngle);         
    }    

     return true;
     }

      /**
      * This is called during layout when the size of this view has changed. If
      * you were just added to the view hierarchy, you're called with the old
      * values of 0.
      *
      * @param w Current width of this view.
      * @param h Current height of this view.
      * @param oldw Old width of this view.
      * @param oldh Old height of this view.
      */
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    mCoveflowCenter = getCenterOfCoverflow();
  super.onSizeChanged(w, h, oldw, oldh);
   }

     /**
     * Transform the Image Bitmap by the Angle passed 
     * 
     * @param imageView ImageView the ImageView whose bitmap we want to rotate
     * @param t transformation 
     * @param rotationAngle the Angle by which to rotate the Bitmap
     */
     private void transformImageBitmap(ImageView child, Transformation t, int rotationAngle) {            
    mCamera.save();
    final Matrix imageMatrix = t.getMatrix();;
    final int imageHeight = child.getLayoutParams().height;;
    final int imageWidth = child.getLayoutParams().width;
    final int rotation = Math.abs(rotationAngle);

    mCamera.translate(0.0f, 0.0f, 100.0f);

    //As the angle of the view gets less, zoom in     
    if ( rotation < mMaxRotationAngle ) {
    float zoomAmount = (float) (mMaxZoom +  (rotation * 1.5));
    mCamera.translate(0.0f, 0.0f, zoomAmount);          
   } 

    mCamera.rotateY(rotationAngle);
    mCamera.getMatrix(imageMatrix);               
    imageMatrix.preTranslate(-(imageWidth/2), -(imageHeight/2)); 
    imageMatrix.postTranslate((imageWidth/2), (imageHeight/2));
    mCamera.restore();
    }
    }
Was it helpful?

Solution

A lot of code :-)

In your TestFragment2.java, there seems to be one big error (could explain why you don't see your CoverFlow) and another smaller one.

In your onCreateView method of TestFragment2, you forget to add your mycoverFlow to the view hierarchy. Add this to your onCreateView method and see if this fixes it (partially):

((ViewGroup)myView).addView(mycoverFlow, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

(maybe MATCH_PARENT should be WRAP_CONTENT).

A smaller error is that in this onCreateView method, you call mycoverFlow.setAdapter(...) twice. Only the last one has effect. Remove the first one.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top