天天看点

android Gallery3D效果

http://1002878825-qq-com.iteye.com/blog/1194788

java代码 

主页面:gallery3dactivity  

package com.xiawenquan;  

import android.app.activity;  

import android.os.bundle;  

import android.view.view;  

import android.widget.adapterview;  

import android.widget.toast;  

import android.widget.adapterview.onitemclicklistener;  

public class gallery3dactivity extends activity {  

    @override  

    protected void oncreate(bundle savedinstancestate) {  

        // todo auto-generated method stub  

        super.oncreate(savedinstancestate);  

        setcontentview(r.layout.main);     

        integer[] images = { r.drawable.aa, r.drawable.bb,     

                r.drawable.cc, r.drawable.dd, r.drawable.ee,     

                r.drawable.ff, /* r.drawable.gg,r.drawable.hh , 

                r.drawable.jj, r.drawable.kk, r.drawable.ll*/};     

        imageadapter adapter = new imageadapter(this, images);     

        adapter.createreflectedimages();//创建倒影效果     

        galleryflow galleryflow = (galleryflow) gallery3dactivity.this.findviewbyid(r.id.gallery01);     

        galleryflow.setfadingedgelength(0);     

        galleryflow.setspacing(-50); //图片之间的间距     

        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(0);     

    }     

}  

galleryflow类:作用是控制gallery  

import android.content.context;  

import android.graphics.camera;  

import android.graphics.matrix;  

import android.util.attributeset;  

import android.view.animation.transformation;  

import android.widget.gallery;  

import android.widget.imageview;  

public class galleryflow extends gallery {  

    private camera mcamera = new camera();//相机类  

    private int mmaxrotationangle = 60;//最大转动角度  

    private int mmaxzoom = -300;////最大缩放值  

    private int mcoveflowcenter;//半径值  

    public galleryflow(context context) {  

        super(context);  

        //支持转换 ,执行getchildstatictransformation方法  

        this.setstatictransformationsenabled(true);  

    }  

    public galleryflow(context context, attributeset attrs) {  

        super(context, attrs);  

    public galleryflow(context context, attributeset attrs, int defstyle) {  

        super(context, attrs, defstyle);  

    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中每个图片的旋转(重写的gallery中方法)  

    protected boolean getchildstatictransformation(view child, transformation t) {   

        //取得当前子view的半径值  

        final int childcenter = getcenterofview(child);  

        system.out.println("childcenter:"+childcenter);  

        final int childwidth = child.getwidth();  

        //旋转角度  

        int rotationangle = 0;  

        //重置转换状态  

        t.clear();  

        //设置转换类型  

        t.settransformationtype(transformation.type_matrix);  

        //如果图片位于中心位置不需要进行旋转  

        if (childcenter == mcoveflowcenter) {  

            transformimagebitmap((imageview) child, t, 0);  

        } else {  

            //根据图片在gallery中的位置来计算图片的旋转角度  

            rotationangle = (int) (((float) (mcoveflowcenter - childcenter) / childwidth) * mmaxrotationangle);  

            system.out.println("rotationangle:" +rotationangle);  

            //如果旋转角度绝对值大于最大旋转角度返回(-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) {  

        //对效果进行保存  

        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, 10.0f, 300.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轴上旋转,对应图片竖向向里翻转。  

        // 如果在x轴上旋转,则对应图片横向向里翻转。  

        mcamera.rotatey(rotationangle);  

        mcamera.getmatrix(imagematrix);  

        imagematrix.pretranslate(-(imagewidth / 2), -(imageheight / 2));  

        imagematrix.posttranslate((imagewidth / 2), (imageheight / 2));  

        mcamera.restore();  

最后是把图片设置到gallery中  

imageadapter类:  

import android.content.res.resources;  

import android.graphics.bitmap;  

import android.graphics.bitmapfactory;  

import android.graphics.canvas;  

import android.graphics.lineargradient;  

import android.graphics.paint;  

import android.graphics.porterduffxfermode;  

import android.graphics.bitmap.config;  

import android.graphics.shader.tilemode;  

import android.view.viewgroup;  

import android.widget.baseadapter;  

import android.widget.imageview.scaletype;  

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];     

    /**   

     * 创建倒影效果   

     * @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();     

      //创建矩阵对象     

      matrix matrix = new matrix();     

      //指定一个角度以0,0为坐标进行旋转     

      // matrix.setrotate(30);     

      //指定矩阵(x轴不变,y轴相反)     

      matrix.prescale(1, -1);     

      //将矩阵应用到该原图之中,返回一个宽度不变,高度为原图1/2的倒影位图     

      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);     

      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);     

      /**   

       * 参数一:为渐变起初点坐标x位置,   

       * 参数二:为y轴位置,   

       * 参数三和四:分辨对应渐变终点,   

       * 最后参数为平铺方式,   

       * 这里设置为镜像gradient是基于shader类,所以我们通过paint的setshader方法来设置这个渐变   

       */    

      lineargradient shader = new lineargradient(0,originalimage.getheight(), 0,     

              bitmapwithreflection.getheight() + reflectiongap,0x70ffffff, 0x00ffffff, tilemode.mirror);     

      //设置阴影     

      paint.setshader(shader);     

      paint.setxfermode(new porterduffxfermode(android.graphics.porterduff.mode.dst_in));     

      //用已经定义好的画笔构建一个矩形阴影渐变效果     

      canvas.drawrect(0, height, width, bitmapwithreflection.getheight()+ reflectiongap, paint);     

      //创建一个imageview用来显示已经画好的bitmapwithreflection     

      imageview imageview = new imageview(mcontext);     

      imageview.setimagebitmap(bitmapwithreflection);     

      //设置imageview大小 ,也就是最终显示的图片大小     

      imageview.setlayoutparams(new galleryflow.layoutparams(220, 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) {     

    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)));     

main.xml  

<?xml version="1.0" encoding="utf-8"?>  

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:orientation="vertical"   

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent" >  

    <com.xiawenquan.galleryflow  

        android:id="@+id/gallery01"  

        android:layout_margintop="20dip"  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

    />  

</linearlayout>  

textbitmap.rar (2.2 mb)

下载次数: 266

继续阅读