`
wen742538485
  • 浏览: 228964 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android开发3D界面特效

阅读更多



001
package com.test.util;
002

003
import com.dooya.activity.R;
004

005
import android.content.Context;
006
import android.graphics.Bitmap;
007
import android.graphics.BitmapFactory;
008
import android.graphics.Canvas;
009
import android.graphics.LinearGradient;
010
import android.graphics.Matrix;
011
import android.graphics.Paint;
012
import android.graphics.PorterDuffXfermode;
013
import android.graphics.Bitmap.Config;
014
import android.graphics.PorterDuff.Mode;
015
import android.graphics.Shader.TileMode;
016
import android.graphics.drawable.BitmapDrawable;
017
import android.view.View;
018
import android.view.ViewGroup;
019
import android.widget.BaseAdapter;
020
import android.widget.ImageView;
021

022
public class ImageAdapter extends BaseAdapter {
023
    int mGalleryItemBackground;
024
    private Context mContext;
025
    //加载资源图片
026
    private Integer[] mImageIds = {
027
            R.drawable.favorite,
028
            R.drawable.room,
029
            R.drawable.scene,
030
            R.drawable.security,
031
            R.drawable.time,
032
            R.drawable.set};
033

034
    public ImageAdapter(Context c) {
035
        mContext = c;
036
    }
037

038
    public int getCount() {
039
        return mImageIds.length;
040
    }
041

042
    public Object getItem(int position) {
043
        return position;
044
    }
045

046
    public long getItemId(int position) {
047
        return position;
048
    }
049

050
    public View getView(int position, View convertView, ViewGroup parent) {
051

052
        ImageView i = createReflectedImages(mContext,mImageIds[position]);
053
        
054
        i.setLayoutParams(new CoverFlow.LayoutParams(120, 100));
055
        i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
056
        
057
        // 设置的抗锯齿
058
        BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();
059
        drawable.setAntiAlias(true);
060
        return i;
061
    }
062

063
    public float getScale(boolean focused, int offset) {
064
        return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
065
    }
066
    
067
    /**
068
     * 设置镜像图像
069
     * @param mContext
070
     * @param imageId
071
     * <a href="http://my.oschina.net/u/556800" rel="nofollow" target="_blank">@return</a>
072
     */
073
    public ImageView createReflectedImages(Context mContext,int imageId) {
074

075
        Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);
076
        
077
        final int reflectionGap = 4;
078
        
079
        int width = originalImage.getWidth();
080
        int height = originalImage.getHeight();
081

082
        Matrix matrix = new Matrix();
083
        matrix.preScale(1, -1);
084

085
        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
086
                height / 2, width, height / 2, matrix, false);
087

088
        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
089
                (height + height / 2), Config.ARGB_8888);
090

091
        Canvas canvas = new Canvas(bitmapWithReflection);
092

093
        canvas.drawBitmap(originalImage, 0, 0, null);
094

095
        Paint deafaultPaint = new Paint();
096
        canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
097

098
        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
099

100
        Paint paint = new Paint();
101
        LinearGradient shader = new LinearGradient(0, originalImage
102
                .getHeight(), 0, bitmapWithReflection.getHeight()
103
                + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.MIRROR);
104

105
        paint.setShader(shader);
106

107
        paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
108

109
        canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
110
                + reflectionGap, paint);
111

112
        ImageView imageView = new ImageView(mContext);
113
        imageView.setImageBitmap(bitmapWithReflection);
114

115
        return imageView;
116
    }
117
    
118
}
001
package com.test.util;
002

003
import android.content.Context;
004
import android.graphics.Camera;
005
import android.graphics.Matrix;
006
import android.util.AttributeSet;
007
import android.view.View;
008
import android.view.animation.Transformation;
009
import android.widget.Gallery;
010
import android.widget.ImageView;
011

012
public class CoverFlow extends Gallery {
013

014
    private Camera mCamera = new Camera();
015
    private int mMaxRotationAngle = 50;//60;
016
    private int mMaxZoom = -380;//-120;
017
    private int mCoveflowCenter;
018
    private boolean mAlphaMode = true;
019
    private boolean mCircleMode = false;
020

021
    public CoverFlow(Context context) {
022
        super(context);
023
        this.setStaticTransformationsEnabled(true);
024
    }
025

026
    public CoverFlow(Context context, AttributeSet attrs) {
027
        super(context, attrs);
028
        this.setStaticTransformationsEnabled(true);
029
    }
030

031
    public CoverFlow(Context context, AttributeSet attrs, int defStyle) {
032
        super(context, attrs, defStyle);
033
        this.setStaticTransformationsEnabled(true);
034
    }
035

036
    public int getMaxRotationAngle() {
037
        return mMaxRotationAngle;
038
    }
039

040
    public void setMaxRotationAngle(int maxRotationAngle) {
041
        mMaxRotationAngle = maxRotationAngle;
042
    }
043

044
    public boolean getCircleMode() {
045
        return mCircleMode;
046
    }
047

048
    public void setCircleMode(boolean isCircle) {
049
        mCircleMode = isCircle;
050
    }
051

052
    public boolean getAlphaMode() {
053
        return mAlphaMode;
054
    }
055

056
    public void setAlphaMode(boolean isAlpha) {
057
        mAlphaMode = isAlpha;
058
    }
059

060
    public int getMaxZoom() {
061
        return mMaxZoom;
062
    }
063

064
    public void setMaxZoom(int maxZoom) {
065
        mMaxZoom = maxZoom;
066
    }
067

068
    private int getCenterOfCoverflow() {
069
        return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
070
                + getPaddingLeft();
071
    }
072

073
    private static int getCenterOfView(View view) {
074
        return view.getLeft() + view.getWidth() / 2;
075
    }
076

077
    protected boolean getChildStaticTransformation(View child, Transformation t) {
078
        final int childCenter = getCenterOfView(child);
079
        final int childWidth = child.getWidth();
080
        int rotationAngle = 0;
081
        t.clear();
082
        t.setTransformationType(Transformation.TYPE_MATRIX);
083
        if (childCenter == mCoveflowCenter) {
084
            transformImageBitmap((ImageView) child, t, 0);
085
        } else {
086
            rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
087
            if (Math.abs(rotationAngle) > mMaxRotationAngle) {
088
                rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle
089
                        : mMaxRotationAngle;
090
            }
091
            transformImageBitmap((ImageView) child, t, rotationAngle);
092
        }
093
        return true;
094
    }
095

096
    /**
097
     *
098
     */
099
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
100
        mCoveflowCenter = getCenterOfCoverflow();
101
        super.onSizeChanged(w, h, oldw, oldh);
102
    }
103

104
    /**
105
     * 把图像位图的角度通过
106
     */
107
    private void transformImageBitmap(ImageView child, Transformation t,
108
            int rotationAngle) {
109
        mCamera.save();
110
        final Matrix imageMatrix = t.getMatrix();
111
        final int imageHeight = child.getLayoutParams().height;
112
        final int imageWidth = child.getLayoutParams().width;
113
        final int rotation = Math.abs(rotationAngle);
114
        mCamera.translate(0.0f, 0.0f, 100.0f);
115

116
        // 如视图的角度更少,放大
117
        if (rotation <= mMaxRotationAngle) {
118
            float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));
119
            mCamera.translate(0.0f, 0.0f, zoomAmount);
120
            if (mCircleMode) {
121
                if (rotation < 40)
122
                    mCamera.translate(0.0f, 155, 0.0f);
123
                else
124
                    mCamera.translate(0.0f, (255 - rotation * 2.5f), 0.0f);
125
            }
126
            if (mAlphaMode) {
127
                ((ImageView) (child)).setAlpha((int) (255 - rotation * 2.5));
128
            }
129
        }
130
        mCamera.rotateY(rotationAngle);
131
        mCamera.getMatrix(imageMatrix);
132
        imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));
133
        imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));
134
        mCamera.restore();
135
    }
136
}
01
package com.test.activity;
02

03
import android.app.Activity;
04

05
import android.os.Bundle;
06

07
import android.view.WindowManager;
08

09
import com.dooya.util.CoverFlow;
10

11
import com.dooya.util.ImageAdapter;
12

13
 
14

15
public class HomeActivity extends Activity {
16

17
    public void onCreate(Bundle savedInstanceState) {
18

19
        super.onCreate(savedInstanceState);
20

21
        CoverFlow cf = new CoverFlow(this);
22

23
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
24

25
                WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
26

27
        cf.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.bg));//背景
28

29
        cf.setAdapter(new ImageAdapter(this));
30

31
        ImageAdapter imageAdapter = new ImageAdapter(this);
32

33
        cf.setAdapter(imageAdapter);
34

35
        cf.setSelection(2, true);
36

37
        cf.setAnimationDuration(1000);
38

39
        setContentView(cf);
40

41
    }
42

43
}
  • 大小: 22.8 KB
分享到:
评论

相关推荐

    android开发资料大全

    新版Android开发教程及笔记-完整版 《Android中文教程》中文版 《android基础教程合集》 Android实例教程 会员贡献索引贴 实用Android开发工具和资源精选 APK权限大全 - Android必懂知识 最无私的Android资料...

    android开发教程4.0.

    1.3 Android开发环境的搭建 1.4 第一个Android程序——HelloAndroid 1.5 Android应用程序的调试 1.6 Android应用程序的项目结构 1.7 Android的系统架构 1.8 本章小结 第2章 Android简单控件的开发及应用 第3章 ...

    android开发教程

    1.3 Android开发环境的搭建 1.4 第一个Android程序——HelloAndroid 1.5 Android应用程序的调试 1.6 Android应用程序的项目结构 1.7 Android的系统架构 1.8 本章小结 第2章 Android简单控件的开发及应用 第3章 ...

    Android编程典型实例与项目开发 吴亚峰 杜化美 苏亚光 PDF扫描版

    《android编程典型实例与项目开发 含cd光盘1张 》主要以android平台下应用软件开发的基础知识为主题 并结合真实的案例为读者详细介绍android平台下的商务软件 3d游戏程序及2d游戏程序的开发流程 《android编程典型...

    开源项目Android-炫酷的3D音乐播放器-各种特效OpenGL.zip

    项目名称:Android_炫酷的3D音乐播放器_各种特效OpenGL 内容概要: 本项目是一个专为Android平台设计的3D音乐播放器,它利用OpenGL技术实现了丰富的视觉效果和动画特效。播放器不仅支持标准的音乐文件格式,还提供了...

    计算机毕业设计 - Android项目之-页面特效集合(附源码),保证可靠运行,计算机毕业生可参考,免费资源下载

    本项目旨在开发一个集合了多种页面特效的Android应用,为用户提供丰富多彩的界面交互体验。通过集成多种动画效果和过渡方式,该应用能够展示Android平台在界面设计上的强大功能和创新性。 在功能实现上,项目首先...

    Android(经典实例).

    1.3 Android开发环境的搭建 1.4 第一个Android程序——HelloAndroid 1.5 Android应用程序的调试 1.6 Android应用程序的项目结构 1.7 Android的系统架构 1.8 本章小结 第2章 Android简单控件的开发及应用 第3章 ...

    Android项目[开源项目]_炫酷的3D音乐播放器_各种特效OpenGL.rar

    **Android项目:炫酷3D音乐播放器(含OpenGL特效)** 本项目是一个独具特色的Android音乐播放器应用,它结合了先进的3D技术和OpenGL特效,为用户带来前所未有的视听盛宴。播放器界面美观大方,充满科技感,不仅支持...

    android开发demo集合

    简明、完整、全面的安卓开发demo集合,包含如下示例 1、LinearLayout Button、RadioGroup、 CheckBox 2、TableLayout 3、FrameLayout 霓虹灯效果 4、RelativeLayout 梅花效果 5、自定义view跟着触点走的小球 6、 ...

    《Android编程经典200例》PDF

    本书通过200个经典实例全面、系统地...本书内容由浅入深,从Android平台下开发应用软件的基础知识到开发大型商务软件、3D游戏以及2D游戏,开发思路清晰明了、语言简明扼要,非常适合初学者和Android开发人员阅读参考

    jQuery+css3实现的可爱3D动画展示效果

    jQuery+css3实现的可爱的3D动画展示效果,界面上的卡通小动物非常可爱,点击有3D效果的文字出现,整体流畅、精美。 建议开发童鞋使用统一开发环境UDE来进行查看、调试、开发~~~统一开发环境是一款HTML5跨平台一站式...

    Android编程经典200例.pdf(中文高清版)

    Android编程经典200例通过200个经典...本书内容由浅入深,从Android平台下开发应用软件的基础知识到开发大型商务软件、3D游戏以及2D游戏,开发思路清晰明了、语言简明扼要,非常适合初学者和Android开发人员阅读参考。

    [开源项目]Android_炫酷的3D音乐播放器_各种特效OpenGL.zip

    例如,我们使用了Android Studio作为开发工具,它提供了一系列的功能和工具,如代码编辑器、调试器和模拟器,使得开发人员可以快速开发和测试安卓应用。我们还使用了Java作为主要的编程语言,它是安卓应用开发的主流...

    楚无咎_Android编程经典200例_光盘源代码

    本书通过200个经典实例全面、系统地介绍了Android平台下的软件开发... 手机网络应用、手机的Google服务功能、手机多媒体服务功能、Android手机的3D世界、手机特效开发、  休闲游戏--Q版疯狂大炮、娱乐游戏--3D迷宫。

    Android高薪之路:Android程序员面试宝典 李宁

    1 3 1 搭建Android开发环境 1 3 2 Android开发环境的使用 第2章 布局 2 1 Android中的布局 2 2 布局使用技巧 2 2 1 FrameLayout布局 2 2 2 LinearLayout布局 2 2 3 RelativeLayout布局 2 2 4 TableLayout布局 2 2 5 ...

    android编程经典200例

    手机网络应用、手机的Goog l e 服务功能、手机多媒体服务功能、An droid 手机的3D 世界、手机特效开发、 休闲游戏Q 版疯狂大炮、娱乐游戏3D 迷宫。 本书内容由浅入深,从An droid 平台下开发应用软件的基础知识到...

    疯狂Android讲义源码

     1.2 搭建Android开发环境 5  1.2.1 下载和安装Android SDK 5  1.2.2 安装Eclipse和ADT插件 7  1.3 Android常用开发工具的用法 10  1.3.1 创建、删除和浏览AVD 10  1.3.2 使用Android模拟器  (Emulator) 14...

    android自定义布局中的平滑移动

    在android应用程序的开发过程中,相信我们很多人都想把应用的交互做的比较绚丽,比如让界面切换平滑的滚动,还有热度灰常高的伪3D等界面效果,通常情况下,系统提供的应用在特效这方面只能为我们提供简单的动画接口...

Global site tag (gtag.js) - Google Analytics