2012-05-10 14 views
4

フルスクリーンのFrameLayoutの中に小さなImageViewがあります.FrameLayoutをタッチすると画像ビューその位置に移動します。setLayoutParamsでタッチイベントでImageViewを移動しようとしたとき、imageviewが動いていない

私はImageViewを動かすことに関して私が見つけることができる他のすべての質問を読んだが、なぜ私の解決策がまだ機能していないのか分からなかった。

でframeLayoutを拡張するカスタムビューで:

@Override 
public boolean onInterceptTouchEvent(MotionEvent event){ 

    if(event.getActionMasked() == MotionEvent.ACTION_DOWN){ 
     ImageView iv = (ImageView) this.findViewById(R.id.draggedImage); 
     FrameLayout.LayoutParams params = (LayoutParams) iv.getLayoutParams(); 
     params.leftMargin = (int) event.getX(); 
     params.bottomMargin = (int) event.getY(); 
     iv.setLayoutParams(params); 
     iv.invalidate(); 
     invalidate();   
    } 
    return true; 
} 

私は(私がやるべきことこれらのかわからない)新しいタッチ位置を反映するlayoutparamsマージンを変更し、ImageViewのとでframeLayoutを無効にしましたしかし、imageViewは揺れません(フレームの左上隅に常に座っています)。

また、私が画面に触れて、真のX値とY値でパラメータが設定されているときに、このメソッドが呼び出されていることを確認しました。

マイレイアウト:

<CustomFrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <!-- some other unrelated views --> 

    <ImageView 
     android:id="@+id/draggedImage" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:src="@drawable/pause" />  

</CustomFrameLayout> 

編集: は、私はAPIレベル10をターゲットにしようとしていることに言及しているなら、私はハニカムビューの向きの良さ:(

答えて

3

試行錯誤して検索:

params.gravity = Gravity.LEFT | Gravity.BOTTOM;

最初は重力が-1だけだったので、それはどちら側を知らなかったので、余白が、効果がなかったですそれはマージンをベースにしていたはずだった。重力を加えれば、マージンの量だけ移動できるようにアンカーする側になります。

完璧に動作します。

1

のいずれかを使用することはできません私はあなたがトップと左パディングを設定したいと考えてい私ができるよりも、それは良く説明して、次の質問を参照してくださいDifference between a View's Padding and Margin

+0

パディングの変更はうまくいくと思いますが、それは私にとってはちょっと変わっています。パディングを変更して移動するには、単に画像ビューを移動するのではなく、画像ビュー全体を画面全体に塗りつぶす必要があります。これは解決策かもしれませんが、私はちょうどビューを移動したいと思っています。 – Tim

+0

償却された絶対レイアウトの代替案を見つけようとしているときに、私はたくさんの検索をしました。一般的なコンセンサスはフレームレイアウトを使用し、パディングで位置を設定することでした。もし誰かがより良い方法を持っていれば、私はそれを聞くのが大好きです。 – cstrutton

1

私が考えること:。。

iv.setLayoutParams(params); 

ただ、FrameLayoutであるiv'sレイアウトにパラメータを設定するだけです。

ImageViewの位置をiv.setX()に設定することができます。 iv.setY();私はこの呼び出しを欠けていたことがわかっ

+0

残念ながら、setXとsetYはAPI 11+でのみ使用でき、API 10(2.3)をターゲットにしようとしています – Tim

0

私はティムのソリューションが見つかりました:

params.gravity = Gravity.LEFTを|重力。ボトム;

ビューのマージンを変更するには、アンドロイドレベル10以下のデバイスで実行する必要があります。

問題は、すべてのAndroidのレベルに必要な動作を与えた上記のコードを追加レベル14または17

に表示されませんでした...あなたにティムをありがとうございます。

関連する問題