本文档将介绍在android上如何实现一个倒影效果的Gallery。
为了达到上图所示的效果,
首先,是需要有一个自定义的gallery,实现了对Gallery的继承,通过重写getChildStaticTransformation方法来控制,每个子view有不同的缩放比例,形成阶梯状的展示。这个gallery是在坤庭的代码基础上实现的,我这里就不再重复介绍。
接下来,gallery中的每个view,都是一个自定义的MirrorView,由它来实现了画原图及画倒影。新的算法解决了性能问题,下面就重点说一下这部分内容:
镜像特效最近还蛮流行的,尤其在HTC 的Sense 介面上,常常都可以见到。大家可以看到,加了个镜像特效后,那感觉就很立体,感觉上好像是这些图片摆立在一个玻璃桌面上。
在Android 上要帮图片加上镜像特效,会不会很麻烦?一点也不麻烦,只要几行代码,就可以搞定。
因此,在开始看答案之前,我会建议你要先有Photoshop 的使用经验。想想,如果用Photoshop 要帮图片加上镜像特效,要如何做?我想一般不外乎是先复制个图片,并将其垂直翻转,接着再对这翻转的图片,加个由灰到黑的渐层mask 即可。
好了,让我们来看一下答案。底下就是帮图片加上镜像特效的程式范例。
- public class MirrorView extends View {
-
- Paint m_paint;
-
-
int m_nShadowH;
-
- Drawable m_dw;
-
- Bitmap m_bitmap;
-
- Matrix mMatrix;
-
-
int shadowHeight;
-
-
public MirrorView(Context context, Bitmap bitmap) {
-
-
super (context);
-
- m_bitmap = bitmap;
-
- _Init();
-
- }
-
-
private void _Init() {
-
-
-
-
m_dw = new BitmapDrawable(m_bitmap);
-
-
m_dw.setBounds(0,0,m_dw.getIntrinsicWidth(),m_dw.getIntrinsicHeight());
-
-
m_nShadowH = m_dw.getIntrinsicHeight()/1;
-
-
m_paint = new Paint(Paint.ANTI_ALIAS_FLAG );
-
-
LinearGradient lg = new LinearGradient(0, 0, 0, m_nShadowH, 0xB0FFFFFF, 0×00000000, Shader.TileMode.CLAMP );
-
- m_paint.setShader(lg);
-
-
m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY ));
-
-
mMatrix = new Matrix();
-
- }
-
-
@Override
-
-
public void onDraw(Canvas canvas) {
-
-
super .onDraw(canvas);
-
-
int nX = 0;
-
-
int nY = 0;
-
- _DrawNormalImg(canvas, nX, nY);
-
- _DrawMirror(canvas, nX, nY);
-
- }
-
-
private void _DrawNormalImg(Canvas canvas, int nX, int nY) {
-
- canvas.save(Canvas.MATRIX_SAVE_FLAG );
-
- canvas.translate(nX, nY);
-
- m_dw.draw(canvas);
-
- canvas.restore();
-
- }
-
-
private void _DrawMirror(Canvas canvas, int nX, int nY) {
-
-
int nW = m_dw.getIntrinsicWidth();
-
-
int nH = m_dw.getIntrinsicHeight();
-
-
shadowHeight=nH/2;
-
-
float [] src={0, nH, nW, nH, nW,nH – m_nShadowH, 0, nH – m_nShadowH};
-
-
float [] dst={ 0, nH, nW, nH,nW, shadowHeight, 0, shadowHeight };
-
- canvas.save();
-
-
mMatrix.setPolyToPoly(src, 0, dst, 0, src.length >> 1);
-
- canvas.concat(mMatrix);
-
-
-
- canvas.save(Canvas.MATRIX_SAVE_FLAG );
-
-
canvas.scale(1.0f, -1.0f);
-
-
canvas.translate(nX, -(nY + nH * 2));
-
-
canvas.clipRect(0, nH, nW, nH – m_nShadowH);
-
- m_dw.draw(canvas);
-
- canvas.restore();
-
-
-
- canvas.save();
-
- canvas.translate(nX, nY + nH);
-
-
canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);
-
- canvas.restore();
-
- canvas.restore();
-
- }
-
- }
public class MirrorView extends View {
Paint m_paint;
int m_nShadowH;
Drawable m_dw;
Bitmap m_bitmap;
Matrix mMatrix;
int shadowHeight;
public MirrorView(Context context, Bitmap bitmap) {
super (context);
m_bitmap = bitmap;
_Init();
}
private void _Init() {
//m_dw = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.icon));
m_dw = new BitmapDrawable(m_bitmap);
m_dw.setBounds(0,0,m_dw.getIntrinsicWidth(),m_dw.getIntrinsicHeight());
m_nShadowH = m_dw.getIntrinsicHeight()/1;
m_paint = new Paint(Paint.ANTI_ALIAS_FLAG );
LinearGradient lg = new LinearGradient(0, 0, 0, m_nShadowH, 0xB0FFFFFF, 0×00000000, Shader.TileMode.CLAMP );
m_paint.setShader(lg);
m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY ));
mMatrix = new Matrix();
}
@Override
public void onDraw(Canvas canvas) {
super .onDraw(canvas);
int nX = 0;
int nY = 0;
_DrawNormalImg(canvas, nX, nY);
_DrawMirror(canvas, nX, nY);
}
private void _DrawNormalImg(Canvas canvas, int nX, int nY) {
canvas.save(Canvas.MATRIX_SAVE_FLAG );
canvas.translate(nX, nY);
m_dw.draw(canvas);
canvas.restore();
}
private void _DrawMirror(Canvas canvas, int nX, int nY) {
int nW = m_dw.getIntrinsicWidth();
int nH = m_dw.getIntrinsicHeight();
shadowHeight=nH/2;
float [] src={0, nH, nW, nH, nW,nH – m_nShadowH, 0, nH – m_nShadowH};
float [] dst={ 0, nH, nW, nH,nW, shadowHeight, 0, shadowHeight };
canvas.save();
mMatrix.setPolyToPoly(src, 0, dst, 0, src.length >> 1);
canvas.concat(mMatrix);
//draw mirror image
canvas.save(Canvas.MATRIX_SAVE_FLAG );
canvas.scale(1.0f, -1.0f);
canvas.translate(nX, -(nY + nH * 2));
canvas.clipRect(0, nH, nW, nH – m_nShadowH);
m_dw.draw(canvas);
canvas.restore();
//draw mask
canvas.save();
canvas.translate(nX, nY + nH);
canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);
canvas.restore();
canvas.restore();
}
}
_DrawMirror() 方法是关键。用Photoshop 要如何做出镜像特效?第一步是先画出垂直翻转的图片。
Android 绘图座标体系预设的原点在左上角,X 轴往右是越来越大的正值,而Y 轴往下,则是越来越大的正值。要画出垂直翻转的图片,其实也就是要垂直翻转整个绘图座标体系。在 Android 中,要如何做?答案就是 canvas.scale(1.0f, -1.0f)。很简单吧,没想到给scale() 函式一个负值,就可以翻转相对应的轴。
在Photoshop 中,做镜像特效的第二步是要对这翻转的图片,加个由灰到黑的渐层mask。
在Android 中,要画渐层色,那就一定得用LinearGradient 这个类别。至于要对背景图加上个mask,就请参考一下Paint 的setXfermode() 函式。 _Init() 这个函式,就是负责生成一个由灰到黑渐层mask 的m_paint 物件。
这个控件我测试过,200张图片加入adapter,在大数据量情况下性能也没有问题。
分享到:
相关推荐
### Android 图片镜像倒影特效详解 #### 一、概述 在移动应用开发中,为了提升用户体验,开发者经常会加入一些视觉特效。其中,“图片镜像倒影特效”是一种非常受欢迎的效果,它可以让图片底部产生一种对称的镜像...
在本资源中,我们主要探讨的是...以上就是“纯CSS3实现带镜像倒影的机器人跳舞动画特效源码”所涉及的主要技术点。通过学习和理解这些知识点,开发者可以掌握如何利用CSS3创建更生动、交互性更强的网页元素和动画效果。
在Android开发中,创建独特的视觉效果能够提升用户体验,其中“镜面倒影特效”是一个吸引用户的有趣设计。本文将深入探讨如何在Android应用中实现这一功能,主要关注于相册应用中的镜像倒影效果。 首先,我们需要...
在Adobe Illustrator(AI)中,快速制作镜像倒影效果是一项常见的设计技巧,尤其在网络2.0风格的设计中,反光和镜像效果是提升视觉吸引力的重要元素。本教程主要介绍如何利用AI的不透明蒙版功能来创建镜像倒影效果。...
在VB(Visual Basic)编程中,创建窗体实时水波倒影特效是一种吸引用户注意力并提升应用程序用户体验的技术。本文将详细解析"有趣的窗体实时水波倒影特效示例"中的核心知识点,帮助你理解如何在VB应用中实现这一效果...
在JavaScript的世界里,实现3D炫酷实时时钟翻转动画带倒影特效是一项充满挑战且有趣的技术实践。这个特效不仅能够吸引用户注意力,还能展示开发者对于JavaScript高级特性和CSS3的强大掌握。以下是对这个特效的详细...
倒影效果是通过镜像图像的一部分并调整其透明度来实现的。在Android中,这可能涉及到Bitmap的复制、旋转、翻转和Alpha通道操作。自定义的动画倒影效果可能使用了Animation或者ObjectAnimator来平滑地改变倒影的透明...
至于太阳的倒影,可以通过在水面上创建一个虚拟的反射平面,然后对太阳进行镜像投影来实现。 此外,js文件很可能是这个项目的主要代码源,包含了创建、更新和渲染3D场景的逻辑。它可能会包含定义物体、设置光源、...
这个源码可能包含了一套完整的 Java 解决方案,用于模拟 Photoshop 中的水面倒影特效。在 Photoshop 中,水面倒影是通过图像处理技术来模拟水面上物体的镜像效果,而使用 Java 来实现这一效果则需要理解图像处理的...
在Android开发中,"Gallery倒影效果+滑动翻转"是一种常见的用户界面(UI)设计,用于创建具有视觉吸引力的图像浏览体验。Gallery组件在早期版本的Android API中被广泛使用,它允许用户通过左右滑动来浏览一系列的...
倒影效果通常是通过创建原始图像的镜像副本,然后调整副本的位置和透明度来实现的。这个过程可以通过Bitmap类的API来完成,例如`createBitmap()`方法用于创建新的位图,然后使用`Canvas`来绘制原图的倒影。 接下来...
在程序开发中,实现特效和倒影效果是增强用户界面(UI)吸引力和用户体验(UX)的重要手段。倒影效果通常被用于图形设计和网页设计,它可以为视觉元素增添一种深度感和动态感,使整体设计更加生动。下面将详细讨论...
本话题聚焦于一个特别吸引人的CSS3特性——图片镜像效果,它能实现图片的翻转与变换,创造出极具视觉冲击力的网页特效。 "超酷的CSS3图片镜像效果网页特效"是一种利用CSS3的transform属性来创建图片的镜像效果,...
倒影部分则需要将图像镜像翻转并在下方绘制。首先,我们可以创建一个新的Canvas元素,大小与原Canvas相同但位置在其下方。然后,对原始图片进行垂直翻转,并在新Canvas上绘制。为了增加真实感,我们还可以将倒影的...
"倒影效果"是指在图像下方生成一个镜像,使得图像看起来像是反射在平面上,增加了视觉吸引力。这种效果在UI设计中常用于创造动态和立体感,尤其是在展示产品或图片时,能提升用户体验。 实现倒影效果通常有两种方法...
6. **实现技术**:在实际开发中,这个“很炫的gallery”可能基于自定义视图或自定义适配器实现,以便添加和控制这些特效。对于Android开发者,可能需要扩展`Gallery`类或使用`RecyclerView`配合自定义`LayoutManager...
8. **用户交互**:为了让用户能够实时预览和调整特效,源码可能包含了触摸事件的处理逻辑,允许用户通过手势操作(如滑动、捏合)来改变图片的镜像、倒影、倾斜和旋转效果。 9. **资源管理**:在Android应用中,...
倒影制作工具(Inverted)是一款只需用户设定好图像与倒影的间距,倒影镜像百分比,倒影透明度后该软件即可自动生成图像倒影,还可设置倒影波浪特效。只需简单几步操作就可以为自己的图片添加倒影效果,完全傻瓜式操作...
标题中的“非常不错的倒影的3d gallery效果”指的是一个具有3D视觉体验且包含倒影特效的图库展示程序。这种3D Gallery通常是一种交互式的图像展示工具,它允许用户以立体、旋转的方式浏览图片,同时加入了倒影元素,...