全体を検索しましたが、解決策が見つかりませんでした。
スクロールビュー内にビュー(myViewと呼びます)があります。myViewは画面よりも大きいです。myView内の指の相対的なx、y位置を取得できるので、指が特定の上下のしきい値に達したときに、scrollViewを上下に自動スクロールさせたいと思います。ドラッグ位置を画面位置に変換するというアイデアがいくつかありますが、これではこの問題は解決しませんでした。
前もって感謝します
乾杯
全体を検索しましたが、解決策が見つかりませんでした。
スクロールビュー内にビュー(myViewと呼びます)があります。myViewは画面よりも大きいです。myView内の指の相対的なx、y位置を取得できるので、指が特定の上下のしきい値に達したときに、scrollViewを上下に自動スクロールさせたいと思います。ドラッグ位置を画面位置に変換するというアイデアがいくつかありますが、これではこの問題は解決しませんでした。
前もって感謝します
乾杯
大丈夫、私は自分でそれを理解しました。
まず、ScrollView クラスを拡張し、インターフェイス OnScrollViewListener を追加する必要がありました。
public class MyScrollView extends ScrollView {
private OnScrollViewListener mListener;
public MyScrollView(Context c, AttributeSet attrs) {
super(c, attrs);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mListener != null) {
mListener.onScrollChanged((OnScrollViewListener) this);
}
}
public void setOnScrollViewListener(OnScrollViewListener listener) {
mListener = listener;
}
public static interface OnScrollViewListener {
public void onScrollChanged(OnScrollViewListener listener);
}
}
次に、Activity に、ユーザーがスクロールするピクセルの量を示すメンバー mScrollDistance を挿入しました。
public class ScrollActivity extends Activity {
private int mScrollDistance;
@Override
protected void OnCreate(...) {
...
final MyScrollView myScrollView = (MyScrollView) findViewById(R.id.scroll_view);
myScrollView.setOnScrollViewListener(new MyScrollView.OnScrollViewListener() {
public void onScrollChanged(OnScrollViewListener listener) {
mScrollDistance = listener.getScrollY();
}
}
// making an drag and drop in an view that is inside the MyScrollView
final LinearLayout myLayout = (LinearLayout)findViewById(R.id.linear_layout);
myLayout.setOnDragListener(new View.OnDragListener() {
public boolean onDrag (View v, DragEvent event) {
int action = event.getAction();
switch(action) {
case DragEvent.ACTION_DRAG_STARTED: {
}
case DragEvent.ACTION_DRAG_LOCATION: {
int y = Math.round(event.getY());
int translatedY = y - mScrollDistance;
int threshold = 50;
// make a scrolling up due the y has passed the threshold
if (translatedY < threshold) {
// make a scroll up by 30 px
myScrollView.scrollBy(0, -30);
}
// make a autoscrolling down due y has passed the 500 px border
if (translatedY + threshold > 500) {
// make a scroll down by 30 px
myScrollView.scrollBy(0, 30);
}
// listen for more actions here
// ...
}
}
}
}
これで、mScrollDistance は常に新しい値を取得し、ドラッグ位置がビューの位置に変換されます。これをテストしたところ、画面サイズよりも大きいレイアウト/ビューで動作します。
それが役立つことを願っています。
In C# でタイマーを使用しました
ScrollCalendar ScrollCalendar = new ScrollCalendar (yourScrollView);
ドラッグイベント内
public bool OnDrag (View v, DragEvent e)
{
var dragshadow = new EventDateDragShadow (v);
switch (e.Action) {
case DragAction.Started:
return true;
case DragAction.Entered:
break;
case Android.Views.DragAction.Location:
if (e.GetY () < 90) {
ScrollCalendar.StartScroll (-15);
} else if (e.GetY () > yourScrollView.Height - 90) {
ScrollCalendar.StartScroll (15);
} else
ScrollCalendar.StopScroll ();
return (true);
case DragAction.Exited:
return true;
case DragAction.Drop:
return true;
case DragAction.Ended:
ScrollCalendar.StopScroll ();
v.SetOnDragListener (null);
return true;
}
return true;
}
ScrollCalendar クラス
public class ScrollCalendar
{
private ScrollView Calendar;
private System.Timers.Timer Timer;
private int ScrollDistance;
public ScrollCalendar(ScrollView calendar)
{
Calendar = calendar;
Timer = new System.Timers.Timer();
Timer.Elapsed+=new ElapsedEventHandler(Scroll);
Timer.Interval = 50;
}
public void StartScroll(int scrollDistance)
{
if (Timer.Enabled) {
return;
}
ScrollDistance = scrollDistance;
Timer.Enabled = true;
}
public void StopScroll()
{
Timer.Enabled = false;
}
private void Scroll(object source, ElapsedEventArgs e)
{
Calendar.SmoothScrollBy (0, ScrollDistance);
}
}
StartScroll 値と Timer.Interval を変更して、スクロールの速度を調整します。