一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android控件Gallery3D效果

 Reven 2011-11-17

效果圖如下:

貼上代碼:
1.擴(kuò)展Gallery:
public class GalleryFlow extends Gallery {
    private Camera mCamera = new Camera();//相機(jī)類
    private int mMaxRotationAngle = 60;//最大轉(zhuǎn)動角度
    private int mMaxZoom = -300;////最大縮放值
    private int mCoveflowCenter;//半徑值
    public GalleryFlow(Context context) {
        super(context);
        //支持轉(zhuǎn)換 ,執(zhí)行g(shù)etChildStaticTransformation方法
        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);
    }
    public int getMaxRotationAngle() {
        return mMaxRotationAngle;
    }
    public void setMaxRotationAngle(int maxRotationAngle) {
        mMaxRotationAngle = maxRotationAngle;
    }
    public int getMaxZoom() {
        return mMaxZoom;
    }
    public void setMaxZoom(int maxZoom) {
        mMaxZoom = maxZoom;
    }
    private int getCenterOfCoverflow() {
        return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
                        + getPaddingLeft();
    }
    private static int getCenterOfView(View view) {
        System.out.println("view left :"+view.getLeft());
        System.out.println("view width :"+view.getWidth());
        return view.getLeft() + view.getWidth() / 2;
    }
    
    
   //控制gallery中每個圖片的旋轉(zhuǎn)(重寫的gallery中方法)
    protected boolean getChildStaticTransformation(View child, Transformation t) {  
        //取得當(dāng)前子view的半徑值
        final int childCenter = getCenterOfView(child);
        System.out.println("childCenter:"+childCenter);
        final int childWidth = child.getWidth();
        //旋轉(zhuǎn)角度
        int rotationAngle = 0;
        //重置轉(zhuǎn)換狀態(tài)
        t.clear();
        //設(shè)置轉(zhuǎn)換類型
        t.setTransformationType(Transformation.TYPE_MATRIX);
        //如果圖片位于中心位置不需要進(jìn)行旋轉(zhuǎn)
        if (childCenter == mCoveflowCenter) {
            transformImageBitmap((ImageView) child, t, 0);
        } else {
            //根據(jù)圖片在gallery中的位置來計算圖片的旋轉(zhuǎn)角度
            rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
            System.out.println("rotationAngle:" +rotationAngle);
            //如果旋轉(zhuǎn)角度絕對值大于最大旋轉(zhuǎn)角度返回(-mMaxRotationAngle或mMaxRotationAngle;)
            if (Math.abs(rotationAngle) > mMaxRotationAngle) {
                rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;
            }
            transformImageBitmap((ImageView) child, t, rotationAngle);
        }
        return true;
    }
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mCoveflowCenter = getCenterOfCoverflow();
        super.onSizeChanged(w, h, oldw, oldh);
    }
    private void transformImageBitmap(ImageView child, Transformation t,
                    int rotationAngle) {
        //對效果進(jìn)行保存
        mCamera.save();
        final Matrix imageMatrix = t.getMatrix();
        //圖片高度
        final int imageHeight = child.getLayoutParams().height;
        //圖片寬度
        final int imageWidth = child.getLayoutParams().width;
        
        //返回旋轉(zhuǎn)角度的絕對值
        final int rotation = Math.abs(rotationAngle);
        
        // 在Z軸上正向移動camera的視角,實際效果為放大圖片。
        // 如果在Y軸上移動,則圖片上下移動;X軸上對應(yīng)圖片左右移動。
        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);
        }
        // 在Y軸上旋轉(zhuǎn),對應(yīng)圖片豎向向里翻轉(zhuǎn)。
        // 如果在X軸上旋轉(zhuǎn),則對應(yīng)圖片橫向向里翻轉(zhuǎn)。
        mCamera.rotateY(rotationAngle);
        mCamera.getMatrix(imageMatrix);
        imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));
        imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));
        mCamera.restore();
    }
}

2.填充圖片容器(BaseAdapter):
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];
    }
    /**
     * 創(chuàng)建倒影效果
     * @return
     */
    public boolean createReflectedImages() {
     //倒影圖和原圖之間的距離
     final int reflectionGap = 4;
     int index = 0;
     for (int imageId : mImageIds) {
      //返回原圖解碼之后的bitmap對象
      Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);
      int width = originalImage.getWidth();
      int height = originalImage.getHeight();
      //創(chuàng)建矩陣對象
      Matrix matrix = new Matrix();
      
      //指定一個角度以0,0為坐標(biāo)進(jìn)行旋轉(zhuǎn)
      // matrix.setRotate(30);
      
      //指定矩陣(x軸不變,y軸相反)
      matrix.preScale(1, -1);
      
      //將矩陣應(yīng)用到該原圖之中,返回一個寬度不變,高度為原圖1/2的倒影位圖
      Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
        height/2, width, height/2, matrix, false);
      
      //創(chuàng)建一個寬度不變,高度為原圖+倒影圖高度的位圖
      Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
        (height + height / 2), Config.ARGB_8888);
      
      //將上面創(chuàng)建的位圖初始化到畫布
      Canvas canvas = new Canvas(bitmapWithReflection);
      canvas.drawBitmap(originalImage, 0, 0, null);
      
      Paint deafaultPaint = new Paint(); 
      deafaultPaint.setAntiAlias(false);
//    canvas.drawRect(0, height, width, height + reflectionGap,deafaultPaint);
      canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
      Paint paint = new Paint();
      paint.setAntiAlias(false);
       
      /**
       * 參數(shù)一:為漸變起初點坐標(biāo)x位置,
       * 參數(shù)二:為y軸位置,
       * 參數(shù)三和四:分辨對應(yīng)漸變終點,
       * 最后參數(shù)為平鋪方式,
       * 這里設(shè)置為鏡像Gradient是基于Shader類,所以我們通過Paint的setShader方法來設(shè)置這個漸變
       */
      LinearGradient shader = new LinearGradient(0,originalImage.getHeight(), 0,
              bitmapWithReflection.getHeight() + reflectionGap,0x70ffffff, 0x00ffffff, TileMode.MIRROR);
      //設(shè)置陰影
      paint.setShader(shader);
      paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));
      //用已經(jīng)定義好的畫筆構(gòu)建一個矩形陰影漸變效果
      canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ reflectionGap, paint);
      
      //創(chuàng)建一個ImageView用來顯示已經(jīng)畫好的bitmapWithReflection
      ImageView imageView = new ImageView(mContext);
      imageView.setImageBitmap(bitmapWithReflection);
      //設(shè)置imageView大小 ,也就是最終顯示的圖片大小
      imageView.setLayoutParams(new GalleryFlow.LayoutParams(300, 400));
      //imageView.setScaleType(ScaleType.MATRIX);
      mImages[index++] = imageView;
     }
     return true;
    }
    @SuppressWarnings("unused")
    private Resources getResources() {
        return null;
    }
    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) {
        return mImages[position];
    }
    public float getScale(boolean focused, int offset) {
        return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
    }
   }

3.創(chuàng)建Activity:
public class Gallery3DActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        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.img0330,R.drawable.img0354 };
        
        ImageAdapter adapter = new ImageAdapter(this, images);
        adapter.createReflectedImages();//創(chuàng)建倒影效果
        GalleryFlow galleryFlow = (GalleryFlow) this.findViewById(R.id.Gallery01);
        galleryFlow.setFadingEdgeLength(0);
        galleryFlow.setSpacing(-100); //圖片之間的間距
        galleryFlow.setAdapter(adapter);
        
        galleryFlow.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(getApplicationContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();
            }
            
        });
        galleryFlow.setSelection(4);
    }
}

  以上實現(xiàn)代碼里面我都做了注釋相信大家完全可以看懂。稍微解釋下,在BaseAdapter中主要做了圖片的倒影效果以及創(chuàng)建了對原始圖片和倒影的顯示區(qū)域。GalleryFlow中主要做了對圖片的旋轉(zhuǎn)和縮放操作,根據(jù)圖片的屏幕中的位置對其進(jìn)行旋轉(zhuǎn)縮放操作。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    在线免费观看黄色美女| 免费大片黄在线观看日本| 国产一区二区三区成人精品| 麻豆看片麻豆免费视频| 99亚洲综合精品成人网色播| 欧美午夜一区二区福利视频| 欧美成人黄色一级视频| 国产欧美另类激情久久久| 亚洲一区二区三区精选| 亚洲国产精品无遮挡羞羞| 精品少妇人妻一区二区三区| 中字幕一区二区三区久久蜜桃| 熟女少妇一区二区三区蜜桃| 国产成人高清精品尤物| 日本欧美视频在线观看免费| 夫妻性生活真人动作视频 | 国产91麻豆精品成人区| 蜜臀人妻一区二区三区| 女人高潮被爽到呻吟在线观看| 日本淫片一区二区三区| av在线免费观看在线免费观看| 亚洲人午夜精品射精日韩| 久久这里只精品免费福利| 精品人妻精品一区二区三区| 在线欧洲免费无线码二区免费| 内射精子视频欧美一区二区| 日韩精品在线观看一区| 日本欧美在线一区二区三区| 国产又粗又深又猛又爽又黄| 亚洲三级视频在线观看免费| 亚洲国产成人久久99精品| 日韩特级黄片免费在线观看| 太香蕉久久国产精品视频| 亚洲一区二区三区在线免费| 国产精品午夜福利在线观看| 国产熟女一区二区不卡| 国产精品一区日韩欧美| 国产情侣激情在线对白| 精品人妻精品一区二区三区| 欧美日韩国产成人高潮| 极品熟女一区二区三区|