VC++ 如何实现IOS的ios coverfloww,不要用到 DirectX跟OPenGL,最好给源码。谢谢

OpenGL 简介 - 技术翻译 - 开源中国社区
OpenGL 简介
【已翻译100%】
英文原文:
推荐于 4年前 (共 8 段, 翻译完成于 08-18)
参与翻译&(3人)&: ,
OpenGL是一个底层图形库规范。它为程序员提供了一个小的几何图元(点、线、多边形、图片和位图)库和一个支持2D/3D几何对象绘图命令库,通过所提供的图元和命令来控制对象的呈现(绘图)。
由于OpenGL的绘图命令仅限于画一些简单的几何图元(如点、线和多边形),所以OpenGL实用工具包(GLUT)应运而生,它能够帮助绘画出更复杂的三维对象(比如球体、圆环甚至茶壶)。如果你要构建需要利用到OpenGL全部特性的应用的话,GLUT未必适合,但是对刚学习OpenGL的人来说GLUT就非常有用。
&翻译得不错哦!
GLUT是为满足windows系统下OpenGL程序独立编程接口的需求而设计的,接口被设计的非常简单而又实用。从OpenGL中移除windows系统的操作是一个非常英明的决定,因为这意味着OpenGL图形系统能够被应用于更广泛的系统中(包括功能强大但昂贵的图形工作站以及需要大量图形运算的视频游戏、互动电视机机顶盒和个人电脑)。
GLUT简化了用OpenGL进行渲染的程序的实现。GLUT应用编程接口(API)只需要调用很少的接口就可以用OpenGL来渲染图形场景,并且GLUT接口所需的参数也相对较少。
&翻译得不错哦!
大多数OpenGL实现都有着类似的操作顺序,这一系列的操作过程叫做OpenGL渲染管线。尽管OpenGL并不严格要求需要按照渲染管线这一顺序来实现,但是这样做可以为预测OpenGL下一步将要做什么提供可靠的指引。几何数据(点、线、多边形)将会沿着一条依次通过求值器、顶点操作和装配阶段的路径进行传递,而像素数据(像素,图形,位图)将会沿着另一条路径传递,在最终像素写入帧缓冲区前,像素数据和几何数据都会经历相同的最后一步——栅格化处理。
&翻译得不错哦!
Display Lists: 所有数据,无论是用来描述几何体还是像素的,都可以保存在一个display list中来在当下或将来使用(用以替代display list的用法是在需要时立即处理数据——称为立即模式)当一个display list被触发时,保存的数据就像立即模式一样被发送至显示器。
Evaluators: 所有几何原语最终都是由顶点描述的,但evaluator提供了一种用控制点表示面的方法。这种方法是拟合多项式,可以通过控制点提供面法线、颜色、和空间纹理坐标。
&翻译得不错哦!
基于顶点和图元的装配:对于顶点的数据,下一步就是将它们转换成图元。某些类型的顶点数据被转换为4x4的浮点型矩阵。空间坐标从三维世界中的一个位置被投影到您显示屏上的一个位置。在某些情形中,这一步之后会进行透视除法,利用它能够使远处的几何物体看起来比近处的物体小。然后,我们再对数据进行视口和景深的操作。至此,我们得到的结果是几何图元,这些图元与相关的颜色值和景深值,以及光栅化步骤的指标等一同进行转换。
像素操作:在几何数据通过OpenGL渲染管线的一条路径的同时,像素数据则通过了另外一条路径。系统内存中的一个数组中的像素首先被解压,从若干格式中的一种转换成拥有恰当数目的分量的那种。然后,我们对数据进行尺度放缩,偏移,再根据像素映射处理,随后这些结果被发送至光栅化步骤。
&翻译得不错哦!
光栅化:光栅化是指将几何数据和像素数据都转换成片段的过程。各方形片段对应帧缓存中的一个像素。当顶点被连接起来形成直线,或者计算填充的多边形的内部像素时,直线的宽度,点的大小,着色模型,以及用以支持抗锯齿的覆盖计算等都被考虑在内。颜色值和深度值被赋予各方形片段。然后,处理后的片段被存入合适的缓存中,在那里,它最终被转化成一个像素,从而完成了它的最终使命。
OpenGL提供了一组强大但原始的渲染命令,而且所有的高层绘制都必须通过这些命令来完成。有若干库文件能够简化您的编程任务,包括:
OpenGL Utility Library (GLU),它包含若干调用底层OpenGL命令的函数,这些函数能够进行诸如为某一特定观察方向和透视以及渲染表面设定矩阵的任务。
OpenGL Utility Toolkit (GLUT),它是一个视窗-系统分离的工具箱,由Mark Kilgard编写,用于隐藏不同视窗的API所带来的复杂性。
&翻译得不错哦!
对于所有OpenGL应用程序,你都需要在所有文件中包含gl.h。几乎所有OpenGL应用程序使用GLU,即上文提到的OpenGL实用库(OpenGL Utility Library),它也需要包含gl.h才能使用。所以几乎所有OpenGL源文件这样开头:
#include &GL/gl.h&
#include &GL/glu.h&
如果你用OpenGL
实用工具集(OpenGL Utility Toolkit,即GLUT)来管理窗体事务,你需要包含:
#include &GL/glut.h& 记住glut.h保证会正确包含gl.h和glut.h,所以把三个文件全包含是多此一举。为使你的GLUT程序通用性更佳,包含glut.h而
不要明确包含gl.h或glu.h。
&翻译得不错哦!
设置编译器
在Windows上使用MS Visual Studio C++
如果你已经安装了MS Visual Studio C++ 5.0或以上版本,那么下列文件中的大多数就已经在您的机器上了。下列的GLUT文件需要复制到指定的路径下。
要开始安装:
右键单击各链接
选择另存为...
接受默认名称(只需点击保存即可)
库文件(放置到Visual C++下的lib\子路径中)
包含文件(放置到Visual C++下的include\GL\子路径中)
动态链接库文件(放置到\Windows\System路径中)
编译OpenGL/GLUT程序
创建一个新项目:
从菜单中点选文件 | 新建
点选项目选项卡
点选Win32控制台应用程序 Console Application
输入您的项目名称
为链接器指定要用到的库文件:
从菜单中点选项目 | 设置
在对象/库模块中:输入"opengl32.lib glu32.lib glut32.lib"
向项目中添加或创建文件:
从文件菜单中点选项目 | 向项目添加 | 文件
添加需要的程序文件
构建并运行
Silicon Graphics Workstation
# insert the name of your source file here (omit the .c)
TARGET = progname
LIBS = -lglut -lGLU -lGL -lXmu -lXext -lXi -lX11 -lm
CC = /usr/gnu/bin/gcc
default: $(TARGET)
all: default
$(CC) -c $&
$(TARGET): $$@.o
$(CC) $@.o -Wall $(LIBS) -o $@
-rm -f *.o $(TARGET)
&翻译得不错哦!
我们的翻译工作遵照 ,如果我们的工作有侵犯到您的权益,请及时联系我们
MS走下坡了,DX无处借力
除windows平台,处处opengl, including ios, android, blackberry, html5, etc...
除windows平台,处处opengl, including ios, android, blackberry, html5, etc...我说的是图形API标准,OpenGL新特性都是copy DirectX。
除windows平台,处处opengl, including ios, android, blackberry, html5, etc...你是说到处找数据包吗
除windows平台,处处opengl, including ios, android, blackberry, html5, etc...我说的是图形API标准,OpenGL新特性都是copy DirectX。除了windows,你用什么?我一般用ubuntu工作,但是很多事情不得不在win下完成。天天黑win,用着盗版的好歹尊重一下。swpiwqw1449551 user info -
About swpiwqw []&[]&[]&&[]
Files uploaded:
&1.& ,Excel tips Collection- 163 kinds of skills, more comprehensive,53KB,downloads 2&2.& ,Excel examples to explain the function Daquan [], the application of the formula, very comprehensive,313KB,downloads 4
Keywords searched:
& & & & & & & & & & & & & & & & & & & & & & & & & & & &
Favorates:
&Friend:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:&Download:下次自动登录
现在的位置:
& 综合 & 正文
Android的OpenGL FlowCover
有两种,一种是直接继承Gallery的,通过override Gallery的getChildStaticTransformation方法实现,这个网上有,速度还不错,最开始采用的这个方案。
后来有时间,又觉得opengl可能会更快一些,所以照着iOS上很著名的FlowCover写了一个。两个的都贴出来吧,仅供参考。
继承Gallery,重载getChildStaticTransformation函数,通过Camera来模拟变换,加了一些平移和旋转。
这个我当时碰到的主要问题在于怎么才能让距离比较合适,因为需要左右两边的几个最后能够叠在一起,所以需要一个公式来进行平移,这个公式应该满足f(max) = max, f(0) = 0, f(x) & x,其中x是距中心的距离,max是最后一个需要平移的函数,这儿我选择了左右的第二个,最后使用的是和开方有关的函数。
因为继承的是Gallery,所以只能通过spacing来控制需要显示多少个内容,不太方便,这个也是我后来写了opengl的原因。
import android.content.C
import android.graphics.C
import android.graphics.M
import android.view.MotionE
import android.view.V
import android.view.animation.T
import android.widget.G
import android.widget.ImageV
public class CoverFlow extends Gallery {
private static final String TAG = "CoverFlow";
private static float DELTAX = 0;
private Camera mCamera = new Camera();
private int mMaxRotationAngle = 60;
private int mMaxZoom = -120;
private int mCoveflowC
private float mSpeed = 2;
public CoverFlow(Context context, float imagesize, float spacing) {
super(context);
DELTAX = (float) Math.sqrt(imagesize - spacing);
this.setStaticTransformationsEnabled(true);
public int getMaxRotationAngle() {
return mMaxRotationA
public void setMaxRotationAngle(int maxRotationAngle) {
mMaxRotationAngle = maxRotationA
public int getMaxZoom() {
return mMaxZ
public void setMaxZoom(int maxZoom) {
mMaxZoom = maxZ
private int getCenterOfCoverflow() {
return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2 + getPaddingLeft();
private static int getCenterOfView(View view) {
return view.getLeft() + view.getWidth() / 2;
protected int getChildDrawingOrder(int childCount, int i) {
int select = getSelectedItemPosition() - getFirstVisiblePosition();
if (i & select) {
} else if (i == select) {
return childCount - 1;
return select + (childCount - i - 1);
protected boolean getChildStaticTransformation(View child, Transformation t) {
final int childCenter = getCenterOfView(child);
final int childWidth = child.getWidth() ;
int rotationAngle = 0;
t.clear();
t.setTransformationType(Transformation.TYPE_MATRIX);
if (childCenter == mCoveflowCenter) {
transformImageBitmap((ImageView) child, t, 0, 0);
android.util.Log.i(TAG, "x: " + (mCoveflowCenter - childCenter));
rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) *
mMaxRotationAngle);
if (Math.abs(rotationAngle) & mMaxRotationAngle) {
rotationAngle = (rotationAngle & 0) ? -mMaxRotationAngle : mMaxRotationA
transformImageBitmap((ImageView) child, t, rotationAngle, mCoveflowCenter - childCenter);
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, int delta) {
mCamera.save();
final Matrix imageMatrix = t.getMatrix();;
final int imageHeight = child.getHeight();
final int imageWidth = child.getWidth();
final int rotation = Math.abs(rotationAngle);
mCamera.translate(0.0f, 0.0f, 100.0f);
if ( rotation & mMaxRotationAngle ) {
float zoomAmount = (float) (mMaxZoom +
(rotation * 1.5));
mCamera.translate(0.0f, 0.0f, zoomAmount);
mCamera.rotateY(rotationAngle);
float absx = Math.abs(delta);
float x = (float) (DELTAX * Math.sqrt(absx) - absx);
if (delta & 0) {
mCamera.translate(-x, 0, 0);
} else if (delta & 0){
mCamera.translate(x, 0, 0);
mCamera.getMatrix(imageMatrix);
imageMatrix.preTranslate(-(imageWidth/2), -(imageHeight/2));
imageMatrix.postTranslate((imageWidth/2), (imageHeight/2));
mCamera.restore();
public void setSpeed(float speed) {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return super.onFling(e1, e2, velocityX / mSpeed, velocityY);
接下来是使用的案例
private static final float IMAGE_SIZE_MDPI = 170.6667f;
private static final float GALLERY_SPACING_MDPI = -23.333f;
IMAGE_SIZE = IMAGE_SIZE_MDPI * dpi / 160;
GALLERY_SPACING = GALLERY_SPACING_MDPI * dpi / 160;
mGalleryLandscape = new CoverFlow(this, IMAGE_SIZE, GALLERY_SPACING);
mGalleryLandscape.setCallbackDuringFling(false);
mGalleryLandscape.setAdapter(new GalleryLandscapeAdapter(this, mLocation));
mGalleryLandscape.setSpacing((int) GALLERY_SPACING);
因为需要放缩一下图片,所以Adpater的getView函数是这个样子的:
public View getView(int position, View convertView, ViewGroup parent) {
ImageView view = (ImageView) convertV
if (view == null) {
view = new ImageView(parent.getContext());
Bitmap bitmap = BitmapFactory.decodeFile(mLocation.get(position).getLocalImageUrl().getAbsolutePath());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
if (width & IMAGE_SIZE || height & IMAGE_SIZE) {
float scale = 1.0f;
if (width & height) {
scale = ((float) IMAGE_SIZE) /
scale = ((float) IMAGE_SIZE) /
width = (int) (width * scale);
height = (int) (height * scale);
android.util.Log.i(TAG, IMAGE_SIZE + " " + width + " " + height);
bm = Bitmap.createScaledBitmap(bitmap, width, height, false);
bitmap.recycle();
view.setImageBitmap(bm);
第二种OpenGL
这个的基本思想是抄iOS的,但是进行了一些更改,例如利用velocitytracker进行速度的计算等。
package com.locatify.fengji.
import java.nio.ByteB
import java.nio.ByteO
import java.nio.FloatB
import javax.microedition.khronos.egl.EGLC
import javax.microedition.khronos.opengles.GL10;
import android.content.C
import android.graphics.B
import android.graphics.BitmapF
import android.graphics.C
import android.graphics.P
import android.graphics.PixelF
import android.graphics.R
import android.graphics.RectF;
import android.opengl.GLSurfaceV
import android.opengl.GLU;
import android.opengl.GLU
import android.view.MotionE
import android.view.VelocityT
import android.view.animation.AnimationU
public class CoverFlowOpenGL extends GLSurfaceView implements GLSurfaceView.Renderer {
private static final String TAG = "AnotherCoverFlow";
private static final int TOUCH_MINIMUM_MOVE = 5;
private static final int IMAGE_SIZE = 256;
private static final int MAX_TILES = 48;
private static final int VISIBLE_TILES = 3;
private static final float SCALE = 0.7f;
private static final float SPREAD_IMAGE = 0.14f;
private static final float FLANK_SPREAD = 0.4f;
private static final float FRICTION = 10.0f;
private static final float MAX_SPEED = 6.0f;
private static final float[] GVertices = new float[]{
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 0.0f,
1.0f, 0.0f,
private static final float[] GTextures = new float[]{
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
private GL10 mGLC
private FloatBuffer mVerticesB
private FloatBuffer mTexturesB
private float[] mM
private int mBgT
private FloatBuffer mBgVerticesB
private FloatBuffer mBgTexturesB
private Bitmap mBgB
private boolean mInitB
private float mO
private RectF mTouchR
private int mW
private boolean mTouchM
private float mTouchStartP
private float mTouchStartX;
private float mTouchStartY;
private float mStartO
private long mStartT
private float mStartS
private float mD
private Runnable mAnimationR
private VelocityTracker mV
private boolean mStopBackgroundT
private CoverFlowListener mL
private DataCache&Integer, CoverFlowRecord& mC
public CoverFlowOpenGL(Context context) {
super(context);
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
setRenderer(this);
setRenderMode(RENDERMODE_WHEN_DIRTY);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
mCache = new DataCache&Integer, CoverFlowRecord&(MAX_TILES);
mOffset = 0;
mInitBackground = false;
public void setCoverFlowListener(CoverFlowListener listener) {
mListener =
private float checkValid(float off) {
int max = mListener.getCount(this) - 1;
if (off & 0)
else if (off & max)
public void setSelection(int position) {
endAnimation();
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch(action) {
case MotionEvent.ACTION_DOWN:
touchBegan(event);
return true;
case MotionEvent.ACTION_MOVE:
touchMoved(event);
return true;
case MotionEvent.ACTION_UP:
touchEnded(event);
return true;
return false;
private void touchBegan(MotionEvent event) {
endAnimation();
float x = event.getX();
mTouchStartX =
mTouchStartY = event.getY();
mStartTime = System.currentTimeMillis();
mStartOffset = mO
mTouchMoved = false;
mTouchStartPos = (x / mWidth) * 10 - 5;
mTouchStartPos /= 2;
mVelocity = VelocityTracker.obtain();
mVelocity.addMovement(event);
private void touchMoved(MotionEvent event) {
float pos = (event.getX() / mWidth) * 10 - 5;
if (!mTouchMoved) {
float dx = Math.abs(event.getX() - mTouchStartX);
float dy = Math.abs(event.getY() - mTouchStartY);
if (dx & TOUCH_MINIMUM_MOVE && dy & TOUCH_MINIMUM_MOVE)
mTouchMoved = true;
mOffset = checkValid(mStartOffset + mTouchStartPos - pos);
requestRender();
mVelocity.addMovement(event);
private void touchEnded(MotionEvent event) {
float pos = (event.getX() / mWidth) * 10 - 5;
if (mTouchMoved) {
mStartOffset += mTouchStartPos -
mStartOffset = checkValid(mStartOffset);
mOffset = mStartO
mVelocity.addMovement(event);
puteCurrentVelocity(1000);
double speed = mVelocity.getXVelocity();
speed = (speed / mWidth) * 10;
android.util.Log.i(TAG, "SPEED: " + speed);
if (speed & MAX_SPEED)
speed = MAX_SPEED;
else if (speed & -MAX_SPEED)
speed = -MAX_SPEED;
startAnimation(-speed);
if (mTouchRect.contains(event.getX(), event.getY())) {
mListener.topTileClicked(this, (int) (mOffset + 0.01));
private void startAnimation(double speed) {
if (mAnimationRunnable != null)
double delta = speed * speed / (FRICTION * 2);
if (speed & 0)
double nearest = mStartOffset +
nearest = Math.floor(nearest + 0.5);
nearest = checkValid((float) nearest);
mStartSpeed = (float) Math.sqrt(Math.abs(nearest - mStartOffset) * FRICTION * 2);
if (nearest & mStartOffset)
mStartSpeed = -mStartS
mDuration = Math.abs(mStartSpeed / FRICTION);
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mAnimationRunnable = new Runnable() {
public void run() {
driveAnimation();
post(mAnimationRunnable);
private void driveAnimation() {
float elapsed = (AnimationUtils.currentAnimationTimeMillis() - mStartTime) / 1000.0f;
if (elapsed &= mDuration)
endAnimation();
updateAnimationAtElapsed(elapsed);
post(mAnimationRunnable);
private void endAnimation() {
if (mAnimationRunnable != null) {
mOffset = (float
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 ios coverflow 的文章

 

随机推荐