| 66 |
66 |
private int mScreenWidth, mScreenHeight, mScreenMin;
|
| 67 |
67 |
|
| 68 |
68 |
private float mRotAngle, mInitDistance;
|
| 69 |
|
private int mPtrID1, mPtrID2;
|
| 70 |
|
private float mX, mY;
|
| 71 |
69 |
private float mStartRotX, mStartRotY;
|
| 72 |
70 |
private float mAxisX, mAxisY;
|
| 73 |
71 |
private float mRotationFactor;
|
| ... | ... | |
| 80 |
78 |
private int mFirstIndex, mLastIndex;
|
| 81 |
79 |
private int mDensity;
|
| 82 |
80 |
|
|
81 |
private int mPointer1, mPointer2;
|
|
82 |
private float mX1, mY1, mX2, mY2, mX, mY;
|
|
83 |
|
| 83 |
84 |
private static final Static4D mQuat= new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
|
| 84 |
85 |
private static final Static4D mTemp= new Static4D(0,0,0,1);
|
| 85 |
86 |
|
| ... | ... | |
| 350 |
351 |
|
| 351 |
352 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 352 |
353 |
|
| 353 |
|
private void drag(MotionEvent event, float x, float y)
|
|
354 |
private void drag(float x, float y)
|
| 354 |
355 |
{
|
| 355 |
|
if( mPtrID1!=INVALID_POINTER_ID && mPtrID2!=INVALID_POINTER_ID)
|
|
356 |
if( mPointer1!=INVALID_POINTER_ID && mPointer2!=INVALID_POINTER_ID)
|
| 356 |
357 |
{
|
| 357 |
|
int pointer = event.findPointerIndex(mPtrID2);
|
| 358 |
|
float pX,pY;
|
| 359 |
|
|
| 360 |
|
try
|
| 361 |
|
{
|
| 362 |
|
pX = event.getX(pointer);
|
| 363 |
|
pY = event.getY(pointer);
|
| 364 |
|
}
|
| 365 |
|
catch(IllegalArgumentException ex)
|
| 366 |
|
{
|
| 367 |
|
mPtrID1=INVALID_POINTER_ID;
|
| 368 |
|
mPtrID2=INVALID_POINTER_ID;
|
| 369 |
|
|
| 370 |
|
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
|
| 371 |
|
crashlytics.setCustomKey("DragError", "pointer="+pointer );
|
| 372 |
|
crashlytics.recordException(ex);
|
| 373 |
|
|
| 374 |
|
return;
|
| 375 |
|
}
|
| 376 |
|
|
| 377 |
|
float x2 = (pX - mScreenWidth*0.5f)/mScreenMin;
|
| 378 |
|
float y2 = (mScreenHeight*0.5f -pY)/mScreenMin;
|
|
358 |
float x2 = (mX2 - mScreenWidth*0.5f)/mScreenMin;
|
|
359 |
float y2 = (mScreenHeight*0.5f - mY2)/mScreenMin;
|
| 379 |
360 |
|
| 380 |
361 |
float angleNow = getAngle(x,y,x2,y2);
|
| 381 |
362 |
float angleDiff = angleNow-mRotAngle;
|
| ... | ... | |
| 509 |
490 |
|
| 510 |
491 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 511 |
492 |
|
| 512 |
|
private void actionMove(MotionEvent event)
|
|
493 |
void initialize()
|
| 513 |
494 |
{
|
| 514 |
|
int pointer = event.findPointerIndex(mPtrID1 != INVALID_POINTER_ID ? mPtrID1:mPtrID2);
|
| 515 |
|
|
| 516 |
|
if( pointer<0 ) return;
|
| 517 |
|
|
| 518 |
|
float pX = event.getX(pointer);
|
| 519 |
|
float pY = event.getY(pointer);
|
| 520 |
|
|
| 521 |
|
float x = (pX - mScreenWidth*0.5f)/mScreenMin;
|
| 522 |
|
float y = (mScreenHeight*0.5f -pY)/mScreenMin;
|
| 523 |
|
|
| 524 |
|
if( mBeginningRotation )
|
| 525 |
|
{
|
| 526 |
|
if( retFingerDragDistanceInInches(mX,mY,x,y) > ROTATION_SENSITIVITY )
|
| 527 |
|
{
|
| 528 |
|
beginRotation(x,y);
|
| 529 |
|
}
|
| 530 |
|
}
|
| 531 |
|
else if( mContinuingRotation )
|
| 532 |
|
{
|
| 533 |
|
continueRotation(x,y);
|
| 534 |
|
}
|
| 535 |
|
else if( mDragging )
|
| 536 |
|
{
|
| 537 |
|
drag(event,x,y);
|
| 538 |
|
}
|
| 539 |
|
else
|
| 540 |
|
{
|
| 541 |
|
setUpDragOrRotate(false,x,y);
|
| 542 |
|
}
|
|
495 |
mPointer1 = INVALID_POINTER_ID;
|
|
496 |
mPointer2 = INVALID_POINTER_ID;
|
| 543 |
497 |
}
|
| 544 |
498 |
|
| 545 |
499 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 546 |
500 |
|
| 547 |
|
private void actionDown(MotionEvent event)
|
|
501 |
private void prepareDown(MotionEvent event)
|
| 548 |
502 |
{
|
| 549 |
|
mPtrID1 = event.getPointerId(0);
|
| 550 |
|
|
| 551 |
|
float x = event.getX();
|
| 552 |
|
float y = event.getY();
|
| 553 |
|
|
| 554 |
|
mX = (x - mScreenWidth*0.5f)/mScreenMin;
|
| 555 |
|
mY = (mScreenHeight*0.5f -y)/mScreenMin;
|
| 556 |
|
|
| 557 |
|
setUpDragOrRotate(true,mX,mY);
|
|
503 |
mPointer1 = event.getPointerId(0);
|
|
504 |
mX1 = event.getX();
|
|
505 |
mY1 = event.getY();
|
|
506 |
mPointer2 = INVALID_POINTER_ID;
|
| 558 |
507 |
}
|
| 559 |
508 |
|
| 560 |
509 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 561 |
510 |
|
| 562 |
|
private void actionUp(MotionEvent event)
|
|
511 |
private void prepareMove(MotionEvent event)
|
| 563 |
512 |
{
|
| 564 |
|
mPtrID1 = INVALID_POINTER_ID;
|
| 565 |
|
mPtrID2 = INVALID_POINTER_ID;
|
|
513 |
int index1 = event.findPointerIndex(mPointer1);
|
| 566 |
514 |
|
| 567 |
|
if( mContinuingRotation )
|
|
515 |
if( index1>=0 )
|
| 568 |
516 |
{
|
| 569 |
|
finishRotation();
|
|
517 |
mX1 = event.getX(index1);
|
|
518 |
mY1 = event.getY(index1);
|
| 570 |
519 |
}
|
| 571 |
520 |
|
| 572 |
|
if( mLastCubitColor>=0 )
|
|
521 |
int index2 = event.findPointerIndex(mPointer2);
|
|
522 |
|
|
523 |
if( index2>=0 )
|
| 573 |
524 |
{
|
| 574 |
|
mPreRender.setTextureMap( mLastCubit, mLastCubitFace, mLastCubitColor );
|
| 575 |
|
mLastCubitColor = -1;
|
|
525 |
mX2 = event.getX(index2);
|
|
526 |
mY2 = event.getY(index2);
|
| 576 |
527 |
}
|
| 577 |
528 |
}
|
| 578 |
529 |
|
| 579 |
530 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 580 |
531 |
|
| 581 |
|
private void actionDown2(MotionEvent event)
|
|
532 |
private void prepareUp()
|
| 582 |
533 |
{
|
| 583 |
|
int index = event.getActionIndex();
|
| 584 |
|
|
| 585 |
|
if( mPtrID1==INVALID_POINTER_ID )
|
| 586 |
|
{
|
| 587 |
|
mPtrID1 = event.getPointerId(index);
|
| 588 |
|
float x = event.getX();
|
| 589 |
|
float y = event.getY();
|
| 590 |
|
|
| 591 |
|
if( mPtrID2 != INVALID_POINTER_ID )
|
| 592 |
|
{
|
| 593 |
|
int pointer = event.findPointerIndex(mPtrID2);
|
| 594 |
|
|
| 595 |
|
try
|
| 596 |
|
{
|
| 597 |
|
float x2 = event.getX(pointer);
|
| 598 |
|
float y2 = event.getY(pointer);
|
| 599 |
|
|
| 600 |
|
mRotAngle = getAngle(x,-y,x2,-y2);
|
| 601 |
|
mInitDistance = -1;
|
| 602 |
|
}
|
| 603 |
|
catch(IllegalArgumentException ex)
|
| 604 |
|
{
|
| 605 |
|
mPtrID1=INVALID_POINTER_ID;
|
| 606 |
|
mPtrID2=INVALID_POINTER_ID;
|
| 607 |
|
|
| 608 |
|
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
|
| 609 |
|
crashlytics.setCustomKey("DragError", "pointer="+pointer );
|
| 610 |
|
crashlytics.recordException(ex);
|
| 611 |
|
|
| 612 |
|
return;
|
| 613 |
|
}
|
| 614 |
|
}
|
| 615 |
|
|
| 616 |
|
mX = (x - mScreenWidth*0.5f)/mScreenMin;
|
| 617 |
|
mY = (mScreenHeight*0.5f -y)/mScreenMin;
|
| 618 |
|
}
|
| 619 |
|
else if( mPtrID2==INVALID_POINTER_ID )
|
| 620 |
|
{
|
| 621 |
|
mPtrID2 = event.getPointerId(index);
|
| 622 |
|
|
| 623 |
|
float x = event.getX();
|
| 624 |
|
float y = event.getY();
|
| 625 |
|
|
| 626 |
|
if( mPtrID2 != INVALID_POINTER_ID )
|
| 627 |
|
{
|
| 628 |
|
int pointer = event.findPointerIndex(mPtrID2);
|
| 629 |
|
|
| 630 |
|
try
|
| 631 |
|
{
|
| 632 |
|
float x2 = event.getX(pointer);
|
| 633 |
|
float y2 = event.getY(pointer);
|
| 634 |
|
|
| 635 |
|
mRotAngle = getAngle(x,-y,x2,-y2);
|
| 636 |
|
mInitDistance = -1;
|
| 637 |
|
}
|
| 638 |
|
catch(IllegalArgumentException ex)
|
| 639 |
|
{
|
| 640 |
|
mPtrID1=INVALID_POINTER_ID;
|
| 641 |
|
mPtrID2=INVALID_POINTER_ID;
|
| 642 |
|
|
| 643 |
|
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
|
| 644 |
|
crashlytics.setCustomKey("DragError", "pointer="+pointer );
|
| 645 |
|
crashlytics.recordException(ex);
|
| 646 |
|
|
| 647 |
|
return;
|
| 648 |
|
}
|
| 649 |
|
}
|
| 650 |
|
|
| 651 |
|
if( mBeginningRotation || mContinuingRotation )
|
| 652 |
|
{
|
| 653 |
|
mX = (x - mScreenWidth*0.5f)/mScreenMin;
|
| 654 |
|
mY = (mScreenHeight*0.5f -y)/mScreenMin;
|
| 655 |
|
}
|
| 656 |
|
}
|
| 657 |
|
|
| 658 |
|
if( mBeginningRotation )
|
| 659 |
|
{
|
| 660 |
|
mContinuingRotation = false;
|
| 661 |
|
mBeginningRotation = false;
|
| 662 |
|
mDragging = true;
|
| 663 |
|
}
|
| 664 |
|
else if( mContinuingRotation )
|
| 665 |
|
{
|
| 666 |
|
finishRotation();
|
| 667 |
|
}
|
|
534 |
mPointer1 = INVALID_POINTER_ID;
|
|
535 |
mPointer2 = INVALID_POINTER_ID;
|
| 668 |
536 |
}
|
| 669 |
537 |
|
| 670 |
538 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 671 |
539 |
|
| 672 |
|
private void actionUp2(MotionEvent event)
|
|
540 |
private void prepareDown2(MotionEvent event)
|
| 673 |
541 |
{
|
| 674 |
542 |
int index = event.getActionIndex();
|
| 675 |
543 |
|
| 676 |
|
if( index==event.findPointerIndex(mPtrID1) )
|
|
544 |
if( mPointer1==INVALID_POINTER_ID )
|
| 677 |
545 |
{
|
| 678 |
|
mPtrID1 = INVALID_POINTER_ID;
|
| 679 |
|
int pointer = event.findPointerIndex(mPtrID2);
|
| 680 |
|
|
| 681 |
|
if( pointer>=0 )
|
| 682 |
|
{
|
| 683 |
|
float x1 = event.getX(pointer);
|
| 684 |
|
float y1 = event.getY(pointer);
|
| 685 |
|
|
| 686 |
|
mX = (x1 - mScreenWidth*0.5f)/mScreenMin;
|
| 687 |
|
mY = (mScreenHeight*0.5f -y1)/mScreenMin;
|
| 688 |
|
}
|
|
546 |
mPointer1 = event.getPointerId(index);
|
|
547 |
mX1 = event.getX(index);
|
|
548 |
mY1 = event.getY(index);
|
| 689 |
549 |
}
|
| 690 |
|
else if( index==event.findPointerIndex(mPtrID2) )
|
|
550 |
else if( mPointer2==INVALID_POINTER_ID )
|
| 691 |
551 |
{
|
| 692 |
|
mPtrID2 = INVALID_POINTER_ID;
|
|
552 |
mPointer2 = event.getPointerId(index);
|
|
553 |
mX2 = event.getX(index);
|
|
554 |
mY2 = event.getY(index);
|
| 693 |
555 |
}
|
| 694 |
556 |
}
|
| 695 |
557 |
|
| 696 |
558 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 697 |
559 |
|
| 698 |
|
void initialize()
|
|
560 |
private void prepareUp2(MotionEvent event)
|
| 699 |
561 |
{
|
| 700 |
|
mPtrID1 = INVALID_POINTER_ID;
|
| 701 |
|
mPtrID2 = INVALID_POINTER_ID;
|
|
562 |
int index = event.getActionIndex();
|
|
563 |
|
|
564 |
if( index==event.findPointerIndex(mPointer1) ) mPointer1 = INVALID_POINTER_ID;
|
|
565 |
else if( index==event.findPointerIndex(mPointer2) ) mPointer2 = INVALID_POINTER_ID;
|
| 702 |
566 |
}
|
| 703 |
567 |
|
| 704 |
568 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 757 |
621 |
}
|
| 758 |
622 |
}
|
| 759 |
623 |
|
|
624 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
625 |
|
|
626 |
public void actionMove(int p1, float x1, float y1, int p2, float x2, float y2)
|
|
627 |
{
|
|
628 |
float pX = p1 != INVALID_POINTER_ID ? x1 : x2;
|
|
629 |
float pY = p1 != INVALID_POINTER_ID ? y1 : y2;
|
|
630 |
|
|
631 |
float x = (pX - mScreenWidth*0.5f)/mScreenMin;
|
|
632 |
float y = (mScreenHeight*0.5f -pY)/mScreenMin;
|
|
633 |
|
|
634 |
if( mBeginningRotation )
|
|
635 |
{
|
|
636 |
if( retFingerDragDistanceInInches(mX,mY,x,y) > ROTATION_SENSITIVITY )
|
|
637 |
{
|
|
638 |
beginRotation(x,y);
|
|
639 |
}
|
|
640 |
}
|
|
641 |
else if( mContinuingRotation )
|
|
642 |
{
|
|
643 |
continueRotation(x,y);
|
|
644 |
}
|
|
645 |
else if( mDragging )
|
|
646 |
{
|
|
647 |
drag(x,y);
|
|
648 |
}
|
|
649 |
else
|
|
650 |
{
|
|
651 |
setUpDragOrRotate(false,x,y);
|
|
652 |
}
|
|
653 |
}
|
|
654 |
|
|
655 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
656 |
|
|
657 |
public void actionDown(float x1, float y1)
|
|
658 |
{
|
|
659 |
mX = (x1 - mScreenWidth*0.5f)/mScreenMin;
|
|
660 |
mY = (mScreenHeight*0.5f - y1)/mScreenMin;
|
|
661 |
|
|
662 |
setUpDragOrRotate(true,mX,mY);
|
|
663 |
}
|
|
664 |
|
|
665 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
666 |
|
|
667 |
public void actionUp()
|
|
668 |
{
|
|
669 |
if( mContinuingRotation )
|
|
670 |
{
|
|
671 |
finishRotation();
|
|
672 |
}
|
|
673 |
|
|
674 |
if( mLastCubitColor>=0 )
|
|
675 |
{
|
|
676 |
mPreRender.setTextureMap( mLastCubit, mLastCubitFace, mLastCubitColor );
|
|
677 |
mLastCubitColor = -1;
|
|
678 |
}
|
|
679 |
}
|
|
680 |
|
|
681 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
682 |
|
|
683 |
public void actionDown2(float x1, float y1, float x2, float y2)
|
|
684 |
{
|
|
685 |
mRotAngle = getAngle(x1,-y1, x2,-y2);
|
|
686 |
mInitDistance = -1;
|
|
687 |
|
|
688 |
mX = (x1 - mScreenWidth*0.5f )/mScreenMin;
|
|
689 |
mY = (mScreenHeight*0.5f - y1)/mScreenMin;
|
|
690 |
|
|
691 |
if( mBeginningRotation )
|
|
692 |
{
|
|
693 |
mContinuingRotation = false;
|
|
694 |
mBeginningRotation = false;
|
|
695 |
mDragging = true;
|
|
696 |
}
|
|
697 |
else if( mContinuingRotation )
|
|
698 |
{
|
|
699 |
finishRotation();
|
|
700 |
}
|
|
701 |
}
|
|
702 |
|
|
703 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
704 |
|
|
705 |
public void actionUp2(int p1, float x1, float y1, int p2, float x2, float y2)
|
|
706 |
{
|
|
707 |
if( p1==INVALID_POINTER_ID )
|
|
708 |
{
|
|
709 |
mX = (x2 - mScreenWidth*0.5f)/mScreenMin;
|
|
710 |
mY = (mScreenHeight*0.5f - y2)/mScreenMin;
|
|
711 |
}
|
|
712 |
if( p2==INVALID_POINTER_ID )
|
|
713 |
{
|
|
714 |
mX = (x1 - mScreenWidth*0.5f)/mScreenMin;
|
|
715 |
mY = (mScreenHeight*0.5f - y1)/mScreenMin;
|
|
716 |
}
|
|
717 |
}
|
|
718 |
|
| 760 |
719 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 761 |
720 |
|
| 762 |
721 |
@Override
|
| ... | ... | |
| 766 |
725 |
|
| 767 |
726 |
switch(action)
|
| 768 |
727 |
{
|
| 769 |
|
case MotionEvent.ACTION_DOWN : actionDown(event) ; break;
|
| 770 |
|
case MotionEvent.ACTION_MOVE : actionMove(event) ; break;
|
| 771 |
|
case MotionEvent.ACTION_UP : actionUp(event) ; break;
|
| 772 |
|
case MotionEvent.ACTION_POINTER_DOWN: actionDown2(event); break;
|
| 773 |
|
case MotionEvent.ACTION_POINTER_UP : actionUp2(event) ; break;
|
|
728 |
case MotionEvent.ACTION_DOWN : prepareDown(event);
|
|
729 |
actionDown(mX1, mY1);
|
|
730 |
break;
|
|
731 |
case MotionEvent.ACTION_MOVE : prepareMove(event);
|
|
732 |
actionMove(mPointer1, mX1, mY1, mPointer2, mX2, mY2);
|
|
733 |
break;
|
|
734 |
case MotionEvent.ACTION_UP : prepareUp();
|
|
735 |
actionUp();
|
|
736 |
break;
|
|
737 |
case MotionEvent.ACTION_POINTER_DOWN: prepareDown2(event);
|
|
738 |
actionDown2(mX1, mY1, mX2, mY2);
|
|
739 |
break;
|
|
740 |
case MotionEvent.ACTION_POINTER_UP : prepareUp2(event);
|
|
741 |
actionUp2(mPointer1, mX1, mY1, mPointer2, mX2, mY2);
|
|
742 |
break;
|
| 774 |
743 |
}
|
| 775 |
744 |
|
| 776 |
745 |
return true;
|
Simplify RubikSurfaceView and the touchscreen control.