关于Gallery的问题。无法改变其尺寸大小
从网上找到一个Gallery的代码,运行后发现,我无法更改其尺寸。
布局xml是这样的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:background="#0000ff">
<com.gallery.GalleryFlow android:id="@+id/Gallery01"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
当我把android:background改成了蓝色(#0000ff),结果只有一小片区域变成了蓝色,而非整个布局背景变换颜色。先铺出代码,以供参详:
首先是入口Activity代码:
public class ActivityMain extends Activity {public void onCreate(Bundle savedInstanceState) {System.out.println("ActivityMain"); super.onCreate(savedInstanceState); setContentView(R.layout.layout_gallery); /* Integer[] images = { R.drawable.img0001, R.drawable.img0030, R.drawable.img0100, R.drawable.img0130, R.drawable.img0200, R.drawable.img0230, R.drawable.img0300, R.drawable.img0330, R.drawable.img0354 };*/ Integer[] images = { R.drawable.ad_up_01, R.drawable.ad_up_02, R.drawable.ad_up_03, R.drawable.ad_up_04, R.drawable.ad_up_05 }; ImageAdapter adapter = new ImageAdapter(this, images); adapter.createReflectedImages(); GalleryFlow galleryFlow = (GalleryFlow) findViewById(R.id.Gallery01); galleryFlow.setAdapter(adapter); }}
public class ImageAdapter extends BaseAdapter {int mGalleryItemBackground;private Context mContext;private Integer[] mImageIds;private ImageView[] mImages;public ImageAdapter(Context c, Integer[] ImageIds) {mContext = c;mImageIds = ImageIds;mImages = new ImageView[mImageIds.length];}public boolean createReflectedImages() {final int reflectionGap = 4;//倒影间隙int index = 0;for (int imageId : mImageIds) {Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);int width = originalImage.getWidth();int height = originalImage.getHeight();//实现图片的反转,见Android利用Matrix简单处理图片。Matrix matrix = new Matrix();matrix.preScale(1, -1);//创建反转后的图片Bitmap对象,图片高是原图的一半。倒影Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,height / 2, width, height / 3, matrix, false);//创建标准的Bitmap对象,宽和原图一致,高是原图的1.5倍。Bitmap bitmapWithReflection = Bitmap.createBitmap(width,(height + height / 2), Config.ARGB_8888);//创建画布对象,将原图画于画布,起点是原点位置。Canvas canvas = new Canvas(bitmapWithReflection);//canvas.clipRect(0, 10, 400, 300); canvas.drawBitmap(originalImage, 0, 0, null);//将反转后的图片画到画布中Paint deafaultPaint = new Paint();canvas.drawRect(0, height, width, height + reflectionGap,deafaultPaint);//创建线性渐变LinearGradient 对象。LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, bitmapWithReflection.getHeight()+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);Paint paint = new Paint();paint.setShader(shader);paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ reflectionGap, paint);ImageView imageView = new ImageView(mContext);imageView.setImageBitmap(bitmapWithReflection);imageView.setLayoutParams(new GalleryFlow.LayoutParams(400, 300));//imageView.setLayoutParams(new GalleryFlow.LayoutParams(510, 378));imageView.setScaleType(ScaleType.FIT_XY);mImages[index++] = imageView;}return true;}private Resources getResources() {// TODO Auto-generated method stubreturn null;}public int getCount() {//return mImageIds.length;return Integer.MAX_VALUE;}public Object getItem(int position) {return position;}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {//return mImages[position]; //通过取余来循环取得resIds数组中的图像资源ID return mImages[position % mImages.length];} /**距离中央距离位移 利用getScale返回View大小*/ public float getScale(boolean focused, int offset) {return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));}}
public class GalleryFlow extends Gallery {private Camera mCamera = new Camera();private int mMaxRotationAngle = 60;private int mMaxZoom = -150; //mMaxZoom是图片在Z轴平移的距离,视觉上看上去就是放大缩小的效果private int mCoveflowCenter;public GalleryFlow(Context context) {super(context);this.setStaticTransformationsEnabled(true);}public GalleryFlow(Context context, AttributeSet attrs) {super(context, attrs);this.setStaticTransformationsEnabled(true);}public GalleryFlow(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;return view.getLeft() + view.getWidth()/2 ;}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);System.out.println("w, h, oldw, oldh");System.out.println(w);System.out.println(h);System.out.println(oldw);System.out.println(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);// 在Z轴上正向移动camera的视角,实际效果为放大图片。// 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。//mCamera.translate(0.0f, 0.0f, 100.0f);mCamera.translate(0.0f, 0.0f, 130.0f);// As the angle of the view gets less, zoom inif (rotation < mMaxRotationAngle) {float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));mCamera.translate(0.0f, 0.0f, zoomAmount);}// 在Y轴上旋转,对应图片竖向向里翻转。// 如果在X轴上旋转,则对应图片横向向里翻转。//mCamera.rotateY(rotationAngle);mCamera.getMatrix(imageMatrix);/** * 在做任何变换前,先将整个图像从图像的中心点移动到原点((0,0)点), 执行变换完毕后再将图像从原点移动到之前的中心点。 * 如果不加这俩句,任何变换将以图像的原点为变换中心点, 加了之后,任何变换都将以图像的中心点为变换中心点。 */imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));mCamera.restore();}}