タッチを使用して、画面上のアイテム (textviews/imageview) の位置を変更できるようにしたいと考えています。そこで、次のような OnTouchListener を作成しました。
float x = 0,y = 0 ;
private void clickOnObjectTaker() {
cream.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean touched= false;
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
messageMaker("touched");
x= event.getX();
y= event.getY();
}
if(event.getAction()==MotionEvent.ACTION_MOVE )
{
Animation anim =
new TranslateAnimation(x, event.getX(), y, event.getY());
anim.setFillAfter(true);
anim.setFillEnabled(true);
cream.startAnimation(anim);
x= event.getX();
y= event.getY();
}
if(event.getAction()== MotionEvent.ACTION_CANCEL)
{
cream.setX(x);
cream.setY(y);
}
return true;
}});
}
私の問題は、オブジェクトの位置を変更すると、リスナーが新しい位置を取得しないため、オブジェクトが画面上の別の場所に表示されることですが、移動したい場合は古い位置をクリックする必要があります。次の行を追加することで解決できると思いました:
if(event.getAction()== MotionEvent.ACTION_CANCEL)
{
cream.setX(x);
cream.setY(y);
}
しかし、何も変わりませんでした。
更新: このコードで試しました。|レイアウトの位置要素の更新に問題はありません。タッチでオブジェクトを移動するプロセスを除いて、すべてが正常に機能します。この方法で気に入らないこと:
- 触れたものを動かすと振動する(見栄えが悪い)
- 座標をスケーリングする必要がある場所のように、オブジェクトが指に完全に追従しません (たとえば、オブジェクトを画面の右側から左側に移動し、指が画面の端で停止すると、オブジェクトは遅れます)。
この 2 つのことにより、この方法は役に立たなくなります。
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()== MotionEvent.ACTION_DOWN){
dx = event.getX()-v.getX();
dy = event.getY()-v.getY();
}
if(event.getAction()== MotionEvent.ACTION_MOVE)
{
v.setX(event.getX()-dx);
v.setY(event.getY()-dy);
}
return true;
}
}
アニメーションを使用したメソッド内での oobject の移動は、私にとって素晴らしいように見えます。すべてがスムーズに機能します。このようなコードを追加すると、レイアウトの更新にのみ問題が発生します
if(event.getAction()==MotionEvent.ACTION_UP )
{
v.setX(event.getX());
v.setY(event.getY());
}
オブジェクトをランダムな位置に配置しました (彼がこの位置をどこから取ったかはわかりません)。
編集済み
このコードはほぼ完全に、ビュー上で繰り返し移動することができました。2 つの欠点があります。
- Moveジェスチャ終了後の小さな再割り当て
- ビューの移動中に画面上で指を止めると、古い位置でビューが点滅するのがわかります。
コード
OnTouchListener dealingwithproblems = new OnTouchListener()
{
@Override
public boolean onTouch( View v, MotionEvent event) {
if(event.getActionMasked()== MotionEvent.ACTION_DOWN){
//values for
dx = event.getX()-v.getX();
dy = event.getY()-v.getY();
x= event.getX();
y= event.getY();
}
if(event.getActionMasked()== MotionEvent.ACTION_MOVE)
{
Animation anim =
new TranslateAnimation(x, event.getX() , y, event.getY());
//anim.setFillAfter(true);
anim.setFillEnabled(true);
v.startAnimation(anim);
x= event.getX();
y= event.getY();
}
if(event.getActionMasked() == MotionEvent.ACTION_UP)
{
v.setX(event.getX()-dx);
v.setY(event.getY()-dy);
}
return true;
}
};
誰かがそれを改善する方法を知っていたら、答えを残してください