123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- /*
- * 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;
- }
|