特定の位置に固定されていないAndroidでリストビューを作成することは可能ですか?ユーザーはジェスチャーでリストビューを移動できます画面上のどこにでも移動できるフローティングリストビューを見つけようとしましたが、いくつか見つかりませんでしたlink。誰かがそれについて何か考えを持っていますか?
4 に答える
これを実現するには、リストビューでOnTouchListenerを設定し、そのonTouch()メソッドをオーバーライドします。onTouch()メソッドでは、(ACTION_DOWN、ACTION_MOVE)などのタッチイベントを処理する必要があります。タッチイベントを処理する方法は次のとおりです。
@Override
public boolean onTouch (View v, MotionEvent event)
{
switch(event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
start.set(event.getX(), event.getY()); //saving the initial x and y position
mode = DRAG;
break;
case MotionEvent.ACTION_MOVE:
if(mode == DRAG) {
float scrollByX = event.getX() - start.x; //computing the scroll in X
float scrollByY = event.getY() - start.y; //computing the scroll in Y
v.scrollBy((int)scrollByX/20, 0);
}
break;
}
return false;
}
ユーザーが画面上で指を下に置くと、ACTION_DOWNイベントがトリガーされ、ユーザーが画面上で指をドラッグすると、ACTION_MOVEイベントがトリガーされます。したがって、ドラッグイベントはACTION_DOWNとACTION_MOVEの組み合わせです。
scrollXとscrollYの値を取得したら、これらの値をViewクラスのscrollBy()メソッドに渡すことで、画面上のビューを移動できます。
ここで、コードには2つの注意点があります。
- 1つ目は、scrollYの値として0を渡したということです。これにより、リストビューのドラッグとスクロールが同時に行われなくなります。
- 2つ目は、Androidにリスト項目のスクロールを処理させたいため、戻り値がfalseであるということです。
レイアウトの余白を使用してリストビューを移動します。
概要:
event.getX()
OnTouch をオーバーライドし、およびに基づいてevent.getY()
、リストビューの余白を次のように更新します。
親が相対レイアウトの場合:
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mListView.getLayoutParams();
lp.leftMargin = event.getX();
lp.topMargin = event.getY();
mListView.setLayoutParams(lp);
リストビューからのイベントが onTouch に渡されるように、dispatchTouchEvent をアクティビティに追加します。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
お役に立てれば。
Window
Android フレームワークでは、「フローティング」という言葉は通常、新しい(a など)と同義Dialog
です。最終目標が何であるかによって多少異なりますが、階層内の残りのコンテンツの上に浮かび、簡単に表示と非表示を切り替えることができる を作成したい場合は、メソッドを持つListView
内にそのビューをラップすることを検討する必要があります。PopupWindow
でウィンドウを簡単に表示しshowAsDropdown()
たりshotAtLocation()
、 で表示しながら移動したりできるようにしupdate()
ます。
Spinner
これは、SDK の新しいバージョンがおよびのポップアップ リストを作成する方法です。Menu
維持するのは難しいですが、AbsoluteLayoutでは (x,y) 座標で位置を指定できます。AbsoluteLayout 内で ListView を宣言し、Java コードでハンドルを取得してクリックをインターセプトし、新しい座標を設定するだけです。