CPullWindow.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*
  2. * CPullWindow.cpp
  3. *
  4. * Created on: 2021年3月30日
  5. * Author: Administrator
  6. */
  7. #include "CPullWindow.h"
  8. #include "entry/EasyUIContext.h"
  9. #define TURN_PAGE_MIN_SPEED 0.0001
  10. #define WFILE "CPullWindow.cpp"
  11. CPullWindow::CPullWindow() :
  12. isDownPull(false),
  13. isRegistered(false),
  14. isCanMove(false),
  15. mHasDown(false),
  16. mIsRolling(false),
  17. mCurRollSpeed(CPullWindow_ROLL_SPEED),
  18. mRollSpeed(CPullWindow_ROLL_SPEED),
  19. mBase(NULL),
  20. mStartDownTime(0){
  21. isFuncMove = false;
  22. isTextView1GraymaskShow = false;
  23. mBaseColor = NULL;
  24. }
  25. void CPullWindow::resetPage(){
  26. mStartDownTime = 0;
  27. mRollSpeed = CPullWindow_ROLL_SPEED;
  28. mCurRollSpeed = CPullWindow_ROLL_SPEED;
  29. isTextView1GraymaskShow = false;
  30. mIsRolling = false;
  31. mHasDown = false;
  32. mBase = NULL;
  33. isRegistered = false;
  34. isCanMove = false;
  35. isFuncMove = false;
  36. mBaseColor = NULL;
  37. }
  38. LayoutPosition CPullWindow::getPosition(){
  39. if(mBase){
  40. return mBase->getPosition();
  41. }else{
  42. return LayoutPosition();
  43. }
  44. }
  45. /// 下拉状态栏,设置透明度
  46. void CPullWindow::setBottomWindowColor(ZKBase* pBaseColor){
  47. if(pBaseColor){
  48. mBaseColor = pBaseColor;
  49. }else if(!mBaseColor){
  50. return;
  51. }
  52. #define TEXT_WIDTH 480
  53. float rate_pos = \
  54. (float)((abs(getPosition().mTop + TEXT_WIDTH))%(TEXT_WIDTH + 1))/(float)(TEXT_WIDTH);
  55. unsigned int colorBack = (unsigned int)((double)(rate_pos) * (double)(0xFF000000)) & 0xFF000000;
  56. if(WBETWEEN_PullWindow((float)((abs(getPosition().mTop + TEXT_WIDTH))%(TEXT_WIDTH + 1)),0,340)){
  57. mBaseColor->setBackgroundColor(colorBack);
  58. }
  59. #if 0
  60. WLOGD_lf("彩色值",WDOUBLE(0xFF000000))
  61. LOGD("比率:%f = %f/%f\n",
  62. rate_pos,
  63. WFLOAT((WABS(UIMANAGER->mCPullWindow.getDy() + TEXT_WIDTH))%(TEXT_WIDTH + 1)),
  64. WFLOAT(TEXT_WIDTH)
  65. );
  66. LOGD("结果:%u(%x) = (%lf * %lf) & 0xFF000000\n",
  67. colorBack,
  68. colorBack,
  69. WDOUBLE(rate_pos),
  70. WDOUBLE(0xFF000000));
  71. LOGD("结果:%u(%x) = Dy(%d) (%d)\n",
  72. colorBack,
  73. colorBack,
  74. UIMANAGER->mCPullWindow.getDy(),
  75. (WABS(UIMANAGER->mCPullWindow.getDy() + TEXT_WIDTH))
  76. );
  77. #endif
  78. }
  79. void CPullWindow::onCPullWindow_init(ZKBase *pBase){
  80. if(mBase){
  81. setBottomWindowColor();
  82. }
  83. if(pBase){
  84. mBase = pBase;
  85. }else if(!mBase){
  86. LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__);
  87. LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"setPage() error","pBase == NULL");
  88. return;
  89. }
  90. LayoutPosition pos = mBase->getPosition();
  91. pos.mTop = -pos.mHeight;
  92. mBase->setPosition(pos);
  93. isTextView1GraymaskShow = false;
  94. }
  95. // 移动函数
  96. void CPullWindow::movePage(int dy){
  97. if(!mBase){
  98. LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__);
  99. LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"movePage() error","mBase == NULL");
  100. return;
  101. }
  102. LayoutPosition lp = mBase->getPosition();
  103. //LOGD("i=%d,lp.mTop = %d,dy = %d ,return\n",i,lp.mTop,dy);
  104. if (lp.mTop == dy) {
  105. return;
  106. }
  107. // 移动当前的一页
  108. lp.mTop = dy;
  109. //LOGD("####:dy(%d)(%d,%d,%d,%d)\n",dy,lp.mLeft,lp.mTop,lp.mWidth,lp.mHeight);
  110. //上滑时,不允许下拉过多
  111. if(!isDownPull && lp.mTop <=0)
  112. mBase->setPosition(lp);
  113. else if(isDownPull)
  114. mBase->setPosition(lp);
  115. }
  116. // 判断,是否去滑动
  117. bool CPullWindow::needToRoll() const{
  118. if (!mBase) {
  119. return false;
  120. }
  121. return isFuncMove || (mBase->getPosition().mTop != 0 && mBase->getPosition().mTop != -mBase->getPosition().mHeight);
  122. }
  123. void CPullWindow::setBaseUpMove(){
  124. if (!mBase || isRunning()) {
  125. if(!mBase){
  126. LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__);
  127. LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"setBaseDownMove() error","mBase == NULL");
  128. }
  129. return;
  130. }
  131. isFuncMove = true;
  132. mCurRollSpeed = -mRollSpeed;
  133. run();
  134. }
  135. void CPullWindow::setBaseDownMove(){
  136. if (!mBase || isRunning()) {
  137. if(!mBase){
  138. LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__);
  139. LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"setBaseDownMove() error","mBase == NULL");
  140. }
  141. return;
  142. }
  143. isFuncMove = true;
  144. mCurRollSpeed = mRollSpeed;
  145. run();
  146. }
  147. // 通过滑动判断左移还是右移动
  148. bool CPullWindow::onTouchEvent(const MotionEvent &ev) {
  149. if (!mBase || mIsRolling) {
  150. return false;
  151. }
  152. switch (ev.mActionStatus) {
  153. case MotionEvent::E_ACTION_DOWN:
  154. if ((mBase->getPosition().mTop == -mBase->getPosition().mHeight
  155. && WBETWEEN_PullWindow(ev.mY,CPullWindow_Pull_Top,CPullWindow_Pull_High))
  156. || !mBase->getPosition().mTop) {
  157. mDownPoint.x = ev.mX;
  158. mDownPoint.y = ev.mY;
  159. mHasDown = true;
  160. isCanMove = false;
  161. mStartDownTime = clock();
  162. if((mBase->getPosition().mTop == -mBase->getPosition().mHeight
  163. && WBETWEEN_PullWindow(ev.mY,CPullWindow_Pull_Top,CPullWindow_Pull_High))){
  164. isDownPull = true;
  165. // LOGD_LINE("可能准备下拉")
  166. }else if(!mBase->getPosition().mTop){
  167. // LOGD_LINE("可能准备上滑")
  168. isDownPull = false;
  169. }else{
  170. // LOGD_LINE("无法滑动状态栏")
  171. mHasDown = false;
  172. }
  173. }else{
  174. // LOGD_LINE("无法滑动状态栏")
  175. mHasDown = false;
  176. }
  177. break;
  178. case MotionEvent::E_ACTION_MOVE: {
  179. if (!mHasDown) {
  180. return false;
  181. }else if(!isCanMove && ((!isDownPull && ev.mY - mDownPoint.y < -20) || (isDownPull && ev.mY - mDownPoint.y > 20))){
  182. isCanMove = true;
  183. //LOGD("####:差值(%d),滑动(%d),downPoint(%d)\n",abs(ev.mY - mDownPoint.y),ev.mY,mDownPoint.y);
  184. mDownPoint.x = ev.mX;
  185. mDownPoint.y = ev.mY;
  186. // UIMANAGER->setStatusBarMove(false);
  187. // LOGD_s("准备下拉栏")
  188. return isCanMove;
  189. }else if(!isCanMove){
  190. //LOGD("差值(%d),滑动(%d),downPoint(%d)\n",abs(ev.mY - mDownPoint.y),ev.mY,mDownPoint.y);
  191. return isCanMove;
  192. }
  193. //LOGD("****:PullDownWindow:滑动\n");
  194. int dy = ev.mY - mDownPoint.y;
  195. //LOGD("dy(%d)\n",dy);
  196. if(isDownPull)
  197. movePage(-mBase->getPosition().mHeight + dy);
  198. else
  199. movePage(dy);
  200. // 用于计算滑动速度
  201. mVelocityTracker.addMovement(ev);
  202. setBottomWindowColor();
  203. break;
  204. }
  205. case MotionEvent::E_ACTION_UP:
  206. case MotionEvent::E_ACTION_CANCEL: { // 抬手判断 向左滑动还是向右滑动
  207. if (!mHasDown || !isCanMove) {
  208. mHasDown = false;
  209. return false;
  210. }
  211. mUpPoint.x = ev.mX;
  212. mUpPoint.y = ev.mY;
  213. mHasDown = false;
  214. isCanMove = false;
  215. float speed = mVelocityTracker.getYVelocity(); // 获取y移动速度
  216. //LOGD("滑速(%f)\n",speed);
  217. //下滑
  218. if (isDownPull && ((mUpPoint.y - mDownPoint.y > mBase->getPosition().mHeight / 3) ||
  219. (speed > TURN_PAGE_MIN_SPEED))) {
  220. mCurRollSpeed = mRollSpeed;
  221. //LOGD("####下滑:滑速(%d)\n",mCurRollSpeed);
  222. //上滑
  223. } else if (!isDownPull && ((mUpPoint.y - mDownPoint.y < -mBase->getPosition().mHeight / 3) ||
  224. (speed < -TURN_PAGE_MIN_SPEED))) {
  225. mCurRollSpeed = -mRollSpeed;
  226. //LOGD("####上滑:滑速(%d)\n",mCurRollSpeed);
  227. //回滚
  228. } else {
  229. //向下
  230. mCurRollSpeed = isDownPull ? -mRollSpeed : mRollSpeed;
  231. //LOGD("####回滚:滑速(%d)\n",mCurRollSpeed);
  232. }
  233. mVelocityTracker.reset();
  234. if (needToRoll()) { // 可以运行就启动计时器
  235. //LOGD("启动定时器,speed(%f),downY(%d),upY(%d)\n",speed,mDownPoint.y,mUpPoint.y);
  236. mIsRolling = true;
  237. if(!isRunning()){
  238. run();
  239. }
  240. isTextView1GraymaskShow = true;
  241. }
  242. break;
  243. }
  244. case MotionEvent::E_ACTION_NONE:
  245. default:
  246. break;
  247. }
  248. return false;
  249. }
  250. bool CPullWindow::threadLoop() {
  251. if(!mBase){
  252. LOGD("\n\n\n######:%s(%d),impossible\n",WFILE,__LINE__);
  253. LOGD("****:%s(%d):%s(%s)\n",WFILE,__LINE__,"threadLoop() error","mBase == NULL");
  254. mIsRolling = false;
  255. isRegistered = false;
  256. isTextView1GraymaskShow = false;
  257. setBottomWindowColor();
  258. return false;
  259. }
  260. LayoutPosition lp = mBase->getPosition();
  261. int dy = lp.mTop + mCurRollSpeed;
  262. if (needToRoll()) {
  263. if (mCurRollSpeed > 0) { // 向下滚动
  264. if(dy > 0){
  265. // LOGD("向下滚动\n");
  266. dy = 0;
  267. isFuncMove = false;
  268. }
  269. } else { // 向上滚动
  270. if(dy < -mBase->getPosition().mHeight){// 回滚
  271. // LOGD("向上滚动\n");
  272. dy = -mBase->getPosition().mHeight;
  273. isFuncMove = false;
  274. // UIMANAGER->setStatusBarMove(true);
  275. }
  276. }
  277. movePage(dy);
  278. }
  279. if (!needToRoll()) {
  280. movePage(dy);
  281. LayoutPosition lp1 = mBase->getPosition();
  282. mBase->setPosition(lp1);
  283. mIsRolling = false;
  284. isTextView1GraymaskShow = false;
  285. setBottomWindowColor();
  286. isRegistered = false;
  287. return false;
  288. }
  289. sleep(10);
  290. setBottomWindowColor();
  291. return true;
  292. }