そのため、ユーザーが指でドラッグできるようにするカスタムビューウィジェットがあります。RelativeLayout を含む FrameLayout (コードはこちら: http://blog.gorges.us/2010/06/android-two-dimensional-scrollview/ ) に基づくカスタム スクロール ビューにドラッグして、配置できるようにします。必要な場所に配置し、画面に表示されていない十分なスペースを確保して、アイテムを配置することもできます。
私がしたいのは、ユーザーがウィジェットを可視スクロール領域の端近くに移動している場合、ユーザーが手放すまで領域を適切な方向にスクロールすることです (ACTION_UP、この場合、それ以上のイベントは発生しません)または端から離れました。現在、コードには 2 つの問題があります。
1) 携帯電話 (T-Mobile G2) は、Nexus 7 タブレットが移動するまでトリガーし続けないため、指がまだどこにある場合でも ACTION_MOVE をトリガーし続けます。ACTION_UP まで、このイベントを確実にトリガーし続ける必要があります。
2) 領域がスクロールしますが、画面の端に向かって指を動かしたときだけです。言い換えれば、オブジェクトが端に近づいたときに、静止している指でオブジェクトをスクロールして移動し続けたいのですが、これは起こっていません。
私は何が欠けていますか?ウィジェットの移動を処理する onTouchEvent は次のとおりです。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE
&& this.getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true);
}
// mScrollParent gets set in a setter and points to the TwoDScrollView
// mOffsetX/Y is based on where the user touches versus the position of the custom view
// mWidth/mHeight gets set once in the GestureDetector based on the custom view's getWidth()/getHeight()
// mTitleBarHeight gets set once in the GestureDetctor onDown event
// lp is a ViewGroup.LayoutParams type
if (!mGestureDetector.onTouchEvent(event)) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
int finalX = (int) (event.getRawX() - mOffsetX);
int finalY = (int) (event.getRawY() - mOffsetY - (mTitleBarHeight > 0 ? mTitleBarHeight * 2
: 0));
if (finalX < 0 || finalY < 0)
return false;
int scrollLeft = (int) Math.ceil(mScrollParent.getScrollX() * 1.05);
int scrollTop = (int) Math.ceil(mScrollParent.getScrollY() * 1.05);
int scrollRight = (int) Math.floor((scrollLeft + mScrollParent.getRight()) * 0.95);
int scrollBottom = (int) Math.floor((scrollTop + mScrollParent.getBottom()) * 0.95);
int scrollX = 0;
int scrollY = 0;
if (scrollLeft > finalX)
scrollX = finalX - scrollLeft;
if (scrollRight < (finalX + mWidth))
scrollX = (finalX + mWidth)- scrollRight;
if (scrollTop > finalY)
scrollY = finalY - scrollTop;
if (scrollBottom < (finalY + mHeight))
scrollY = (finalY + mHeight) - scrollBottom;
if (scrollX != 0 || scrollY != 0)
mScrollParent.scrollBy(scrollX * 4, scrollY * 4);
lp.setMargins(finalX + scrollX, finalY + scrollY, 0, 0);
setLayoutParams(lp);
return true;
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
return true;
} else {
return super.onTouchEvent(event);
}
} else {
return true;
}
}