亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android 使用Gallery實現3D相冊(附效果圖+Demo源碼)

2020-04-11 12:04:23
字體:
來源:轉載
供稿:網友
今天因為要做一個設置開機畫面的功能,主要是讓用戶可以設置自己的開機畫面,應用層需要做讓用戶選擇開機畫面圖片的功能。所以需要做一個簡單的圖片瀏覽選擇程序。最后選用Gallery作為基本控件。加入了一些炫一點的元素,做成3D滑動效果。下面是Demo例子截圖:

這個效果網上已經很多人做出來了,只是這次需要用到,所以自己也實踐了一下(這里例子我也是根據網上一些資料編寫)。特意找了幾張美女圖片給大家養養眼,O(∩_∩)O哈!下面針對一些關鍵代碼進行簡要說明,需要做這方面東西的朋友可以看看。這篇文章是實用性文章,理論分析不多。

1、重載Gallery類
因為需要加入倒影和3D切換的效果,因此我們需要重載Gallery類,其中有兩個方法我們需要重寫,一個是onSizeChanged(),另外一個是getChildStaticTransformation()。下面我們看看onSizeChanged()需要做的事情。

復制代碼 代碼如下:

    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
    //重寫計算旋轉的中心
        mCoveflowCenter = getCenterOfCoverflow();
        super.onSizeChanged(w, h, oldw, oldh);
    }

上面主要做的事情就是在改變大小的時候,重新計算滑動切換時需要旋轉變化的中心。下面計算圖片位置時,會重新計算。
復制代碼 代碼如下:

protected boolean getChildStaticTransformation(View child, Transformation trans)
    {
     //圖像的中心點和寬度
        final int childCenter = getCenterOfView(child);
        final int childWidth = child.getWidth();
        int rotationAngle = 0;

        trans.clear();
        trans.setTransformationType(Transformation.TYPE_BOTH);        // alpha 和 matrix 都變換

        if (childCenter == mCoveflowCenter)
        {   
        // 正中間的childView
            transformImageBitmap((ImageView) child, trans, 0);   
        }
        else
        {       
        // 兩側的childView
            rotationAngle = (int) ( ( (float) (mCoveflowCenter - childCenter) / childWidth ) * mMaxRotationAngle );
            if (Math.abs(rotationAngle) > mMaxRotationAngle)
            {
                rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;
            }
       //根據偏移角度對圖片進行處理,看上去有3D的效果。
            transformImageBitmap((ImageView) child, trans, rotationAngle);
        }

        return true;
    }


上面就是重載Gallery的時候,需要注意處理的事情,其實主要就是做圖形變化,效果圖里面的圖片斜著顯示就是這里處理的結果,目的就是讓人看上去有立體感。

2、編寫Adapter適配器
我們使用很多控件都涉及適配器,就是用來綁定數據源和目標控件的一個中間件。這里我們需要重載BaseAdapter作為我們Gallery的適配器。主要是處理源圖像,加入倒影,生成新的數據源圖片。

復制代碼 代碼如下:

public boolean createReflectedForAdapter()
    {
        final int reflectionGap = 4;
        final int Height = 200;
        int index = 0;
        for (Map<String, Object> map : list)
        {
            Integer id = (Integer) map.get("image");
            // 獲取原始圖片
            Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), id);   
            int width = originalImage.getWidth();
            int height = originalImage.getHeight();
            float scale = Height / (float)height;

            Matrix sMatrix = new Matrix();
            sMatrix.postScale(scale, scale);
            Bitmap miniBitmap = Bitmap.createBitmap(originalImage, 0, 0,
                    originalImage.getWidth(), originalImage.getHeight(), sMatrix, true);

            //是否原圖片數據,節省內存
            originalImage.recycle();

            int mwidth = miniBitmap.getWidth();
            int mheight = miniBitmap.getHeight();
            Matrix matrix = new Matrix();
            // 圖片矩陣變換(從低部向頂部的倒影)
            matrix.preScale(1, -1);           
            // 截取原圖下半部分
            Bitmap reflectionImage = Bitmap.createBitmap(miniBitmap, 0, mheight/2, mwidth, mheight/2, matrix, false);
            // 創建倒影圖片(高度為原圖3/2)
            Bitmap bitmapWithReflection = Bitmap.createBitmap(mwidth, (mheight + mheight / 2), Config.ARGB_8888);   
            // 繪制倒影圖(原圖 + 間距 + 倒影)
            Canvas canvas = new Canvas(bitmapWithReflection);   
            // 繪制原圖
            canvas.drawBitmap(miniBitmap, 0, 0, null);       
            Paint paint = new Paint();
            // 繪制原圖與倒影的間距
            canvas.drawRect(0, mheight, mwidth, mheight + reflectionGap, paint);
            // 繪制倒影圖
            canvas.drawBitmap(reflectionImage, 0, mheight + reflectionGap, null);   

            paint = new Paint();
            // 線性漸變效果
            LinearGradient shader = new LinearGradient(0, miniBitmap.getHeight(), 0, bitmapWithReflection.getHeight()
                    + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
            paint.setShader(shader);   
            // 倒影遮罩效果
            paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));       
            // 繪制倒影的陰影效果
            canvas.drawRect(0, mheight, mwidth, bitmapWithReflection.getHeight() + reflectionGap, paint);       
            ImageView imageView = new ImageView(mContext);
        // 設置倒影圖片
            imageView.setImageBitmap(bitmapWithReflection);       
            imageView.setLayoutParams(new GalleryView.LayoutParams((int)(width * scale),
                    (int)(mheight * 3 / 2.0 + reflectionGap)));
            imageView.setScaleType(ScaleType.MATRIX);
            mImages[index++] = imageView;
        }
        return true;
    }

上面其實就是一個圖片處理過程,主要做的事情就是生成倒影,效果圖里面底下是有倒影的。就是利用上面算法生成。我們在適配器添加圖片的時候,會把適配器原生圖片進行處理,加入倒影的效果。這個我們在圖片初始化的時候就可以調用處理,具體代碼可以查看Demo里面的代碼關系。

具體圖片滑動的過程,Gallery會幫我們處理好,我們要做的事情其實就是提供添加了特效的圖片數據源,以及處理3D顯示的變化效果,最后都會提供View作為顯示圖像給Gallery用來顯示。

今天主要是說說如何實現Gallery的3D顯示切換,Demo的代碼很多是基于網上一些現成效果,感謝這些分享成果的開發者。下面是Demo的下載,不清楚的可以把Demo下載下來,運行看看效果然后分析一下代碼。代碼不多,也不是很復雜。

Gallery3D例子代碼:點擊下載

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美欧洲在线观看| 欧美国产日韩一区| 视频一区视频二区国产精品| 亚洲一区制服诱惑| 成人h视频在线观看播放| 亚洲二区在线播放视频| 亚洲一区www| 国产精品专区h在线观看| 成人高清视频观看www| 欧美极品xxxx| 中文字幕一区二区精品| 综合国产在线观看| 亚洲国产97在线精品一区| 国产精品最新在线观看| 中文字幕日韩av电影| 久久精品国产久精国产思思| 亚洲精品国产精品乱码不99按摩| 欧美激情视频网站| 国产成人aa精品一区在线播放| 日韩欧美视频一区二区三区| 亚洲成人黄色在线观看| 久久精品人人做人人爽| 亚洲2020天天堂在线观看| 日韩欧美在线免费| 久久久亚洲精选| 久久久久九九九九| 亚洲视频一区二区三区| 日产日韩在线亚洲欧美| 精品国产成人在线| 亚洲护士老师的毛茸茸最新章节| 色狠狠久久aa北条麻妃| 国产成人精品一区二区在线| 亚洲直播在线一区| 日韩av片永久免费网站| 欧美日韩亚洲视频一区| 精品一区二区三区四区| 国产91成人在在线播放| 欧美激情第一页xxx| 日韩在线观看免费av| 欧美日韩美女在线观看| 欧美激情精品久久久久久蜜臀| 久久国产精品99国产精| 国产亚洲欧美视频| 欧美日韩亚洲精品一区二区三区| 在线视频一区二区| 亚洲第一中文字幕| 伊是香蕉大人久久| 久久97精品久久久久久久不卡| 国内精品久久久久| 亚洲人成人99网站| 中文字幕亚洲激情| 久久97久久97精品免视看| 中文字幕亚洲欧美日韩在线不卡| 欧美成人国产va精品日本一级| 亚洲男人天堂2023| 中文字幕视频一区二区在线有码| 97视频在线观看亚洲| 久久久免费精品视频| 日韩有码片在线观看| 色妞一区二区三区| 国产成人精彩在线视频九色| 国产精品欧美日韩一区二区| 91精品免费久久久久久久久| 日韩视频―中文字幕| 26uuu另类亚洲欧美日本一| 成人一区二区电影| www国产91| 国产亚洲视频在线| 国产精品电影久久久久电影网| 亚洲精品美女在线观看| 中文字幕在线看视频国产欧美在线看完整| 亚洲大胆美女视频| 亚洲伊人久久大香线蕉av| 狠狠色狠狠色综合日日小说| 日本不卡免费高清视频| 77777少妇光屁股久久一区| 日韩精品一区二区三区第95| 欧美精品激情blacked18| 欧美大片在线看| 国产精品69av| 欧美日韩成人网| 中文字幕av一区中文字幕天堂| 国产丝袜一区二区三区免费视频| 国产精品久久久久久久久久| 亚洲成人av资源网| 韩国精品美女www爽爽爽视频| 国产激情综合五月久久| 中文字幕一区日韩电影| 欧美日韩成人在线视频| 日韩精品福利在线| 国自产精品手机在线观看视频| 57pao成人国产永久免费| 欧美激情二区三区| 欧美中文在线观看| 亚洲大尺度美女在线| 97免费视频在线播放| 国产精品偷伦一区二区| 欧美疯狂做受xxxx高潮| 精品久久久免费| 57pao成人永久免费视频| 色阁综合伊人av| 秋霞成人午夜鲁丝一区二区三区| 日韩成人在线视频观看| 国产97免费视| 欧美日韩在线第一页| 97色在线观看免费视频| 久久全球大尺度高清视频| 欧美天堂在线观看| 色无极影院亚洲| 亚洲一区二区三区香蕉| 91丝袜美腿美女视频网站| 亚洲风情亚aⅴ在线发布| 欧美日韩国产精品一区二区不卡中文| 亚洲free性xxxx护士白浆| 日本欧美在线视频| 热久久视久久精品18亚洲精品| 久久99精品久久久久久琪琪| 亚洲欧美中文在线视频| 亚洲欧洲一区二区三区在线观看| 免费不卡在线观看av| 激情av一区二区| 午夜欧美不卡精品aaaaa| 日韩免费av一区二区| 久久激情视频免费观看| 亚洲一区二区久久久久久久| 成人做爽爽免费视频| 精品久久久久久久久久久久久| 欧美亚洲另类激情另类| 成人乱人伦精品视频在线观看| 国产精品中文在线| 91精品国产综合久久久久久久久| 午夜精品久久久久久久白皮肤| 亚洲视频网站在线观看| 久热精品视频在线观看一区| 精品国内自产拍在线观看| 欧美华人在线视频| 欧美激情手机在线视频| 日本精品久久久久久久| 亚洲日本成人网| 韩国一区二区电影| 亚洲国产精品yw在线观看| 最近2019中文字幕第三页视频| 国产在线98福利播放视频| 亚洲色图15p| 亚洲欧美中文日韩在线| 国产精品免费久久久久久| 亚洲精品97久久| 亚洲r级在线观看| 日本精品一区二区三区在线播放视频| 国产日本欧美一区二区三区| 国外色69视频在线观看| 欧美一区第一页| 欧美日韩高清区| 久久精品久久久久电影| 欧美日韩中文字幕在线视频| 国产亚洲精品美女久久久久| 在线丨暗呦小u女国产精品| 国产狼人综合免费视频| 久久精视频免费在线久久完整在线看| 久久久精品亚洲| 亚洲欧美日韩另类| 欧美激情aaaa| 国产91在线播放精品91| 91精品综合久久久久久五月天|