package com.wistron.WiGallery; import java.util.Timer; import Utilities.CSStaticData; import android.content.Context; import android.opengl.GLSurfaceView; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.ScaleGestureDetector.OnScaleGestureListener; import android.view.SurfaceHolder; import android.view.ViewConfiguration; public class WiGalleryOpenGLView extends GLSurfaceView implements OnGestureListener, OnScaleGestureListener { enum moveStatus { eGently, eShift, eNone }; public Timer timer = null; private static final String TAG = "WiGalleryOpenGLView"; private WiGalleryOpenGLRenderer render = null; private GestureDetector m_gesture = null; private ScaleGestureDetector m_scale_gesture = null; private float xDistanceOnScroll = 0; //整个滑动过程中,x轴向滑过的距离 private float yDistanceOnScroll = 0; //整个滑动过程中,y轴向滑过的距离 private float touchTurn = 0; private float touchTurnUp = 0; private float xDownPos = -1; private float yDownPos = -1; private float xpos = -1; private float ypos = -1; private static float xLongPressStart = -1; private static float yLongPressStart = -1; private static float xLongPressEnd = -1; private static float yLongPressEnd = -1; private moveStatus m_is_gently_move = moveStatus.eNone; private boolean m_allow_scroll = false; private boolean m_have_catcher = false; //开始处理事件 private float ratio = 95; private boolean underMoving = false; //用于判断当前的各个子事件是否属于一个滑动事件 public WiGalleryOpenGLView(Context context) { super(context); render = new WiGalleryOpenGLRenderer(context); m_gesture = new GestureDetector(this); m_scale_gesture = new ScaleGestureDetector(context, this); m_gesture.setIsLongpressEnabled(true); setEGLConfigChooser(8, 8, 8, 8, 16, 4); // stencil //setEGLConfigChooser(true); setRenderer(render); // if(ViewConfiguration.getLongPressTimeout() > CSStaticData.g_long_press_timeout) // { // timer = new Timer(); // } } /** * 瑩攫岈璃揭燴 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } /** * 获取页面数量 * @return */ public int getPageCount(){ return 0; } /** * 获取当前页码 * @return */ public int getCurrentPage(){ return 0; } /** * 获取文件数量 * @return */ public int getFileCount() { return 0; } /** * 上翻一页 * @return */ public int previousPage(){ WiGalleryOpenGLRenderer.m_element_group.startAnimation(CSStaticData.ANIMATION_TYPE.RIGHT_SHIFT); if (WiGalleryInterface.m_onGLMoveListener != null) { int curIndex = WiGalleryOpenGLRenderer.m_element_group.getCurIndex(); int totalIndex = WiGalleryOpenGLRenderer.m_element_group.getTotalIndex(); WiGalleryInterface.m_onGLMoveListener.setScrollBar(curIndex, totalIndex); } return 0; } /** * 下翻一页 * @return */ public int nextPage(){ WiGalleryOpenGLRenderer.m_element_group.startAnimation(CSStaticData.ANIMATION_TYPE.LEFT_SHIFT); if (WiGalleryInterface.m_onGLMoveListener != null) { int curIndex = WiGalleryOpenGLRenderer.m_element_group.getCurIndex(); int totalIndex = WiGalleryOpenGLRenderer.m_element_group.getTotalIndex(); WiGalleryInterface.m_onGLMoveListener.setScrollBar(curIndex, totalIndex); } return 0; } public int getSelectCount(){ return -1; } /** * 删除已选中的文件 */ public void deleteItem(){ } /** * 设置景深偏移,在现有景深的基础上加减 * @param offset */ public void setDepthOffset(float offset){ } /** * GLSurfaceView是否已准备完毕 * @return */ public boolean isSurfaceReady(){ return render.m_is_surface_ready; } /** * 返回画布是否正在卷动 * @return */ public boolean isScrolling(){ return false; } /** * 终止GLSurfaceView,退出程序 */ public void terminateSurface(){ System.exit(0); getRender().m_data_manager.DeleteAll(); } /** * 选中单元 * @param event 单元位置 */ public void selectedItem(int x, int y){ } /** * 设置选择模式 * @param isSelectable */ public void setState(boolean isSelectable){ } /** * 获取是否处于选择模式 */ public boolean getState(){ return false; } /** * 获取2D、3D模式 */ public boolean getDimension(){ return render.getDimension(); } /** * 设置2D、3D模式 */ public void setDimension(boolean is3D) { render.setDimension(is3D); } /** * 获取render */ public WiGalleryOpenGLRenderer getRender(){ return render; } //手势处理 @Override public boolean onTouchEvent(MotionEvent event) { if (getRender().m_element_group == null || !getRender().m_element_group.m_is_drawing ) return true; if (!getRender().m_element_group.m_b_restore) return true; getRender().m_element_group.m_b_flip = true; m_scale_gesture.onTouchEvent(event); if(m_have_catcher == false) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: m_have_catcher = true; break; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: return false; } } else { switch (event.getAction()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: m_have_catcher = false; break; } } if(event.getAction() != MotionEvent.ACTION_CANCEL) { if(ViewConfiguration.getLongPressTimeout() > CSStaticData.g_long_press_timeout) { //调用自定义onLongPress if(event.getAction() == MotionEvent.ACTION_DOWN) { if(xLongPressStart == -1 && yLongPressStart == -1) { m_allow_scroll = false; xLongPressStart = event.getX(); yLongPressStart = event.getY(); // timer.schedule(new TimerTask() // { // @Override // public void run() // { // //对于触发轻易的LongPress来说 // //这个自定义的onLongPress和@Override onLongPress没有区别 // //可以不纠结 // if((xLongPressEnd <= xLongPressStart + 10 && xLongPressEnd >= xLongPressStart - 10) // && // (yLongPressEnd <= yLongPressStart + 10 && yLongPressEnd >= yLongPressStart - 10) // ){ // onLongPress(); // } // xLongPressStart = -1; // yLongPressStart = -1; // } // }, CSStaticData.g_long_press_timeout); } } xLongPressEnd = event.getX(); yLongPressEnd = event.getY(); } if(event.getAction() == MotionEvent.ACTION_UP) { onUp(event); } if(m_allow_scroll) { m_is_gently_move = moveStatus.eGently; float offset = (event.getX() - xpos) / ratio; xpos = event.getX(); //~! } } return m_gesture.onTouchEvent(event); } public void onLongPress() { // ELEM_STATUS status = WiGalleryOpenGLRenderer.m_element_group.getChoosedMode(); // if (status == ELEM_STATUS.NORMAL_STATUS) // WiGalleryOpenGLRenderer.m_element_group.setChoosedMode(ELEM_STATUS.SELECTED_STATUS); // else // WiGalleryOpenGLRenderer.m_element_group.setChoosedMode(ELEM_STATUS.NORMAL_STATUS); } public void onLongPress(MotionEvent e) { if(WiGalleryOpenGLRenderer.m_element_group != null && WiGalleryOpenGLRenderer.m_element_group.getTotalIndex() >= 0){ ELEM_STATUS status = WiGalleryOpenGLRenderer.m_element_group.getChoosedMode(); if (status == ELEM_STATUS.NORMAL_STATUS){ WiGalleryOpenGLRenderer.m_element_group.setChoosedMode(ELEM_STATUS.SELECTED_STATUS); } else { WiGalleryOpenGLRenderer.m_element_group.setChoosedMode(ELEM_STATUS.NORMAL_STATUS); } } } /** * 点到屏幕时 */ @Override public boolean onDown(MotionEvent event) { if(CSStaticData.DEBUG){ Log.w(TAG, "[onDown]"); } xDownPos = event.getX(); yDownPos = event.getY(); xpos = xDownPos; ypos = yDownPos; xDistanceOnScroll = xpos; yDistanceOnScroll = ypos; return true; } /** * 离开 * @param event * @return */ public boolean onUp(MotionEvent event){ if(CSStaticData.DEBUG){ Log.w(TAG, "[onUp]"); } xDistanceOnScroll = event.getX() - xDistanceOnScroll; yDistanceOnScroll = event.getY() - yDistanceOnScroll; if(getRender() != null && getRender().m_element_group != null && underMoving ){ if(CSStaticData.DEBUG){ Log.w(TAG, "[onUp]此次滑动事件滑过的距离向量: " + xDistanceOnScroll + ", " + yDistanceOnScroll); } getRender().m_element_group.moveFinished(xDistanceOnScroll); } underMoving = false; getRender().m_element_group.m_b_flip = false; return false; } /** * 滑动 * @param eventStart 滑动起点时的MotionEvent * @param eventEnd 滑动终点时的MotionEvent * @param distanceX 滑动的X轴速度 * @param distanceY 滑动的Y轴速度 * @detail * |<------|------|------|------|------|------>| * -inf -2000 -50 0 50 2000 inf * (高速) (低速) (点 击) (低速) (高速) */ @Override public boolean onFling(MotionEvent eventStart, MotionEvent eventEnd, float velocityX, float velocityY) { boolean state = false; if(getRender() != null && getRender().m_element_group != null){ if (getRender().m_element_group.isMoving()) return true; } if(CSStaticData.DEBUG){ Log.w(TAG, "[onFling]滑动速度: " + velocityX); } underMoving = false; if (getRender().getCurrentDisplayedList() != null){//文件模式 if(velocityX > CSStaticData.g_fling_speed_threshold){ previousPage(); state = true; } if(velocityX < -CSStaticData.g_fling_speed_threshold){ nextPage(); state = true; } }else{//文件夹模式 if(velocityX > CSStaticData.g_fling_speed_threshold - 500){ previousPage(); state = true; } if(velocityX < -CSStaticData.g_fling_speed_threshold + 500){ nextPage(); state = true; } } if(getRender().m_element_group != null && ( getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_1 || getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_2 || getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_3 || getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_4 ) ){ if(Math.abs(velocityX) > 700 || Math.abs(velocityY) > 700){ getRender().m_element_group.isSphereTouching(false); state |= getRender().m_element_group.onSphereFlingEvent(velocityX, velocityY); } } return state; } /** * 滑动 * @param eventStart 滑动起点时的MotionEvent * @param eventEnd 滑动终点时的MotionEvent * @param distanceX 滑动的X轴距离 * @param distanceY 滑动的Y轴距离 */ @Override public boolean onScroll(MotionEvent eventStart, MotionEvent eventEnd, float distanceX, float distanceY) { if(CSStaticData.DEBUG){ Log.w(TAG, "[onScroll]"); } if(getRender() != null && WiGalleryOpenGLRenderer.m_element_group != null){ if (getRender().m_element_group.isMoving()) return false; } underMoving = true; if(getRender() != null && getRender().m_element_group != null){ if(eventEnd.getAction() == MotionEvent.ACTION_MOVE){ getRender().m_element_group.isSphereTouching(true); } getRender().m_element_group.moving(-distanceX); getRender().m_element_group.onSphereTouchEvent(distanceX, distanceY); } return false; } //点击屏幕 @Override public void onShowPress(MotionEvent event) { if(CSStaticData.DEBUG){ Log.w(TAG, "[onShowPress]"); } } //触击(单击)屏幕 @Override public boolean onSingleTapUp(MotionEvent event) { if(CSStaticData.DEBUG){ Log.w(TAG, "[onSingleTapUp]"); } if(getRender() != null && getRender().m_element_group != null){ return WiGalleryOpenGLRenderer.m_element_group.onTouchEvent(event.getX(), event.getY()); } return false; } @Override public boolean onScale(ScaleGestureDetector detector) { if(CSStaticData.DEBUG){ Log.w(TAG, "[onScale]"); } if(getRender() != null && getRender().m_element_group != null && (getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_1 || getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_2 || getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_3 || getRender().m_element_group.getType() == CSStaticData.LIST_TYPE.LIST_LOCATION_4 )){ getRender().m_element_group.onScale(detector.getScaleFactor()); return true; } return false; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { // TODO Auto-generated method stub if(CSStaticData.DEBUG){ Log.w(TAG, "[onScaleBegin]"); } return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { // TODO Auto-generated method stub if(CSStaticData.DEBUG){ Log.w(TAG, "[onScaleEnd]"); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // TODO Auto-generated method stub super.surfaceChanged(holder, format, w, h); CSStaticData.g_is_surface_alive = true; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub super.surfaceCreated(holder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { if(CSStaticData.DEBUG){ Log.w(TAG, "[surfaceDestroyed]GLThread.surfaceDestroyed"); } CSStaticData.g_is_surface_alive = false; CSStaticData.g_surface_changed_called = false; if(CSStaticData.gStatusInfo == null){ CSStaticData.gStatusInfo = new StatusInfo(); } CSStaticData.gStatusInfo.saveGL(); super.surfaceDestroyed(holder); if(WiGalleryOpenGLRenderer.mAsyncFileProvider != null){ WiGalleryOpenGLRenderer.mAsyncFileProvider.stopImageLoadService(); WiGalleryOpenGLRenderer.mAsyncFileProvider.stopVideoLoadService(); } if(WiGalleryOpenGLRenderer.m_element_group != null){ WiGalleryOpenGLRenderer.m_element_group.clear(); } if(WiGalleryOpenGLRenderer.m_data_manager != null){ WiGalleryOpenGLRenderer.m_data_manager.ReleaseAllTexture(); WiGalleryOpenGLRenderer.m_data_manager.DelAllBitmap(); WiGalleryOpenGLRenderer.m_data_manager.destoryDataManager(); } } @Override protected void onDetachedFromWindow() { // TODO Auto-generated method stub CSStaticData.g_is_surface_alive = false; super.onDetachedFromWindow(); } }