4

フルスクリーンの FrameLayout 内に小さな ImageView があり、FrameLayout に触れると imageview がその位置に移動するように設定したいと思います。

ImageView の移動について見つけることができる他のすべての SO の質問を読みましたが、ソリューションがまだ機能していない理由はわかりません。

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は動揺しません(常にフレーム)。

また、画面に触れたときにこのメソッドが呼び出され、params が適切な 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をターゲットにしようとしていることに言及する必要があったため、ハニカムビューの向きの利点を使用できません:(

4

4 に答える 4

3

試行錯誤と検索の結果、私はこの電話に出られなかったことがわかりました。

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

当初、重力はちょうど-1だったので、マージンのベースとなるはずの側がわからなかったため、マージンは効果がありませんでした。重力を追加すると、固定する側が与えられ、マージンの量だけ移動できるようになります。

今は完璧に動作します。

于 2012-05-11T02:56:19.270 に答える
1

上と左のパディングを設定したいと思います。私ができるよりもよく説明している次の質問を参照してください。ビューのパディングとマージンの違い

于 2012-05-10T08:10:01.330 に答える
1

私はそれを考えます:

iv.setLayoutParams(params);

それ自体であるivのレイアウトにパラメータを設定するだけFrameLayoutです。

ImageViewの位置を設定できる場合がありますiv.setX()iv.setY();

于 2012-05-10T08:15:28.210 に答える
0

私はティムの解決策を見つけました:

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

ビューのマージンを変更するには、Android レベル 10 以下のデバイスで実行する場合にのみ必要になりました!

レベル 14 または 17 では問題は発生しませんでした。

上記のコードを追加すると、すべてのAndroidレベルで望ましい動作が得られました...ティムに感謝します。

于 2013-04-24T10:37:15.090 に答える