/* * CPullWindow.cpp * * Created on: 2021年3月30日 * Author: Administrator */ #include "CPullWindow.h" #include "entry/EasyUIContext.h" #define TURN_PAGE_MIN_SPEED 0.0001 #define WFILE "CPullWindow.cpp" CPullWindow::CPullWindow() : isDownPull(false), isRegistered(false), isCanMove(false), mHasDown(false), mIsRolling(false), mCurRollSpeed(CPullWindow_ROLL_SPEED), mRollSpeed(CPullWindow_ROLL_SPEED), mBase(NULL), mStartDownTime(0){ isFuncMove = false; isTextView1GraymaskShow = false; mBaseColor = NULL; } void CPullWindow::resetPage(){ mStartDownTime = 0; mRollSpeed = CPullWindow_ROLL_SPEED; mCurRollSpeed = CPullWindow_ROLL_SPEED; isTextView1GraymaskShow = false; mIsRolling = false; mHasDown = false; mBase = NULL; isRegistered = false; isCanMove = false; isFuncMove = false; mBaseColor = NULL; } LayoutPosition CPullWindow::getPosition(){ if(mBase){ return mBase->getPosition(); }else{ return LayoutPosition(); } } /// 下拉状态栏,设置透明度 void CPullWindow::setBottomWindowColor(ZKBase* pBaseColor){ if(pBaseColor){ mBaseColor = pBaseColor; }else if(!mBaseColor){ return; } #define TEXT_WIDTH 480 float rate_pos = \ (float)((abs(getPosition().mTop + TEXT_WIDTH))%(TEXT_WIDTH + 1))/(float)(TEXT_WIDTH); unsigned int colorBack = (unsigned int)((double)(rate_pos) * (double)(0xFF000000)) & 0xFF000000; if(WBETWEEN_PullWindow((float)((abs(getPosition().mTop + TEXT_WIDTH))%(TEXT_WIDTH + 1)),0,340)){ mBaseColor->setBackgroundColor(colorBack); } #if 0 WLOGD_lf("彩色值",WDOUBLE(0xFF000000)) LOGD("比率:%f = %f/%f\n", rate_pos, WFLOAT((WABS(UIMANAGER->mCPullWindow.getDy() + TEXT_WIDTH))%(TEXT_WIDTH + 1)), WFLOAT(TEXT_WIDTH) ); LOGD("结果:%u(%x) = (%lf * %lf) & 0xFF000000\n", colorBack, colorBack, WDOUBLE(rate_pos), WDOUBLE(0xFF000000)); LOGD("结果:%u(%x) = Dy(%d) (%d)\n", colorBack, colorBack, UIMANAGER->mCPullWindow.getDy(), (WABS(UIMANAGER->mCPullWindow.getDy() + TEXT_WIDTH)) ); #endif } void CPullWindow::onCPullWindow_init(ZKBase *pBase){ if(mBase){ setBottomWindowColor(); } if(pBase){ mBase = pBase; }else if(!mBase){ LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__); LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"setPage() error","pBase == NULL"); return; } LayoutPosition pos = mBase->getPosition(); pos.mTop = -pos.mHeight; mBase->setPosition(pos); isTextView1GraymaskShow = false; } // 移动函数 void CPullWindow::movePage(int dy){ if(!mBase){ LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__); LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"movePage() error","mBase == NULL"); return; } LayoutPosition lp = mBase->getPosition(); //LOGD("i=%d,lp.mTop = %d,dy = %d ,return\n",i,lp.mTop,dy); if (lp.mTop == dy) { return; } // 移动当前的一页 lp.mTop = dy; //LOGD("####:dy(%d)(%d,%d,%d,%d)\n",dy,lp.mLeft,lp.mTop,lp.mWidth,lp.mHeight); //上滑时,不允许下拉过多 if(!isDownPull && lp.mTop <=0) mBase->setPosition(lp); else if(isDownPull) mBase->setPosition(lp); } // 判断,是否去滑动 bool CPullWindow::needToRoll() const{ if (!mBase) { return false; } return isFuncMove || (mBase->getPosition().mTop != 0 && mBase->getPosition().mTop != -mBase->getPosition().mHeight); } void CPullWindow::setBaseUpMove(){ if (!mBase || isRunning()) { if(!mBase){ LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__); LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"setBaseDownMove() error","mBase == NULL"); } return; } isFuncMove = true; mCurRollSpeed = -mRollSpeed; run(); } void CPullWindow::setBaseDownMove(){ if (!mBase || isRunning()) { if(!mBase){ LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__); LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"setBaseDownMove() error","mBase == NULL"); } return; } isFuncMove = true; mCurRollSpeed = mRollSpeed; run(); } // 通过滑动判断左移还是右移动 bool CPullWindow::onTouchEvent(const MotionEvent &ev) { if (!mBase || mIsRolling) { return false; } switch (ev.mActionStatus) { case MotionEvent::E_ACTION_DOWN: if ((mBase->getPosition().mTop == -mBase->getPosition().mHeight && WBETWEEN_PullWindow(ev.mY,CPullWindow_Pull_Top,CPullWindow_Pull_High)) || !mBase->getPosition().mTop) { mDownPoint.x = ev.mX; mDownPoint.y = ev.mY; mHasDown = true; isCanMove = false; mStartDownTime = clock(); if((mBase->getPosition().mTop == -mBase->getPosition().mHeight && WBETWEEN_PullWindow(ev.mY,CPullWindow_Pull_Top,CPullWindow_Pull_High))){ isDownPull = true; // LOGD_LINE("可能准备下拉") }else if(!mBase->getPosition().mTop){ // LOGD_LINE("可能准备上滑") isDownPull = false; }else{ // LOGD_LINE("无法滑动状态栏") mHasDown = false; } }else{ // LOGD_LINE("无法滑动状态栏") mHasDown = false; } break; case MotionEvent::E_ACTION_MOVE: { if (!mHasDown) { return false; }else if(!isCanMove && ((!isDownPull && ev.mY - mDownPoint.y < -20) || (isDownPull && ev.mY - mDownPoint.y > 20))){ isCanMove = true; //LOGD("####:差值(%d),滑动(%d),downPoint(%d)\n",abs(ev.mY - mDownPoint.y),ev.mY,mDownPoint.y); mDownPoint.x = ev.mX; mDownPoint.y = ev.mY; // UIMANAGER->setStatusBarMove(false); // LOGD_s("准备下拉栏") return isCanMove; }else if(!isCanMove){ //LOGD("差值(%d),滑动(%d),downPoint(%d)\n",abs(ev.mY - mDownPoint.y),ev.mY,mDownPoint.y); return isCanMove; } //LOGD("****:PullDownWindow:滑动\n"); int dy = ev.mY - mDownPoint.y; //LOGD("dy(%d)\n",dy); if(isDownPull) movePage(-mBase->getPosition().mHeight + dy); else movePage(dy); // 用于计算滑动速度 mVelocityTracker.addMovement(ev); setBottomWindowColor(); break; } case MotionEvent::E_ACTION_UP: case MotionEvent::E_ACTION_CANCEL: { // 抬手判断 向左滑动还是向右滑动 if (!mHasDown || !isCanMove) { mHasDown = false; return false; } mUpPoint.x = ev.mX; mUpPoint.y = ev.mY; mHasDown = false; isCanMove = false; float speed = mVelocityTracker.getYVelocity(); // 获取y移动速度 //LOGD("滑速(%f)\n",speed); //下滑 if (isDownPull && ((mUpPoint.y - mDownPoint.y > mBase->getPosition().mHeight / 3) || (speed > TURN_PAGE_MIN_SPEED))) { mCurRollSpeed = mRollSpeed; //LOGD("####下滑:滑速(%d)\n",mCurRollSpeed); //上滑 } else if (!isDownPull && ((mUpPoint.y - mDownPoint.y < -mBase->getPosition().mHeight / 3) || (speed < -TURN_PAGE_MIN_SPEED))) { mCurRollSpeed = -mRollSpeed; //LOGD("####上滑:滑速(%d)\n",mCurRollSpeed); //回滚 } else { //向下 mCurRollSpeed = isDownPull ? -mRollSpeed : mRollSpeed; //LOGD("####回滚:滑速(%d)\n",mCurRollSpeed); } mVelocityTracker.reset(); if (needToRoll()) { // 可以运行就启动计时器 //LOGD("启动定时器,speed(%f),downY(%d),upY(%d)\n",speed,mDownPoint.y,mUpPoint.y); mIsRolling = true; if(!isRunning()){ run(); } isTextView1GraymaskShow = true; } break; } case MotionEvent::E_ACTION_NONE: default: break; } return false; } bool CPullWindow::threadLoop() { if(!mBase){ LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__); LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"threadLoop() error","mBase == NULL"); mIsRolling = false; isRegistered = false; isTextView1GraymaskShow = false; setBottomWindowColor(); return false; } LayoutPosition lp = mBase->getPosition(); int dy = lp.mTop + mCurRollSpeed; if (needToRoll()) { if (mCurRollSpeed > 0) { // 向下滚动 if(dy > 0){ // LOGD("向下滚动\n"); dy = 0; isFuncMove = false; } } else { // 向上滚动 if(dy < -mBase->getPosition().mHeight){// 回滚 // LOGD("向上滚动\n"); dy = -mBase->getPosition().mHeight; isFuncMove = false; // UIMANAGER->setStatusBarMove(true); } } movePage(dy); } if (!needToRoll()) { movePage(dy); LayoutPosition lp1 = mBase->getPosition(); mBase->setPosition(lp1); mIsRolling = false; isTextView1GraymaskShow = false; setBottomWindowColor(); isRegistered = false; return false; } sleep(10); setBottomWindowColor(); return true; }