2011-10-25 9 views
4

アンドロイドでビューのドラッグを使用する方法の多くがあるようです。アンドロイドのビューの正しいドラッグを使用する方法

ただし、遅すぎるかバグがあります。

既知の解決策は、でframeLayoutを有することで、ビューは、単にそれがOnTouchListenerを使用して移動させるように、ここで説明したように、そのlayoutParamsを変更: http://www.anddev.org/novice-tutorials-f8/android-drag-and-drop-of-normal-views-not-bitmaps-t13404.html しかし、ビューが(最も右に到達ImageViewの、ある場合又は一番下の方)側では、画像が縮小します。

別の可能な解決策はここで説明するように、ドラッグコンテンツを表示するために、キャンバスを使用することです: http://www.anddev.org/basic_drag_and_drop-t3095.html しかし、私は複雑なビューのためにそれを使用するかどうかはわかりません。

ドラッグされたビューのサイズをコンテナ内のどこにあっても同じに保つことができます。

私を助けてください。

+0

@Trevorページ:拡張&任意の方法をovverrideの位置を限定しないする必要はありません: あなたは両方の世界を楽しんで解決策があると思います。ここ –

答えて

12

は、ドラッグ、単純なImageViewのための完全なソリューションですドラッグビュー?
+0

このコードを使用すると、アニメーションを繰り返し使用することはできません。レイアウトパラメータをリセットするには? – shkschneider

+1

@shkschneiderレイアウトパラメータを変更するには、私がやったことをやってください。現在のものを取得し、値を変更してから、再度setLayoutParamsを使います。とにかく、layoutParamsのアニメーションでは、私が作ったこのトリックを使うことができます:http:// stackoverflow。com/questions/19519921/how-to-animate-imageview-center-crop-to-fill-the-screen-and-versa-fac –

2

現在のプロジェクトでは、さまざまなViewRelativeLayoutに配置されており、LayoutParamsが適用されています。あなたと同じように、ViewGroupコンテナの右または下に到達するとViewsが「縮む」ことがわかりました。測定とレイアウトの段階で、Viewが突然実際に欲しいサイズよりもはるかに小さいサイズを持つ必要があるとシステムが判断しようとしていることを考えれば、これは実際には起こりそうです極端に近くに置かれたときに親にフィットすることができる。

現時点でこれを回避するために行った非常に簡単な解決策は、画面サイズに対して私のViewGroupを単にオーバーサイズすることです。

さらに、あなたはView sがあるように設定されているViewオブジェクトの余白を防ぐために、いくつかのプログラムロジックを使用すると思います。その場合には、あなたが実際にView sが部分的にオフスクリーン表示されないようにすることを決めるかもしれ親コンテナの境界から離れることを許可されています。

もう1つの解決方法は、Viewを強制的に親のものよりも大きいサイズに強制するには、onMeasure()などを上書きすることです。可能であれば、ビューをそこに希望のサイズエッジが重なる。それは私の頭の上からちょうどアイデアですが、それを調査していません。

findViewById(R.id.imageView).setOnTouchListener(new OnTouchListener() 
    { 
    int prevX,prevY; 

    @Override 
    public boolean onTouch(final View v,final MotionEvent event) 
     { 
     final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams(); 
     switch(event.getAction()) 
     { 
     case MotionEvent.ACTION_MOVE: 
      { 
      par.topMargin+=(int)event.getRawY()-prevY; 
      prevY=(int)event.getRawY(); 
      par.leftMargin+=(int)event.getRawX()-prevX; 
      prevX=(int)event.getRawX(); 
      v.setLayoutParams(par); 
      return true; 
      } 
     case MotionEvent.ACTION_UP: 
      { 
      par.topMargin+=(int)event.getRawY()-prevY; 
      par.leftMargin+=(int)event.getRawX()-prevX; 
      v.setLayoutParams(par); 
      return true; 
      } 
     case MotionEvent.ACTION_DOWN: 
      { 
      prevX=(int)event.getRawX(); 
      prevY=(int)event.getRawY(); 
      par.bottomMargin=-2*v.getHeight(); 
      par.rightMargin=-2*v.getWidth(); 
      v.setLayoutParams(par); 
      return true; 
      } 
     } 
     return false; 
     } 
    }); 
+2

私は解決策を見つけました。ドラッグするimageViewのサイズ(高さと幅に応じて)の2倍の負の値になるように、下端と右端を設定してください。それはハッキーな方法ですが、それは完全に動作します。 –

+0

垂直方向にドラッグする方法全領域ではない –

関連する問題