// Copyright (c) 2011 Wistron SWPC
// All rights reserved.
// created: 2011/09/28
// filename: IconList.java
// author: Neo Yeoh
// purpose:
package com.wistron.WiGallery;
import Utilities.CSStaticData;
import Utilities.FileOperation;
import android.graphics.Bitmap;
import android.os.RemoteCallbackList;
import android.util.Log;
import android.view.MotionEvent;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.util.List;
import java.util.LinkedList;
import java.util.Iterator;
import javax.microedition.khronos.opengles.GL10;
import com.wistron.WiGallery.WiGalleryOpenGLRenderer;
public class ElementList extends ElementBase
{
private static final float[] m_image_coords =
{
0,1, 1,1,
0,0, 1,0,
};
// 文件夹
protected int m_pos_index = 0;
protected int m_offset_index = 0; //文件夹位移数
private float[] m_nongroup_animation_step = {0,0,0}; // 开启/关闭 None Group模式动画步长
private int m_nongroup_animation_frame_num = 0;
private static final Byte [] m_line_index ={0,1,3,2};
private static final float[] m_image_vers = new float[12];
private FloatBuffer m_tex_buff = ResourceManager.makeFloatBuffer(m_image_coords);
private FloatBuffer m_cover_buff = null;
private ByteBuffer m_line_index_buff = ResourceManager.makeByteBuffer(m_line_index);
private List<Element> m_list = null;
private String m_name = null;
private int m_nameTexture = CSStaticData.INVALID_TEXTURE_ID;
private int m_elementNumTexture = CSStaticData.INVALID_TEXTURE_ID;
private int m_elementNum = 0;
protected int m_animation_index = 0;
private CSStaticData.LIST_TYPE m_type = CSStaticData.LIST_TYPE.LIST_NONE;
private int m_index = 0;
private int m_sort_order = -1;
private float m_angle = 30;
// 当前最大加载纹理的文件个数
private int m_max_texture_num = 100;
private static String m_open_file_name = null;
public boolean m_b_enter = false;
public ElementList(CSStaticData.LIST_TYPE type)
{
m_type = type;
if (m_list != null)
m_list.clear();
else
m_list = new LinkedList<Element>();
}
public ElementList(List<Element> list, CSStaticData.LIST_TYPE type)
{
m_type = type;
if (m_list != null)
m_list.clear();
else
m_list = new LinkedList<Element>();
if (list != null)
{
int num = list.size();
for (int i = 0; i < num; i++)
{
m_list.add(list.get(i));
}
}
}
public void setEntering(boolean val)
{
// 打开nongroup动画
if (val)
{
if (!m_b_enter)
{
m_b_enter = true;
m_index = 0;
startAnimation(CSStaticData.ANIMATION_TYPE.NONEGROUP_OPENING);
}
}
else
{
if(m_b_enter)
{
startAnimation(CSStaticData.ANIMATION_TYPE.NONEGROUP_CLOSING);
}
}
}
public boolean isEntering()
{
return m_b_enter;
}
public void setName(String name)
{
m_name = name;
}
public String getName()
{
return m_name;
}
public CSStaticData.LIST_TYPE getType()
{
return m_type;
}
public int getSize()
{
return m_list.size();
}
Element get(int i)
{
if (i < 0 || i >= m_list.size())
{
return null;
}
else
{
return m_list.get(i);
}
}
/**
* 刷新列表, 参数为文件列数
*/
public void refresh(int firstElement)
{
int totalCol = size() / CSStaticData.group_none_row_num;
if (firstElement > totalCol) firstElement = totalCol;
else if (firstElement < 0) firstElement = 0;
if (m_type == CSStaticData.LIST_TYPE.LIST_NONE || m_b_enter == true)
{
m_index = firstElement * CSStaticData.group_none_row_num;
refreshPosition_None();
}
else
{
m_index = firstElement;
}
}
private void refreshPosition_None()
{
int n = m_list.size();
if (WiGalleryOpenGLRenderer.m_b_horizontal_screen)
{
// 横屏
m_angle = 15.0f;
}
else
{
// 竖屏
m_angle = 30.0f;
}
int curRow = m_index / CSStaticData.group_none_row_num;
for (int i = 0; i < n; i++)
{
Element elem = m_list.get(i);
if (elem != null)
{
int row = i % CSStaticData.group_none_row_num; // 行
int col = i / CSStaticData.group_none_row_num - curRow; // 列
float x = (float) (CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * col);
float y = (float) (CSStaticData.y_list_pos_start + CSStaticData.y_list_pos_offset * row);
float z = (float) (CSStaticData.z_list_pos_start + CSStaticData.z_list_pos_offset * col);
elem.moveTo(x, y, z);
elem.setAngleTo(0, m_angle, 0);
}
}
}
/**
* 删除选中的元素以及对应的纹理
*/
public void deleteSeleted()
{
Iterator<Element> it = m_list.iterator();
while (it.hasNext())
{
Element elem = it.next();
if (elem != null && elem.isChoosed())
{
elem.delete();;
it.remove();
}
}
if (m_list.size() == 0)
{
WiGalleryOpenGLRenderer.m_resource_manager.AddNeedDeleteTextureID(m_elementNumTexture);
m_elementNumTexture = CSStaticData.INVALID_TEXTURE_ID;
WiGalleryOpenGLRenderer.m_resource_manager.AddNeedDeleteTextureID(m_nameTexture);
m_nameTexture = CSStaticData.INVALID_TEXTURE_ID;
}
else
{
refresh(0);
}
}
/**
* 情况列表,不删除数据
*/
public void clear()
{
m_list.clear();
}
/**
* 删除所有元素以及对应的纹理
*/
public void deleteAll()
{
Iterator<Element> it = m_list.iterator();
while (it.hasNext())
{
Element elem = it.next();
if (elem != null)
{
elem.delete();;
it.remove();
}
}
// 需要删除纹理
WiGalleryOpenGLRenderer.m_resource_manager.AddNeedDeleteTextureID(m_elementNumTexture);
m_elementNumTexture = CSStaticData.INVALID_TEXTURE_ID;
WiGalleryOpenGLRenderer.m_resource_manager.AddNeedDeleteTextureID(m_nameTexture);
m_nameTexture = CSStaticData.INVALID_TEXTURE_ID;
}
public List<Element> getList()
{
return m_list;
}
public void setList(List<Element> list)
{
if (list != null)
{
m_list.clear();
for (int i = 0; i < list.size(); i++)
{
m_list.add(list.get(i));
}
}
}
public void SetCurIndex(int index)
{
index = index / CSStaticData.group_none_row_num;
index *= CSStaticData.group_none_row_num;
m_index = index;
}
public int GetCurIndex()
{
return m_index;
}
public void add(Element icon)
{
synchronized(m_list)
{
m_list.add(icon);
}
}
//
/**
* 元素个数
* @return
*/
public int size()
{
return m_list.size();
}
//
/**
* 获取指定元素
*/
public Element getIndex(int i)
{
synchronized(m_list)
{
if(i < 0 || i >= size())
return null;
return m_list.get(i);
}
}
public Element getElement(String name) {
synchronized (m_list) {
int size = size();
for (int i = 0; i < size; i++) {
Element elem = m_list.get(i);
if (name.compareToIgnoreCase(elem.getName()) == 0) {
return elem;
}
}
}
return null;
}
//
/**
* 设置选择状态
* @param status
*/
public void setStatus(ELEM_STATUS status)
{
if (m_type == CSStaticData.LIST_TYPE.LIST_NONE || m_b_enter)
{
Iterator<Element> it = m_list.iterator();
while (it.hasNext())
{
Element elem = it.next();
CSStaticData.MEDIA_TYPE type = elem.getFileType();
if (WiGalleryOpenGLRenderer.getMediaMetaType() == CSStaticData.MEDIA_META_TYPE.ALL_MEDIA_TYPE
|| WiGalleryOpenGLRenderer.getMediaMetaType() == CSStaticData.MEDIA_META_TYPE.NO_FILTER)
{
elem.setStatus(status);
}
else if (WiGalleryOpenGLRenderer.getMediaMetaType() == CSStaticData.MEDIA_META_TYPE.IMAGE_MEDIA_TYPE)
{
// 图片
if (type == CSStaticData.MEDIA_TYPE.NORMAL_IMAGE || type == CSStaticData.MEDIA_TYPE.STOERE_IMAGE)
{
elem.setStatus(status);
}
else
{
elem.setStatus(ELEM_STATUS.DISABLE_STATUS);
}
}
else if (WiGalleryOpenGLRenderer.getMediaMetaType() == CSStaticData.MEDIA_META_TYPE.VIDEO_MEDIA_TYPE)
{
// 视频
if (type == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO || type == CSStaticData.MEDIA_TYPE.STOERE_VIDEO)
{
elem.setStatus(status);
}
else
{
elem.setStatus(ELEM_STATUS.DISABLE_STATUS);
}
}
else if (WiGalleryOpenGLRenderer.getMediaMetaType() == CSStaticData.MEDIA_META_TYPE.SET_FAVORITE_TYPE)
{
// 设置喜好
if (!elem.bFavorite())
{
elem.setStatus(status);
}
else
{
elem.setStatus(ELEM_STATUS.DISABLE_STATUS);
}
}
else if (WiGalleryOpenGLRenderer.getMediaMetaType() == CSStaticData.MEDIA_META_TYPE.REMOVE_FAVORITE_TYPE)
{
// 取消喜好
if (elem.bFavorite())
{
elem.setStatus(status);
}
else
{
elem.setStatus(ELEM_STATUS.DISABLE_STATUS);
}
}
else
{
// 不做处理
}
}
}
else
{
m_status = status;
if (status == ELEM_STATUS.NORMAL_STATUS)
{
// 如果设置为正常模式,不选择
setChoosed(false);
}
}
}
public boolean isMoving()
{
// 文件列表模式
if (getAnimationType()== CSStaticData.ANIMATION_TYPE.NONEGROUP_OPENING)
{
// 判断是否为进入动画
return true;
}
else if (getAnimationType()== CSStaticData.ANIMATION_TYPE.NONEGROUP_CLOSING)
{
// 判断是否为退出动画
return true;
}
// 文件夹模式
if (m_type != CSStaticData.LIST_TYPE.LIST_NONE)
{
if (!m_b_enter)
{
// 文件夹移动
if (getAnimationType()== CSStaticData.ANIMATION_TYPE.NONE)
return false;
else
return true;
}
else
{
synchronized(m_list)
{
for(int i = m_index-CSStaticData.group_none_row_num; i < m_index+18; i++)
{
if (i < 0 || i > size()-1)
continue;
Element elem = m_list.get(i);
if (elem != null)
{
if (elem.getAnimationType() != CSStaticData.ANIMATION_TYPE.NONE)
{
return true;
}
}
}
}
return false;
}
}
else
{
// 文件列表模式
synchronized(m_list)
{
for(int i = m_index-CSStaticData.group_none_row_num; i < m_index+18; i++)
{
if (i < 0 || i > size()-1)
continue;
Element elem = m_list.get(i);
if (elem != null)
{
if (elem.getAnimationType() != CSStaticData.ANIMATION_TYPE.NONE)
{
return true;
}
}
}
}
return false;
}
}
public void calcPosition()
{
if (m_type == CSStaticData.LIST_TYPE.LIST_NONE || m_b_enter == true)
{
// 显示文件列表
CSStaticData.eye_center_none[1] = 0;// 恢复为默认值
if (size() <= 0)
{
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
m_animation_index = -1;
}
int total_col = size() / CSStaticData.group_none_row_num;
int num = 12;
int start = m_index - num;
int end = m_index + num * 2;
//loadFileTexture(start, end);
if (m_animation_type == CSStaticData.ANIMATION_TYPE.NONEGROUP_OPENING)
{
// 打开NoneGroup
int move_num = 18/CSStaticData.group_none_row_num;
int start1 = m_index+17;
int end1 = m_index-CSStaticData.group_none_row_num;
for (int i = start1; i >= end1; i--)
{
if (i < 0 || i > size()-1)
continue;
int colIndex = i / CSStaticData.group_none_row_num;
Element elem = getIndex(i);
if (elem != null)
{
if (m_nongroup_animation_frame_num < move_num)
elem.move(m_nongroup_animation_step[0], m_nongroup_animation_step[1], m_nongroup_animation_step[2]);
else
{
int n = m_nongroup_animation_frame_num - move_num;
if (n >= colIndex*5 && n < colIndex*5+5)
{
elem.setAngle(0, 15, 0);
}
else if (n < colIndex*5)
{
elem.move(m_nongroup_animation_step[0], m_nongroup_animation_step[1], m_nongroup_animation_step[2]);
}
else
{
if (n >= (total_col+1)*5)
{
m_nongroup_animation_frame_num = -1;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
break;
}
}
}
elem.calcPosition();
}
}
int c = total_col > 12 ? 12 : total_col;
if (m_nongroup_animation_frame_num > move_num + 12 * 5)
{
m_nongroup_animation_frame_num = -1;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
refresh(0);
}
m_nongroup_animation_frame_num++;
}
else if(m_animation_type == CSStaticData.ANIMATION_TYPE.NONEGROUP_CLOSING)
{
// 关闭NoneGroup
// 18 表示最多移动18个元素
int start1 = m_index+17;
int end1 = m_index - CSStaticData.group_none_row_num ;
for (int i = start1; i >= end1; i--)
//for (int i = size()-1; i >= 0; i--)
{
if (i < 0 || i > size()-1)
continue;
Element elem = getIndex(i);
if (elem != null)
{
int colIndex = start1/CSStaticData.group_none_row_num - i / CSStaticData.group_none_row_num;
if (m_nongroup_animation_frame_num > colIndex*2 && m_nongroup_animation_frame_num < colIndex*2+5)
{
elem.setAngle(0, -15, 0);
}
else if (m_nongroup_animation_frame_num >= colIndex*2+2)
{
elem.move(m_nongroup_animation_step[0], m_nongroup_animation_step[1], m_nongroup_animation_step[2]);
}
elem.calcPosition();
}
}
//float[] last_elem_pos = m_list.get(m_list.size()-1).getPosition();
int last = m_index+17;
if (last < 0) last = 0;
else if (last > size()-1) last = size()-1;
float[] last_elem_pos = m_list.get(last).getPosition();
if (last_elem_pos[0] < CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * -2)
{
// 最后一个 元素移除后动画停止
m_nongroup_animation_frame_num = -1;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
m_b_enter = false;
}
m_nongroup_animation_frame_num++;
}
else
{
float angle = 0;
if (WiGalleryOpenGLRenderer.m_b_horizontal_screen)
{
// 横屏
angle = 15.0f;
}
else
{
// 竖屏
angle = 30.0f;
}
int curRow = m_index / CSStaticData.group_none_row_num;
for (int i = 0; i <= size()-1; i++)
{
Element elem = getIndex(i);
if (elem != null)
{
if (elem.getAnimationType() != CSStaticData.ANIMATION_TYPE.NONE)
elem.calcPosition();
else
{
int row = i % CSStaticData.group_none_row_num; // 行
int col = i / CSStaticData.group_none_row_num - curRow; // 列
float x = (float) (CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * col);
float y = (float) (CSStaticData.y_list_pos_start + CSStaticData.y_list_pos_offset * row);
float z = (float) (CSStaticData.z_list_pos_start + CSStaticData.z_list_pos_offset * col);
elem.moveTo(x, y, z);
elem.setAngleTo(0, angle, 0);
}
}
}
}
/*
for (int i = size()-1; i >= 0; i--)
{
Element elem = getIndex(i);
if (elem != null)
{
if (i >= start && i < end)
{
// 不作处理
}
else
{
if (elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
}
}
}
}
*/
}
else
{
// 文件夹模式
if (m_animation_type == CSStaticData.ANIMATION_TYPE.LEFT_SHIFT)
{
// 左移
m_pos_index -= SCurve.m_mov_num;
if (m_animation_index == SCurve.m_step-1)
{
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
m_animation_index = -1;
}
m_animation_index++;
float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
moveTo(pos[0], pos[1], pos[2]);
}
else if (m_animation_type == CSStaticData.ANIMATION_TYPE.RIGHT_SHIFT)
{
// 右移
m_pos_index += SCurve.m_mov_num;
if (m_animation_index == SCurve.m_step-1)
{
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
m_animation_index = -1;
}
m_animation_index++;
float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
moveTo(pos[0], pos[1], pos[2]);
}
else if (m_animation_type == CSStaticData.ANIMATION_TYPE.GENTLE_SHIFT)
{
// 右轻移
if (m_offset_index < 0)
m_pos_index-=SCurve.m_mov_num;
else
m_pos_index+=SCurve.m_mov_num;
if (m_animation_index == Math.abs(m_offset_index*SCurve.m_step/5)-1)
{
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
m_animation_index = -1;
}
m_animation_index++;
float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
moveTo(pos[0], pos[1], pos[2]);
}
else
{
//~!
//float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
//moveTo(pos[0], pos[1], pos[2]);
}
}
}
public void onDraw(GL10 gl, MEDIA_VIEW view)
{
int num = size();
if (num <= 0)
return;
if (m_elementNumTexture == CSStaticData.INVALID_TEXTURE_ID || m_elementNum != num)
{
// 更新文件个数纹理
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
Bitmap bm = WiGalleryOpenGLRenderer.m_date_bitmap.copy(WiGalleryOpenGLRenderer.m_date_bitmap.getConfig(), true);
m_elementNumTexture = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_elementNumTexture,
bm,
String.format("%d", num),
bm.getHeight()*2/5,
CSStaticData.ALIGN_TYPE.ALIGN_CENTRE,
true);
bm.recycle();
}
else if (m_type == CSStaticData.LIST_TYPE.LIST_NONE)
{
// 不做处理
}
else
{
// Location
Bitmap bm = WiGalleryOpenGLRenderer.m_location_bitmap.copy(WiGalleryOpenGLRenderer.m_location_bitmap.getConfig(), true);
m_elementNumTexture = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_elementNumTexture,
bm,
String.format("%d", num),
bm.getHeight()/5 ,
CSStaticData.ALIGN_TYPE.ALIGN_CENTRE,
true);
bm.recycle();
}
m_elementNum = num;
}
if(m_nameTexture == CSStaticData.INVALID_TEXTURE_ID && m_name!= null)
{
WiGalleryOpenGLRenderer.m_label_bitmap.eraseColor(0);
m_nameTexture = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_nameTexture,
WiGalleryOpenGLRenderer.m_label_bitmap,
m_name,
WiGalleryOpenGLRenderer.m_label_bitmap.getHeight() * 4 / 5,
CSStaticData.ALIGN_TYPE.ALIGN_LEFT,
false);
}
if (m_type == CSStaticData.LIST_TYPE.LIST_NONE || m_b_enter == true|| m_type == CSStaticData.LIST_TYPE.LIST_INVALID)
{
// 显示文件列表
CSStaticData.eye_center_none[1] = 0;// 恢复为默认值
drawGroupNone(gl, view);
}
else
{
m_view_side = view;
// 文件夹模式---
// 显示文件夹
// 显示前三张图片
gl.glPushMatrix();
if (m_type == CSStaticData.LIST_TYPE.LIST_LOCATION_1
|| m_type == CSStaticData.LIST_TYPE.LIST_LOCATION_2
|| m_type == CSStaticData.LIST_TYPE.LIST_LOCATION_3
|| m_type == CSStaticData.LIST_TYPE.LIST_LOCATION_4)
{
gl.glScalef(1.0f, 1.0f, 1.0f);
}
gl.glTranslatef(m_x_offset, m_y_offset, m_z_offset);
// gl.glRotatef(m_zrot, 0f, 0f, 1f); //不能转Z轴,也不能把Z轴转为0
gl.glRotatef(m_yrot, 0f, 1f, 0f);
gl.glRotatef(m_xrot, 1f, 0f, 0f);
int id = CSStaticData.INVALID_TEXTURE_ID;
float a = 0.8f;
float textureHeight = a * 0.4f;
float textureWidth = a * 0.4f;
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
// 日期分组
m_image_vers[0] = - textureWidth / 2.0f; m_image_vers[1] = - textureHeight / 2.0f; m_image_vers[2] = 0;
m_image_vers[3] = textureWidth / 2.0f; m_image_vers[4] = - textureHeight / 2.0f; m_image_vers[5] = 0;
m_image_vers[6] = - textureWidth / 2.0f; m_image_vers[7] = textureHeight / 2.0f; m_image_vers[8] = 0;
m_image_vers[9] = textureWidth / 2.0f; m_image_vers[10] = textureHeight / 2.0f; m_image_vers[11] = 0;
}
else
{
// 地理位置分组
m_image_vers[0] = - textureWidth / 3.0f; m_image_vers[1] = - textureHeight / 3.0f; m_image_vers[2] = 0;
m_image_vers[3] = textureWidth / 3.0f; m_image_vers[4] = - textureHeight / 3.0f; m_image_vers[5] = 0;
m_image_vers[6] = - textureWidth / 3.0f; m_image_vers[7] = textureHeight / 3.0f; m_image_vers[8] = 0;
m_image_vers[9] = textureWidth / 3.0f; m_image_vers[10] = textureHeight / 3.0f; m_image_vers[11] = 0;
}
if (m_cover_buff != null)
m_cover_buff.clear();
m_cover_buff = ResourceManager.makeFloatBuffer(m_image_vers);
for (int i = 2; i >= 0; i--)
{
if (i >= m_list.size())
continue;
Element elem = m_list.get(i);
if (elem != null)
{
if (!elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_data_manager.setRequestLoadFileList(elem);
}
id = elem.getTextureID(view);
if (id == CSStaticData.INVALID_TEXTURE_ID)
{
if (elem.getFileType() == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO || elem.getFileType() == CSStaticData.MEDIA_TYPE.STOERE_VIDEO)
id = WiGalleryOpenGLRenderer.m_default_video_icon;
else
id = WiGalleryOpenGLRenderer.m_default_file_icon;;
}
gl.glPushMatrix();
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
gl.glRotatef(-20.0f, 1.0f, 0.0f, 0);
gl.glRotatef(-15.0f, 0.0f, 1.0f, 0);
if (i == 0)
gl.glTranslatef(0, 0, 0);
else if (i == 1)
gl.glTranslatef(-0.02f , 0.03f, -0.01f);
else
gl.glTranslatef(0.03f , 0.01f, -0.02f);
}
else
{
gl.glRotatef(90.0f, 1.0f, 0.0f, 0);
if (i == 0)
gl.glTranslatef(0, 0, 0);
else if (i == 1)
gl.glTranslatef(0.01f , 0.01f, -0.01f);
else
gl.glTranslatef(0.02f , 0.02f, -0.02f);
}
// 绘制图片
//gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
//gl.glEnable(GL10.GL_DEPTH_TEST);
// 绘制文件类型
if (WiGalleryOpenGLRenderer.m_zmap_videoindicator_id != CSStaticData.INVALID_TEXTURE_ID
&& (elem.getFileType() == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO || elem.getFileType() == CSStaticData.MEDIA_TYPE.STOERE_VIDEO))
{
gl.glPushMatrix();
gl.glBindTexture(GL10.GL_TEXTURE_2D, WiGalleryOpenGLRenderer.m_zmap_videoindicator_id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glPopMatrix();
}
// 绘制边框
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glColor4f(0.4f, 0.4f, 0.4f, 1.0f);
gl.glLineWidth(2.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glDrawElements(GL10.GL_LINE_LOOP, 4, GL10.GL_UNSIGNED_BYTE, m_line_index_buff);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
gl.glPopMatrix();
}
}
// 显示文件夹名称
if (m_nameTexture != CSStaticData.INVALID_TEXTURE_ID)
{
int w = WiGalleryOpenGLRenderer.m_label_bitmap.getWidth();
int h = WiGalleryOpenGLRenderer.m_label_bitmap.getHeight();
textureHeight = 0.07f;
textureWidth = textureHeight * w / h;
m_image_vers[0] = - textureWidth / 2.0f; m_image_vers[1] = - textureHeight / 2.0f; m_image_vers[2] = 0;
m_image_vers[3] = textureWidth / 2.0f; m_image_vers[4] = - textureHeight / 2.0f; m_image_vers[5] = 0;
m_image_vers[6] = - textureWidth / 2.0f; m_image_vers[7] = textureHeight / 2.0f; m_image_vers[8] = 0;
m_image_vers[9] = textureWidth / 2.0f; m_image_vers[10] = textureHeight / 2.0f; m_image_vers[11] = 0;
if (m_cover_buff != null)
m_cover_buff.clear();
m_cover_buff = ResourceManager.makeFloatBuffer(m_image_vers);
gl.glPushMatrix();
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
gl.glRotatef(-15.0f, 1.0f, 0, 0);
gl.glTranslatef(0.17f, -0.18f, 0.05f);
}
else
{
gl.glRotatef(90.0f, 1.0f, 0.0f, 0);
gl.glTranslatef(0.25f, -0.15f, 0.01f);
}
gl.glBindTexture(GL10.GL_TEXTURE_2D, m_nameTexture);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glPopMatrix();
}
// 显示文件张数
if (m_elementNumTexture != CSStaticData.INVALID_TEXTURE_ID)
{
int w = 0;
int h = 0;
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
w = WiGalleryOpenGLRenderer.m_date_bitmap.getWidth();
h = WiGalleryOpenGLRenderer.m_date_bitmap.getHeight();
}
else
{
w = WiGalleryOpenGLRenderer.m_location_bitmap.getWidth();
h = WiGalleryOpenGLRenderer.m_location_bitmap.getHeight();
}
if (w !=0 && h !=0 )
{
textureHeight = 0.15f;
textureWidth = textureHeight * w / h;
m_image_vers[0] = - textureWidth / 2.0f; m_image_vers[1] = - textureHeight / 2.0f; m_image_vers[2] = 0;
m_image_vers[3] = textureWidth / 2.0f; m_image_vers[4] = - textureHeight / 2.0f; m_image_vers[5] = 0;
m_image_vers[6] = - textureWidth / 2.0f; m_image_vers[7] = textureHeight / 2.0f; m_image_vers[8] = 0;
m_image_vers[9] = textureWidth / 2.0f; m_image_vers[10] = textureHeight / 2.0f; m_image_vers[11] = 0;
if (m_cover_buff != null)
m_cover_buff.clear();
m_cover_buff = ResourceManager.makeFloatBuffer(m_image_vers);
gl.glPushMatrix();
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
gl.glRotatef(-15.0f, 1.0f, 0, 0);
gl.glTranslatef(-0.13f, -0.09f, 0.05f);
}
else
{
gl.glRotatef(90.0f, 1.0f, 0.0f, 0);
gl.glTranslatef(-0.08f, -0.12f, 0.01f);
}
gl.glBindTexture(GL10.GL_TEXTURE_2D, m_elementNumTexture);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glPopMatrix();
}
}
// 绘制选择标志
if (m_status == ELEM_STATUS.SELECTED_STATUS )
{
gl.glPushMatrix();
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
gl.glRotatef(-15.0f, 1.0f, 0, 0);
gl.glTranslatef(0.095f, -0.095f, 0.05f);
}
else
{
gl.glRotatef(90.0f, 1.0f, 0.0f, 0);
gl.glTranslatef(0.095f, -0.095f, 0.01f);
}
if(m_is_choosed)
{
if (WiGalleryOpenGLRenderer.m_zmap_select_gallery_select_id != CSStaticData.INVALID_TEXTURE_ID)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, WiGalleryOpenGLRenderer.m_zmap_select_gallery_select_id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
}
else
{
if (WiGalleryOpenGLRenderer.m_zmap_select_gallery_none_id != CSStaticData.INVALID_TEXTURE_ID)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, WiGalleryOpenGLRenderer.m_zmap_select_gallery_none_id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
}
gl.glPopMatrix();
}
gl.glPopMatrix();
}
}
public boolean onTouchEvent(float x, float y)
{
if (isMoving())
{
return true;
}
if (m_type == CSStaticData.LIST_TYPE.LIST_NONE)
{
for (int i = m_index-3; i < m_index+24; i++)
{
if (i < 0 || i > m_list.size()-1)
{
continue;
}
Element elem = m_list.get(i);
if(elem != null)
{
if (elem.onTouchEvent(x, y))
{
if(CSStaticData.DEBUG)
Log.d("ElementList", String.format("choose [%d, %s]",i, elem.getName()));
return true;
}
}
}
}
else
{
if (m_b_enter)
{
for (int i = m_index-3; i < m_index+24; i++)
{
if (i < 0 || i > m_list.size()-1)
{
continue;
}
Element elem = m_list.get(i);
if(elem != null)
{
if (elem.onTouchEvent(x, y))
{
if(CSStaticData.DEBUG)
Log.d("ElementList", String.format("choose [%d, %s]",i, elem.getName()));
return true;
}
}
}
}
else
{
//~
// 文件夹模式
if(CSStaticData.isInRect(m_x_offset, m_y_offset, m_z_offset, x, y, 0.25f))
{
return true;
}
else
{
return false;
}
}
}
return false;
}
/**
* 获取打开的文件路径与文件名
*/
public static String getOpenFilePathName()
{
return m_open_file_name;
}
//
/**
* 排列顺序显示
* @param order 0:升序 1:降序
*/
public void setOrder(int order)
{
if(order == 0){
CSStaticData.g_sort_order_mode = true;
}
if(order == 1){
CSStaticData.g_sort_order_mode = false;
}
if (m_sort_order == order)
return;
m_sort_order = order;
if (order == 0)
m_list = WiGalleryOpenGLRenderer.m_data_manager.sortByAsc(m_list);
else if (order == 1)
m_list = WiGalleryOpenGLRenderer.m_data_manager.sortByDesc(m_list);
refresh(0);
}
//
/**
* 获取选中的文件个数
* @return
*/
public int getSelectedNum()
{
int i = 0;
int size = size();
for (int j = 0; j < size; j++)
{
Element elem = getIndex(j);
if (elem != null && elem.isChoosed())
{
i++;
}
}
return i;
}
/**
* Date文件夹模式下的移动
* @param index
*/
public void moveToIndex(int index)
{
m_pos_index = index;
float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
moveTo(pos[0], pos[1], pos[2]);
}
/////
// 保存状态时使用
public int getIndex()
{
return m_pos_index;
}
public void setIndex(int index)
{
m_pos_index = index;
}
////
/**
* Date文件夹模式下的移动
* @param index
*/
public void moveToIndexTo(int val)
{
m_pos_index += val;
float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
moveTo(pos[0], pos[1], pos[2]);
}
/**
* 在none模式或者文件夹打开模式下移动
* @param index: 显示区域第一个显示元素的标号
*/
public void shiftTo(int index, boolean bAnimation, boolean bAlign)
{
if (bAlign)
{
// 第一屏与最后一屏时进行对其处理
int tRow = 3; //每屏显示的列数
if (WiGalleryOpenGLRenderer.m_b_horizontal_screen)
tRow = 4;
int tIndex = (size() +CSStaticData.group_none_row_num-1) / CSStaticData.group_none_row_num - 1;
if (index < 0) index = 0;
else if (index > tIndex-tRow) index = tIndex - tRow;
}
// 12表示一屏显示的文件个数
if (size() <= 12)
index = 0;
if (m_type == CSStaticData.LIST_TYPE.LIST_NONE || m_b_enter)
{
int cIndex = m_index / CSStaticData.group_none_row_num;
int cd = cIndex - index;
int num_frame = 2 * Math.abs(cd);
float x = CSStaticData.x_list_pos_offset * cd;
float y = Math.abs(0 * cd);
float z = CSStaticData.z_list_pos_offset * cd;
float[] steps = {x/num_frame, y/num_frame, z/num_frame};
float[] final_Angle = {0, m_angle, 0};
for (int i = 0; i < m_list.size(); i++)
{
int row = i % CSStaticData.group_none_row_num; // 行
int col = i / CSStaticData.group_none_row_num - index; // 列
x = (float) (CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * col);
y = (float) (CSStaticData.y_list_pos_start + CSStaticData.y_list_pos_offset * row);
z = (float) (CSStaticData.z_list_pos_start + CSStaticData.z_list_pos_offset * col);
float[] final_pos = {x,y,z};
Element elem = m_list.get(i);
if (elem != null)
{
if (bAnimation)
{
elem.startAnimation(CSStaticData.ANIMATION_TYPE.GENTLE_SHIFT, num_frame, steps, final_pos, final_Angle);
}
else
{
elem.moveTo(final_pos[0], final_pos[1], final_pos[2]);
elem.setAngleTo(final_Angle[0], final_Angle[1], final_Angle[2]);
}
}
}
m_index = index * CSStaticData.group_none_row_num;
}
else
{
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
if (bAnimation)
{
m_offset_index = index;
m_animation_type = CSStaticData.ANIMATION_TYPE.GENTLE_SHIFT;
}
else
{
m_pos_index += index*SCurve.m_step;
float[] pos = WiGalleryOpenGLRenderer.m_element_group.m_scurve.getPosition(m_pos_index);
moveTo(pos[0], pos[1], pos[2]);
}
}
}
}
public void startAnimation(CSStaticData.ANIMATION_TYPE type)
{
int row = 0; // 行
int col = 0; // 列
float x = 0;
float y = 0;
float z = 0;
if (isMoving())
{
return;
}
if (m_b_enter || m_type == CSStaticData.LIST_TYPE.LIST_NONE)
{
if (type == CSStaticData.ANIMATION_TYPE.LEFT_SHIFT)
{
// 左移
int n = 12;
if (m_index + n >= size() || size() <= n)
return;
int num_frame = 20;
row = n % CSStaticData.group_none_row_num; // 行
col = n / CSStaticData.group_none_row_num; // 列
x = Math.abs(CSStaticData.x_list_pos_offset * col);
y = Math.abs(CSStaticData.y_list_pos_offset * row);
z = Math.abs(CSStaticData.z_list_pos_offset * col);
m_index += n;
float[] steps = {x/num_frame, y/num_frame, z/num_frame};
float[] final_Angle = {0, m_angle, 0};
int col_offset = m_index / CSStaticData.group_none_row_num;
for (int i = 0; i < m_list.size(); i++)
{
row = i % CSStaticData.group_none_row_num; // 行
col = i / CSStaticData.group_none_row_num - col_offset; // 列
x = (float) (CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * col);
y = (float) (CSStaticData.y_list_pos_start + CSStaticData.y_list_pos_offset * row);
z = (float) (CSStaticData.z_list_pos_start + CSStaticData.z_list_pos_offset * col);
float[] final_pos = {x,y,z};
Element elem = m_list.get(i);
if (elem != null)
{
elem.startAnimation(type, num_frame, steps, final_pos, final_Angle);
}
}
}
else if (type == CSStaticData.ANIMATION_TYPE.RIGHT_SHIFT)
{
// 右移
int n = 12;
if (m_index <= 0)
{
refresh(0);
return;
}
int num_frame = 20;
row = n % CSStaticData.group_none_row_num; // 行
col = n / CSStaticData.group_none_row_num; // 列
x = Math.abs(CSStaticData.x_list_pos_offset * col);
y = Math.abs(CSStaticData.y_list_pos_offset * row);
z = Math.abs(CSStaticData.z_list_pos_offset * col);
m_index -= n;
if (m_index <= 0)
{
m_index = 0;
}
float[] steps = {x/num_frame, y/num_frame, z/num_frame};
float[] final_Angle = {0, m_angle, 0};
int col_offset = m_index / CSStaticData.group_none_row_num;
for (int i = 0; i < m_list.size(); i++)
{
row = i % CSStaticData.group_none_row_num; // 行
col = i / CSStaticData.group_none_row_num - col_offset; // 列
x = (float) (CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * col);
y = (float) (CSStaticData.y_list_pos_start + CSStaticData.y_list_pos_offset * row);
z = (float) (CSStaticData.z_list_pos_start + CSStaticData.z_list_pos_offset * col);
float[] final_pos = {x,y,z};
Element elem = m_list.get(i);
if (elem != null)
{
elem.startAnimation(type, num_frame, steps, final_pos, final_Angle);
}
}
}
else if (type == CSStaticData.ANIMATION_TYPE.NONEGROUP_OPENING)
{
//開啟Nongroup
// 初始化位置
int n = 18;// m_list.size();
int last_col = n/CSStaticData.group_none_row_num;
if (WiGalleryOpenGLRenderer.m_b_horizontal_screen)
{
// 横屏
m_angle = 20.0f - 75;
}
else
{
// 竖屏
m_angle = 30.0f - 75;
}
for (int i = 0; i < n; i++)
{
if (i > size()-1)
continue;
Element elem = m_list.get(i);
if (elem != null)
{
row = i % CSStaticData.group_none_row_num; // 行
col = i / CSStaticData.group_none_row_num - last_col; // 列
x = (float) (CSStaticData.x_list_pos_start + CSStaticData.x_list_pos_offset * col / 5);
y = (float) (CSStaticData.y_list_pos_start + CSStaticData.y_list_pos_offset * row);
z = (float) (CSStaticData.z_list_pos_start + CSStaticData.z_list_pos_offset * col / 5);
elem.moveTo(x, y, z);
elem.setAngleTo(0, m_angle, 0);
}
}
// 开始动画
m_nongroup_animation_step[0] = CSStaticData.x_list_pos_offset/5;
m_nongroup_animation_step[1] = 0;
m_nongroup_animation_step[2] = CSStaticData.z_list_pos_offset/5;
m_nongroup_animation_frame_num = 0;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONEGROUP_OPENING;
}
else if(type == CSStaticData.ANIMATION_TYPE.NONEGROUP_CLOSING)
{
//关闭Nongroup
m_nongroup_animation_step[0] = -CSStaticData.x_list_pos_offset * 2/5.0f;
m_nongroup_animation_step[1] = 0;
m_nongroup_animation_step[2] = -CSStaticData.z_list_pos_offset * 2/5.0f;
m_nongroup_animation_frame_num = 0;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONEGROUP_CLOSING;
}
else
{
//~!
}
}
else
{
if (m_type == CSStaticData.LIST_TYPE.LIST_DATE)
{
m_animation_type = type;
}
else
{
//~!
}
}
}
private void loadFileTexture(int start, int end)
{
int min = start > 0 ? start : 0;
int max = end > size() ? size() : end;
for (int i = min; i < max; i++)
{
Element elem = getIndex(i);
if (elem != null)
{
if (!elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_data_manager.setRequestLoadFileList(elem);
}
}
}
}
private void drawGroupNone(GL10 gl, MEDIA_VIEW view)
{
if (size() <= 0)
return;
int num = 12;
int start = m_index - num;
int end = m_index + num * 2;
if (m_animation_type == CSStaticData.ANIMATION_TYPE.NONEGROUP_OPENING)
{
// 打开NoneGroup
//int move_num = ((m_list.size()-1)/CSStaticData.group_none_row_num + 2);
int move_num = 18/CSStaticData.group_none_row_num;
int start1 = m_index+17;
int end1 = m_index-CSStaticData.group_none_row_num;
//for (int i = start1; i >= end1; i--)
for (int i = end1; i <= start1; i++)
{
if (i < 0 || i > size()-1)
continue;
int colIndex = i / CSStaticData.group_none_row_num;
Element elem = getIndex(i);
if (elem != null)
{
if (i >= start && i < end)
{
if (!elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_data_manager.setRequestLoadFileList(elem);
}
elem.SetViewSide(view);
elem.onDraw(gl, true);
}
else
{
if (elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
}
elem.SetViewSide(view);
elem.onDraw(gl, false);
}
}
}
}
else if(m_animation_type == CSStaticData.ANIMATION_TYPE.NONEGROUP_CLOSING)
{
// 关闭NoneGroup
// 18 表示最多移动18个元素
int start1 = m_index+17;
int end1 = m_index - CSStaticData.group_none_row_num ;
//for (int i = start1; i >= end1; i--)
for (int i = end1; i <= start1; i++)
{
if (i < 0 || i > size()-1)
continue;
Element elem = getIndex(i);
if (elem != null)
{
if (i >= start && i < end)
{
if (!elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_data_manager.setRequestLoadFileList(elem);
}
elem.SetViewSide(view);
elem.onDraw(gl, true);
}
else
{
if (elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
}
elem.SetViewSide(view);
elem.onDraw(gl, true);
}
}
}
}
else
{
// 无动画
//for (int i = size()-1; i >= 0; i--)
for (int i = 0; i <= size()-1; i++)
{
Element elem = getIndex(i);
if (elem != null)
{
if (i >= start && i < end)
{
if (!elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_data_manager.setRequestLoadFileList(elem);
}
elem.SetViewSide(view);
elem.onDraw(gl, true);
}
else
{
if (elem.m_is_load_texture)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
}
elem.SetViewSide(view);
elem.onDraw(gl, false);
}
}
}
}
}
public int getFavoriteNum()
{
int num = 0;
for (int i = 0; i < m_list.size(); i++)
{
Element elem = m_list.get(i);
if (elem != null && elem.bFavorite())
{
num++;
}
}
return num;
}
}