2011-06-21 12 views
8

Androidノートパッドのサンプルコードからエディタコードを実装しました。今度は、垂直方向に飛ばす機能を追加して、テキスト行をスクロールしたいと考えています。私が達成したいのは、Andoridのオプション行の飛ばしスクロールです。Androidのテキスト行の垂直スクロールスクロール

私は、スクロールとフリングの例についてはグーグルではありますが、私は必要なものを見つけることができません。私は、私がやろうとしていることに遠く離れたものを見つけませんでした。

答えて

12

私は血液、汗、涙で私の質問への答えを開発しました。私はそれが他の誰かを助けることを望んでここに掲示します。次のメソッドは、AndroidノートパッドのサンプルコードからLinedEditTextクラス内に配置されます。

============================

public void InitScroller(Context context) { 
     mScroller = new Scroller(context);  // Get a scroller object 
     mScrollY = 0 ;       // Set beginning of program as top of screen. 
     mMinScroll = getLineHeight()/2;   // Set minimum scroll distance 
     mFlingV = 750;       // Minimum fling velocity 

    } 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 

    if (mVelocityTracker == null) {      // If we do not have velocity tracker 
     mVelocityTracker = VelocityTracker.obtain(); // then get one 
    } 
    mVelocityTracker.addMovement(event);    // add this movement to it 

    final int action = event.getAction(); // Get action type 
    final float y = event.getY();   // Get the displacement for the action 

    switch (action) { 

    case MotionEvent.ACTION_DOWN:   // User has touched screen 
     if (!mScroller.isFinished()) {  // If scrolling, then stop now 
      mScroller.abortAnimation(); 
     } 
     mLastMotionY = y;     // Save start (or end) of motion 
     mScrollY = this.getScrollY();    // Save where we ended up 
     mText.setCursorVisible (true); 
     didMove = false; 

     break; 

    case MotionEvent.ACTION_MOVE:   // The user finger is on the move 
     didMove = true; 
     final int deltaY = (int) (mLastMotionY - y); // Calculate distance moved since last report 
     mLastMotionY = y;        // Save the start of this motion 

     if (deltaY < 0) {        // If user is moving finger up screen 
      if (mScrollY > 0) {      // and we are not at top of text 
       int m = mScrollY - mMinScroll;   // Do not go beyond top of text 
       if (m < 0){ 
        m = mScrollY; 
       }else m = mMinScroll; 

       scrollBy(0, -m);       // Scroll the text up 
      } 
     } else 
      if (deltaY > 0) {       // The user finger is moving up 
       int max = getLineCount() * getLineHeight() - sHeight; // Set max up value 
       if (mScrollY < max-mMinScroll){ 
        scrollBy(0, mMinScroll);   // Scroll up 
       } 
      } 
     postInvalidate(); 
     break; 

    case MotionEvent.ACTION_UP:      // User finger lifted up 
     final VelocityTracker velocityTracker = mVelocityTracker;  // Find out how fast the finger was moving 
     velocityTracker.computeCurrentVelocity(mFlingV);   
     int velocityY = (int) velocityTracker.getYVelocity(); 

     if (Math.abs(velocityY) > mFlingV){        // if the velocity exceeds threshold 
      int maxY = getLineCount() * getLineHeight() - sHeight;  // calculate maximum Y movement 
      mScroller.fling(0, mScrollY, 0, -velocityY, 0, 0, 0, maxY); // Do the filng 
     }else{ 
      if (mVelocityTracker != null) {        // If the velocity less than threshold 
       mVelocityTracker.recycle();        // recycle the tracker 
       mVelocityTracker = null; 
      } 
     } 
     break; 
    } 

    mScrollY = this.getScrollY();    // Save where we ended up 

    return true ;         // Tell caller we handled the move event 
} 



public void computeScroll() {     // Called while flinging to execute a fling step 
    if (mScroller.computeScrollOffset()) {  
     mScrollY = mScroller.getCurrY();  // Get where we should scroll to 
     scrollTo(0, mScrollY);     // and do it 
     postInvalidate();      // the redraw the sreem 
    } 
} 
+1

最後のメソッドcomputerScroll()は、その前に@Overrideが必要です。ここに掲載されているソフトウェアは、そこにいることに対処する方法を知っていました。 – Xarph

+1

sHeight、デバイス画面の高さを確認してください。 – Mani

0

これは基本的に同じである単純なバージョンでありますスコラーレベルでそれは完璧ではありませんが、それを見る別の方法を提供します。

final TextView textview = ((TextView) VIEW.findViewById(R.id.text)); 
final Scroller scroller = new Scroller(CONTEXT); 

textview.setText(TEXT); 
textview.setMovementMethod(new ScrollingMovementMethod()); 
textview.setScroller(scroller); 
textview.setOnTouchListener(new View.OnTouchListener() { 

    // Could make this a field member on your activity 
    GestureDetector gesture = new GestureDetector(CONTEXT, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      scroller.fling(0, textview.getScrollY(), 0, (int)-velocityY, 0, 0, 0, (textview.getLineCount() * textview.getLineHeight())); 
      return super.onFling(e1, e2, velocityX, velocityY); 
     } 

    }); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     gesture.onTouchEvent(event); 
     return false; 
    } 
}); 
関連する問題