Растущий вид и MotionEvent.getX()/MotionEvent.getRawX()

У меня есть следующий код, чтобы иметь возможность расширить плитку. Однако у меня есть несколько таких плиток, и мне нужно, чтобы код был универсальным для каждого из них.

Пользовательский интерфейс при загрузке: http://s14.postimage.org/9wn8b2my9/Screenshot_2012_09_14_12_03_14.png

У меня есть два варианта работы:

Первое - использовать необработанные значения X,Y, означающие точное положение моего пальца на экране. Таким образом, я могу довольно легко вычислить точную ширину, высоту и расстояние до нескольких точек. Одна проблема заключается в том, что это значение не работает для всех плиток. Например, плитка в левом верхнем углу не будет расширяться, а плитка в левом нижнем углу будет расширяться до уровня, превышающего необходимый уровень. Единственная плитка, которая на самом деле кажется слушающей, это та, что посередине.

else if(event.getAction() == MotionEvent.ACTION_MOVE) {         
        if((newPos.x > this.leftParent.getX()) && (newPos.x < this.rightParent.getX())){
            //reposition the touch indicator
            this.child.setX(newPos.x-42); //-42 because pic = 84dp
            this.child.setVisibility(VISIBLE);
        }
        if((newPos.y < this.bottomParent.getY()) && (newPos.y > this.topParent.getY())){
            this.child.setY(newPos.y-42);
            this.child.setVisibility(VISIBLE);
        }

        if((this.rightParent.getX() - newPos.x) < this.originalSize.x){
            // X too narrow
            this.leftParent.setX((float) (this.rightParent.getX()-this.originalSize.x));
            Log.e("loc", "X TOO NARROW");
        } else if((this.rightParent.getX() - newPos.x) > this.rightParent.getX()-this.originalSize.x*1.6){
            // X too wide
            Log.e("loc", "X TOO WIDE newPos: "+newPos.x+", "+newPos.y+" new width:"+(this.rightParent.getX() - newPos.x)+ " old width:"+(this.rightParent.getX()-this.originalSize.x*1.6));
        } else if(((this.rightParent.getX() - newPos.x) > this.originalSize.x) && ((this.rightParent.getX() - newPos.x) < this.rightParent.getX()-this.originalSize.x*1.6)){ 
            // X inbetween required values
            elasticPosition.x = (int) Math.pow(Math.E, -newPos.x);
            this.leftParent.setX(newPos.x);
            Log.e("loc", "X OK");
        }

        if((this.bottomParent.getY() - newPos.y) < this.originalSize.y){
            // Y too narrow
            this.topParent.setY(this.bottomParent.getY()-this.originalSize.y);
            Log.e("loc", "Y TOO NARROW");
        } else if((this.bottomParent.getY() - newPos.y) > this.bottomParent.getY()-this.originalSize.y*1.6){
            // Y too wide
            Log.e("loc", "Y TOO WIDE");
        } else if(((this.bottomParent.getY() - newPos.y) > this.originalSize.y) && ((this.bottomParent.getY() - newPos.y) < this.bottomParent.getY()-this.originalSize.y*1.6)){
            // Y inbetween required values
            //elasticPosition.y = (int) Math.pow(Math.E, -newPos.y);        //shaving this for a rainy day
            this.topParent.setY(newPos.y);

            Log.e("loc", "Y OK");
        }

Плитка, отказывающаяся от растяжения: http://s12.postimage.org/ltunmbt7x/Screenshot_2012_09_14_12_03_31.png (регистрирует, что плитка уже выходит за ее максимальные границы)

Номер два использует значения X,Y по сравнению с расположением родительского объекта. Этот производит более простые формулы и в настоящее время сохраняет мои предпочтения. Тем не менее, поскольку плитки расширяются, значение тоже увеличивается. В верхнем левом углу плитки значения (0,0), если я пересечу этот угол, значение упадет до отрицательного значения. Однако, если я снова заключу плитку, я неожиданно получу положительную ценность, и она сделает все шатким, глючным, сбойным и многое другое.

if(event.getX() > 0 && event.getX() < this.getX() + this.getAccurateSize().x){
            //inbetween original values
            this.leftParent.setX((float) (this.rightParent.getX()-this.originalSize.x));
            Log.e("touch x", "inbetween original values");
        } else if(event.getX() < (0 - originalSize.x*0.6)){
            //too wide
            this.leftParent.setX((float) (this.rightParent.getX()-this.originalSize.x*1.6));
            Log.e("touch x", "too wide");
        } else if(event.getX() < 0 && event.getX() > (0 - originalSize.x*0.6)){
            //inbetween stretched values
            this.leftParent.setX(newPos.x);
            Log.e("touch x", "inbetween stretched values");
        }

        if(event.getY() > 0 && event.getY() < this.getY() + this.getAccurateSize().y){
            //inbetween original values
            this.topParent.setY(this.bottomParent.getY()-this.originalSize.y);
            Log.e("touch y", "inbetween original values");
        } else if(event.getY() < (0 - originalSize.y*0.6)){
            //too wide
            this.topParent.setY((float) (this.bottomParent.getY()-(this.originalSize.y*1.6)));
            Log.e("touch y", "too wide");
        } else if(event.getY() < 0 && event.getY() > (0 - originalSize.y*0.6)){
            //inbetween stretched values
            this.topParent.setY(newPos.y);
            Log.e("touch y", "inbetween stretched values");
        }

Я был бы очень рад, если бы кто-нибудь мог помочь мне исправить эту досадную ошибку, чтобы я мог продолжить разработку этого приложения. Заранее спасибо!

0 ответов

Другие вопросы по тегам