画像に示すように、上下のボタンの下に scrollView を表示したいと思います。そして、上下の矢印スクロールバーをテーピングした後、スクロールする必要があり、上下のボタンを長押しした後、スクロールして終点まで続ける必要があります。これを実装する方法を教えてください。
前もって感謝します。
画像に示すように、上下のボタンの下に scrollView を表示したいと思います。そして、上下の矢印スクロールバーをテーピングした後、スクロールする必要があり、上下のボタンを長押しした後、スクロールして終点まで続ける必要があります。これを実装する方法を教えてください。
前もって感謝します。
ボタンのタップ イベントでScrollView .pageScroll()
orを実行します。ScrollView.smoothScrollBy()
Runnable を使用して、ScrollView.scrollBy()
長押しイベントが発生したときに呼び出しを続行します。私はあなたのためにデモを書きました。
public class TestAndroidActivity extends Activity implements OnTouchListener,
OnGestureListener {
private static final String TAG = "TestAndroid";
private Handler mHandler = new Handler();
private ScrollView mScrollView;
private Button mBtnUp;
private Button mBtnDown;
private View mCurBtn;
private GestureDetector mDetecor;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mScrollView = (ScrollView) findViewById(R.id.scroll);
mBtnUp = (Button) findViewById(R.id.btn_up);
mBtnDown = (Button) findViewById(R.id.btn_down);
mBtnUp.setOnTouchListener(this);
mBtnDown.setOnTouchListener(this);
mDetecor = new GestureDetector(this, this);
}
private long mStartTime = 0;
private float mSpeed = 0.5f;
private Runnable mScrollRunnable = new Runnable() {
@Override
public void run() {
int dy = (int) ((SystemClock.uptimeMillis() - mStartTime) * mSpeed);
mStartTime = SystemClock.uptimeMillis();
int direction = getCurrentBtnDirection();
if (direction == View.FOCUS_UP)
dy *= -1;
mScrollView.scrollBy(0, dy);
mHandler.post(this);
}
};
private int getCurrentBtnDirection() {
if (mCurBtn == mBtnUp) {
return View.FOCUS_UP;
} else if (mCurBtn == mBtnDown) {
return View.FOCUS_DOWN;
} else
return 0;
}
private void perfromPageScroll() {
int direction = getCurrentBtnDirection();
mScrollView.pageScroll(direction);
}
private void stopContinuousScroll() {
mStartTime = 0;
mHandler.removeCallbacks(mScrollRunnable);
}
private void startContinuousScroll() {
mStartTime = SystemClock.uptimeMillis();
mHandler.post(mScrollRunnable);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
mCurBtn = v;
mDetecor.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
stopContinuousScroll();
}
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
perfromPageScroll();
return true;
}
@Override
public void onLongPress(MotionEvent e) {
startContinuousScroll();
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
}
ScrollView のスクロール状態を検出してボタンを有効または無効にする場合は、CustomView を記述して ScrollView を拡張し、OnScrollChanged() メソッドをオーバーライドする必要があります。
編集:レイアウトを追加
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="1\n\n\n\n\n\n2\n\n\n\n\n\n3\n\n\n\n\n4\n\n\n\n5\n\n"
android:textSize="32sp" />
</ScrollView>
<Button
android:id="@+id/btn_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="up" />
<Button
android:id="@+id/btn_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="down" />
</RelativeLayout>
EDIT2: ListView を使用している場合は、を使用ListView.smoothScrollBy()
して置き換えることができますScrollView.scrollBy()
。ListView には pageScroll() メソッドはありません。自分で記述してください。それほど難しくありません。
EDIT3: ListView の pageScroll
private void pageScroll(ListView l) {
l.smoothScrollBy(l.getHeight(), 300);
}
トップに移動するには、メソッドを使用できます
ScrollView.fullScroll(ScrollView.FOCUS_UP)
スクロール部分の場合..基本的には機能を使用できます
ScrollView.smoothScrollTo (int x, int y)
現在のX, Y
位置を取得してgetScrollX()
からgetScrollY()
、さらにスクロールする量を追加できます。