0

我试图使用 Neil Davies 的 CoverFlow Widget v2 作为片段活动。我期待这样的事情在此处输入图像描述

相反,我得到了这个在此处输入图像描述

很明显,我的实现出了点问题,但是因为我没有看到任何错误或崩溃......我有点迷失在哪里看。Anywho 下面是 java 和 xml 代码

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;
    //}

       }

片段_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 忘记了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();
    }
    }
4

1 回答 1

2

很多代码:-)

在您的 TestFragment2.java 中,似乎有一个大错误(可以解释为什么您看不到 CoverFlow)和另一个较小的错误。

在您的onCreateView方法中TestFragment2,您忘记将您的添加mycoverFlow到视图层次结构中。将此添加到您的onCreateView方法中,看看是否可以修复它(部分):

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

(也许 MATCH_PARENT 应该是 WRAP_CONTENT)。

一个较小的错误是在此onCreateView方法中,您调用mycoverFlow.setAdapter(...)了两次。只有最后一个有效。删除第一个。

于 2013-03-08T21:51:46.437 回答