Растущий вид и 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");
}
Я был бы очень рад, если бы кто-нибудь мог помочь мне исправить эту досадную ошибку, чтобы я мог продолжить разработку этого приложения. Заранее спасибо!