2014-05-19 3 views
2

ListView를 사용하면 작업이 시작될 때 아래에서 위로 스크롤 할 수 있습니다. myListView.setStackFromBottom(true)onCreate에 설정하여이 작업을 수행 할 수 있으므로 작업이로드 될 때 목록의 맨 아래에 있습니다.Scroll ListView 아래에서 위로

그런 다음 onWindowFocusChanged을 무시하고 smoothScrollToPosition(0)을 사용하면 목록을 맨 위로 스크롤합니다. 그러나, 나는 플 롤이 어떻게 보이는지와 비슷하게, 스크롤 속도가 점차적으로 느려지도록해야합니다. 애니메이션이나 다른 방법으로이를 수행 할 수있는 방법이 있습니까?

감사합니다.

+0

왜?! 일부 목록이 자동으로 스크롤되는 것을 보았습니다. 일반적으로이 경험을 사용자로서 싫어합니다. – Booger

답변

2

CountDownTimer을 사용하여 자신의 스크롤러를 작성할 수 있습니다.

import android.content.Context; 
import android.os.CountDownTimer; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.animation.AnticipateOvershootInterpolator; 
import android.view.animation.Interpolator; 
import android.widget.ScrollView; 

public class SmoothScrollView extends ScrollView { 

    private static final long SCROLL_DURATION = 1500; //milliseconds 
    //interpolator for scroller 
    private static final Interpolator INTERPOLATOR = new AnticipateOvershootInterpolator(1); 

    private SmoothScroller smoothScroller; 


    public SmoothScrollView(Context context) { 
     this(context, null, 0); 
    } 


    public SmoothScrollView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 


    public SmoothScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setSmoothScrollingEnabled(true); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if (smoothScroller != null)//we are scrolling 
      return true; 
     else return super.onTouchEvent(ev); 
    } 

    @Override 
    public boolean executeKeyEvent(KeyEvent ev) { 
     if (smoothScroller != null)//we are scrolling 
      return true; 
     else return super.executeKeyEvent(ev); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     if (smoothScroller != null)//we are scrolling 
      return true; 
     else return super.onInterceptTouchEvent(ev); 
    } 

    public void smoothScrollTo(int scrollX, int scrollY) { 
     if (smoothScroller != null) { 
      smoothScroller.cancel(); 
     } 
     int deltaY = scrollY - getScrollY(); 
    int deltaX = scrollX - getScrollX(); 
     smoothScroller = new SmoothScroller(SCROLL_DURATION, getScrollX(), getScrollY(), deltaX, deltaY); 
     smoothScroller.start(); 
    } 

    private class SmoothScroller extends CountDownTimer { 

     private int fromX; 
     private int fromY; 
     private int deltaX; 
     private int deltaY; 
     private float scrollTime; 

     public SmoothScroller(long scrollTime, int fromX, int fromY, int deltaX, int deltaY) { 
      super(scrollTime, 1); 
      this.scrollTime = scrollTime; 
      this.fromX = fromX; 
      this.fromY = fromY; 
      this.deltaX = deltaX; 
      this.deltaY = deltaY; 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
       float delta = (scrollTime - millisUntilFinished)/scrollTime; 
       delta = INTERPOLATOR.getInterpolation(delta); 
       int x = fromX + ((int) (delta * deltaX)); 
       int y = fromY + ((int) (delta * deltaY)); 
       smoothScrollTo(x, y); 
     } 

     @Override 
     public void onFinish() { 
       float delta = 1f; 
       int x = fromX + ((int) (delta * deltaX)); 
       int y = fromY + ((int) (delta * deltaY)); 
       smoothScroller = null; 
       scrollTo(x, y); 
     } 
    } 
} 

이것은 내가 사용하는 것입니다. INTERPOLATORSCROLL_DURATION을 필요에 따라 바꿔 smoothScrollTo (scrollTo)으로 문의하십시오.

ScrollView에서 ListView으로 변경하는 것이 좋습니다.

+0

대단합니다.이 기능은 훌륭했습니다. 몇 가지 수정을해야했지만 전반적인 아이디어는 완벽하게 작동했습니다. – Nick

+0

혹시 AdapterView를 확장 한 HListView (https://github.com/sephiroth74/HorizontalVariableListView)로 작업 할 수 있습니까? – lgdroid57