package com.alex.Sample_CoverFlow;
import static com.alex.Sample_CoverFlow.Constant.ratio;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.GLUtils;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.view.MotionEvent;
import com.alex.CoverFlow.R;
class MySurfaceView extends GLSurfaceView
{
final int TexturesCount = Constant.MAX_TEXTURES_COUNT;
private SceneRenderer mRenderer;//场景渲染器
int[] textureIds =new int[TexturesCount]; //系统分配的纹理id
private HandlerThread ht = new HandlerThread("MyGLSurfaceView");
private Handler handler;
private float ox;
private int next = 1;
private int front = 2;
private int slideIndex = 0;/*旋转次数索引*/
private boolean leftToRightDirection = true;/*向右为正*/
public MySurfaceView(Context context) {
super(context);
//设置背景是否透明
/*
this.setZOrderOnTop(true);
this.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
*/
ht.start();
this.setEGLContextClientVersion(2); //设置使用OPENGL ES2.0
mRenderer = new SceneRenderer(); //创建场景渲染器
setRenderer(mRenderer); //设置渲染器
//setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
setRenderMode(RENDERMODE_WHEN_DIRTY);
handler = new Handler(ht.getLooper()){
public void handleMessage(Message msg){
if(msg.what == next){
mRenderer.next(false);
}else{
mRenderer.next(true);
}
}
};
//计算GLSurfaceView的宽高比
Constant.pic_ratio = (float)186/275;
}
//触摸事件回调方法
@Override
public boolean onTouchEvent(MotionEvent e) {
float x = e.getX();
switch(e.getAction()){
case MotionEvent.ACTION_DOWN:
ox = x;
break;
case MotionEvent.ACTION_UP:
float length = x - ox;
if(length < -Constant.slide_length){
Message msg = handler.obtainMessage(next);
handler.sendMessage(msg);
}else if(length > Constant.slide_length){
Message msg = handler.obtainMessage(front);
handler.sendMessage(msg);
}
}
return true;
}
private class SceneRenderer implements GLSurfaceView.Renderer
{
ImageRect imgRect[] = new ImageRect[Constant.MAX_IMG_COUNT];
private Object lock = new Object();
public void onDrawFrame(GL10 gl)
{
//清除深度缓冲与颜色缓冲
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
//初始化光源方向
MatrixState.setLightLocation(0f, 5f, 5f);
DrawPics();
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置视窗大小及位置
GLES20.glViewport(0, 0, width, height);
//计算GLSurfaceView的宽高比
ratio = (float) width / height;
//调用此方法计算产生透视投影矩阵
MatrixState.setProjectFrustum(-ratio, ratio, -1, 1, 4f, 100);
//调用此方法产生摄像机9参数位置矩阵
MatrixState.setCamera(0f,0f,10.0f,0f,0f,0f,0f,1.0f,0.0f);
//初始化变换矩阵
MatrixState.setInitStack();
//加载纹理
int drawableIDs[] = new int[]
{
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e,
R.drawable.f,
};
/*drawableIDs[0] = R.drawable.android_robot0;
drawableIDs[1] = R.drawable.android_robot0;
drawableIDs[2] = R.drawable.android_robot0;
drawableIDs[3] = R.drawable.android_robot0;
drawableIDs[4] = R.drawable.android_robot0;
drawableIDs[5] = R.drawable.android_robot0;*/
for (int i=0;i<TexturesCount; i++)
textureIds[i] = initTexture(drawableIDs[i]);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//设置屏幕背景色RGBA
GLES20.glClearColor(0.0f,0.0f,0.0f, 1.0f);
//创建img对象
for (int i=0; i<Constant.MAX_IMG_COUNT; i++)
imgRect[i] =new ImageRect(MySurfaceView.this);
//打开深度检测
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
//打开背面剪裁
GLES20.glEnable(GLES20.GL_CULL_FACE);
}
//将标准图片向远处偏移
public void originTransformPic(int picIndex)
{
//计算偏移后的x和z坐标
int factor = picIndex -(Constant.MAX_IMG_COUNT-1)/2;//介于-2~+2之间
float xOffset, zOffset;
xOffset = factor*Constant.xDistance;
zOffset = -Math.abs(factor*Constant.zDistance);
MatrixState.translate(xOffset, 0, zOffset);
}
public void AnimationTransform(int picIndex,
int rotateIndex/*旋转次数索引*/,
boolean leftToRightDirection/*向右为正*/)
{
//先进行原始偏移
originTransformPic(picIndex);
if (rotateIndex == 0)//不需要动画
return;
//再进行动画偏移
int factor = picIndex -(Constant.MAX_IMG_COUNT-1)/2;//介于-2~+2之间
float xOffset, zOffset;
xOffset = Constant.xFrameStep*rotateIndex;
zOffset = -Constant.zFrameStep*rotateIndex;
if (!leftToRightDirection)
xOffset = -xOffset;
if ((leftToRightDirection && (factor < 0)) || (!leftToRightDirection && (factor > 0)))
zOffset = -zOffset;
MatrixState.translate(xOffset, 0, zOffset);
//对中间一张进行旋转,让下面一张露出来时候不挡住视线
/*if (0 == factor)
{
int count = Constant.slideFrames;
float rotateAngel;
rotateAngel = (count/2 - Math.abs(rotateIndex - count/2))*Constant.frameRotateAngel;
if (!leftToRightDirection)
rotateAngel = -rotateAngel;
//MatrixState.rotate((float)Math.toRadians(rotateAngel), 1, 1, 1);
MatrixState.rotate(rotateAngel, 0, 1, 0);
}*/
}
public void DrawPics()
{
float iAlphoaValue = 1.0f;
//从左到右按顺序绘制照片(最中间一张暂时不绘制,最后再绘)
int mediaIndex = (Constant.MAX_IMG_COUNT-1)/2;
for (int i=0; i<Constant.MAX_IMG_COUNT; i++)
{
iAlphoaValue = 1.0f;
if (i != mediaIndex)
{
//给最后一张照片加上淡出的效果
if (((i == 0) && (!leftToRightDirection))
|| ((i == Constant.MAX_IMG_COUNT -1) && (leftToRightDirection)))//慢慢消失
{
iAlphoaValue = 1.0f-(float)slideIndex/(float)Constant.slideFrames;
}
//else if ((i == Constant.MAX_IMG_COUNT -1) && (leftToRightDirection))//慢慢出现
MatrixState.pushMatrix();
AnimationTransform(i, slideIndex, leftToRightDirection);
int textureid = i;
if (textureid > (TexturesCount -1))
textureid = textureid % TexturesCount;
imgRect[i].drawSelf(textureIds[textureid],iAlphoaValue);
MatrixState.popMatrix();
}
}
//绘制第一张,淡入效果
if (Constant.MAX_IMG_COUNT > 1)
{
iAlphoaValue = (float)slideIndex/(float)Const
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Alex_CoverFlow - 0_淡入淡出,带倒影.rar (63个子文件)
Alex_CoverFlow - 0_淡入淡出,带倒影
bin
classes.dex 23KB
Alex_CoverFlow.apk 588KB
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
a.png 80KB
c.png 97KB
checkerboard.png 178B
f.png 88KB
e.png 80KB
b.png 92KB
d.png 96KB
icon.png 4KB
android_robot0.png 27KB
drawable-mdpi
icon.png 2KB
jarlist.cache 119B
dexedLibs
annotations-dbf7930b07c4a99780148a79f5616294.jar 943B
classes
com
alex
CoverFlow
BuildConfig.class 345B
R$layout.class 434B
R$id.class 483B
R$drawable.class 624B
R$attr.class 340B
R.class 531B
R$string.class 398B
Sample_CoverFlow
ImageRect.class 4KB
SampleCoverFlow_Activity.class 2KB
MySurfaceView$1.class 1KB
ShaderUtil.class 3KB
MySurfaceView$SceneRenderer.class 5KB
Constant.class 708B
MySurfaceView.class 4KB
MatrixState.class 4KB
bg_view.class 433B
resources.ap_ 575KB
AndroidManifest.xml 734B
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
a.png 83KB
c.png 100KB
checkerboard.png 218B
f.png 91KB
e.png 83KB
b.png 95KB
d.png 99KB
icon.png 4KB
android_robot0.png 30KB
values
strings.xml 116B
drawable-mdpi
icon.png 3KB
layout
test_framelayout.xml 500B
main.xml 543B
assets
vertex.sh 3KB
frag.sh 1KB
gen
com
alex
CoverFlow
BuildConfig.java 160B
R.java 1KB
.settings
org.eclipse.jdt.core.prefs 629B
src
com
alex
Sample_CoverFlow
MatrixState.java 5KB
bg_view.java 366B
MySurfaceView.java 12KB
SampleCoverFlow_Activity.java 2KB
ShaderUtil.java 4KB
Constant.java 934B
ImageRect.java 8KB
.project 846B
.classpath 380B
project.properties 445B
AndroidManifest.xml 734B
共 63 条
- 1
阿群在路上
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页