4

拡張する独自のコンポーネントを作成しました。その中に、マージンで配置されているタイプRelativeLayoutのフィールドがあります。View

ここに画像の説明を入力

青いクワッドは私の親ビューを表し、赤い円は子です。

画面上で指を動かしながら、ユーザーがこの赤い円を動かせるようにしたいと思います。これは私のonTouchEvent()方法です:

@Override
public boolean onTouchEvent(MotionEvent event) {

    int eventAction = event.getAction();

    switch (eventAction) {
        case MotionEvent.ACTION_DOWN: 
            // finger touches the screen
            break;

        case MotionEvent.ACTION_MOVE:
                marginX = (int)event.getX();
                marginY = (int)event.getY();
                RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams(); // pointer is this red circle
                lp.setMargins(marginX, marginY, 0, 0);

            break;

        case MotionEvent.ACTION_UP:   
            // finger leaves the screen
            break;
    }


    return true;
}

しかし、ユーザーが画面上で指を動かしている間は位置が更新されず、ユーザーが画面から指を離したときにのみ更新されることがすぐにわかりました。基本的に、指を動かすと円は同じ位置にとどまり、動きを止めると新しい位置に円が描かれます。親ビューと子ビューの両方でメソッドを使用してみinvalidate()ましたが、役に立ちませんでした。UIスレッドと関係があるのではないかと思いますが、runOnUiThread()' method as it's not anActivity`にアクセスできません。

編集: を使用できるように、アクティビティをクラスに渡しましたrunOnUiThread()。私のcase: ACTION_MOVE今は次のようになります:

case MotionEvent.ACTION_MOVE:      
    marginX = (int)event.getX();
    marginY = (int)event.getY();

    activity.runOnUiThread(new Runnable() {
        public void run() { 
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
        lp.setMargins(marginX, marginY, 0, 0);
        pointer.invalidate();
        }
    });

break;
4

2 に答える 2

2

単純なポインタの場合は、次のように描画できCanvasますDrawable

@Override
protected void onDraw(Canvas canvas) {
    pointer.setBounds(marginX, marginY, marginX + pointerWidth, marginY + pointerHeight);
    pointer.draw(canvas);

    super.onDraw(canvas);
}

そして、メソッドinvalidate()内のポインタを呼び出します。onTouchEvent()

于 2013-01-29T11:16:09.157 に答える
2

ドラッグアンドドロップ機能が必要だと思います

http://www.vogella.com/articles/AndroidDragAndDrop/article.htmlを参照してください。

于 2013-01-29T10:19:37.187 に答える