2011-12-14 12 views
3

私は直線レイアウトでビューを持っています。ビューが長く押されると、この線形レイアウトからビューが削除され、画面の同じ位置に相対レイアウトに配置されます。このようにして、私の指で画面上のビューを移動することができます。ビューが削除されたときにontouchイベントを維持して追加します

それはほとんど動作します: 私はlongpressイベントが働いています(ビューを削除し、ビューをrelativelayoutに配置します)。その後私はontoucheventlistenerを追加して、私のビューは、の2番目ののためだけに残っています。 toucheventが最後に発砲されたとき、私は "MotionEvent.ACTION_CANCEL"を得ました。私は私の指を削除し、再び私の動きで機能することができるビューに私の指を置く、それは私が私の指を削除するまで保持されます。

私の問題は、その時点で「MotionEvent.ACTION_CANCEL」が表示されているということですが、未処理のイベントがまだ残っています。それで、私はまだ約1秒間ontoucheventsになったのです。 (これは単なる考えです)。

誰かが私はontoucheventを保つことができますか、または私の指を置き換えることなくontoucheventを放つことができますか?

編集

私の考えは正しくありません。私が長いプレゼンテーションをするとき、ビューは私の指で留まりますが、どの方向にも50から100ピクセル移動するとすぐにビューが失われます。

編集2

moveViewはコルスの

private void moveView(View v) { 
     _relativeLayout.addView(v); 
     v.setOnTouchListener(new OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       switch(event.getAction()) { 
       case MotionEvent.ACTION_MOVE: 
        int x = (int) event.getRawX(); 
        int y = (int) event.getRawY();       
        v.layout(x, y, x + v.getWidth(), y + v.getHeight()); 
        break; 
       case MotionEvent.ACTION_UP: 
        _relativeLayout.removeView(v); 
        v = null; 
        break; 
       case MotionEvent.ACTION_CANCEL: 
        //it comes here when i move my finger more then 100 pixels 
        break; 
       } 
       return true; 
      } 
     }); 
    } 

longpressによって呼び出される

view.setOnLongClickListener(new OnLongClickListener() { 
    public boolean onLongClick(View v) { 
     _linearLayout.removeView(v); 
     moveView(v); 
     return true; 
    } 
}); 

のLinearLayout内部ビューのlongpressコード、これは要部であります元のコードではなく、コードの一部です

+1

より良いデザインのようなサウンドはレイアウトを切り替えることではなく、両方ともRelativeLayoutで動作させるようにすることです。 – zode64

+0

true、画面に横向きと上向きのスクロールなどの複雑なやりとりがあるため、多分あなたは正しいです。 – Doomic

+0

これは明らかではありません。ビューはスクロールコンテナ内にあります。ビューを移動できるとすぐに、ビューはこのスクロールコンテナから画面の他の部分にも移動する必要があります。 – Doomic

答えて

0

Experience - Android Drag and Drop Listポストをご覧ください。 a source codeもあります。これはあなたが得ようとしているものに非常に似ています。その投稿の著者であるEricは、別の一時的なImageViewを使用して、ドラッグビュー画像を保持します(getDrawingCache()で撮影)。彼はまた、元のリスト項目をsetVisibility(View.INVISIBLE)で隠します。

DragNDropプロジェクト(上のリンク)では、DragNDrop.javaのの呼び出しをdrag(x,y)で置き換えて、すべての方向にドラッグを表示できます。

+0

私は、このエリックはコンテナにtoucheventを持っており、xとyを使って彼は移動すべきビューを見つける。多分それは助けることができる..私はtommorowを確認します – Doomic

+0

私はそれが働いている。私はrelativelayoutを拡張し、onintercepttoucheventをオーバーライドするクラスを持っています。その関数では、線形レイアウトにその位置(xとy)のビューがあるかどうかをチェックします。そうでなければ、傍受を失います。それ以外の場合は、次の50サイクルのxとyが遠くに移動しないかどうかを確認してください。 50サイクル後、toucheventの所有権を取り、線図からビューを削除して相対レイアウトに配置します。relativelayoutに触れている間はビューを再描画してください。ありがとうございます – Doomic

0

私はコードを見ることができないので、MotionEvent.ACTION_CANCELは、親レイアウトが切り替えられ、ビューが再描画されているので、いくつかの可能性を投げているだけです。

onTouchEventをオーバーライドして、ACTION_CANCELイベントが送信された時点で、新しいレイアウトで同等のビューを取得して操作することができますが、まだ改善のアイデアは再設計してすべてが行われることです同じレイアウト。

+0

これは私が欲しいものですが、それを働かせることはできません...しかし、praetorianドロイドのideeは私を助けるかもしれません。 – Doomic

関連する問題