2012-01-13 3 views
0

Моя проблема в том, что я использую скроллер и рисовать холст на нем. Он будет прокручиваться плавно, но когда я рисую растровое изображение + холст, прокрутка прокрутки очень медленно означает, что тяжело прокручивать, поэтому он прокручивается очень медленно.Как прокрутить прокрутку плавно?

Как решить эту проблему?

+0

К сожалению, на ваш вопрос ответил неэтичный пользователь. Я бы посоветовал вам проверить этот вопрос: http://stackoverflow.com/questions/4951142/smooth-scrolling-in-android – Will

ответ

1

У меня нет опыта работы с OpenGL или акселерометром, но прокрутки (называемые fling в API Android) достичь нелегко. Первое, что вам нужно, когда делает такой пользовательский вид, реализует GestureDetector и вызвать его onTouchEvent() на ваш взгляд, в onTouchEvent()

GestureDetector mGD = new GestureDetector(getContext(), 
             new SimpleOnGestureListener() { 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
           float distanceX, float distanceY) { 
     // beware, it can scroll to infinity 
     scrollBy((int)distanceX, (int)distanceY); 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY) { 
     mScroller.fling(getScrollX(), getScrollY(), 
       -(int)vX, -(int)vY, 0, (int)mMaxScrollX, 0, (int)mMaxScrollY); 
     invalidate(); // don't remember if it's needed 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     if(!mScroller.isFinished()) { // is flinging 
      mScroller.forceFinished(true); // to stop flinging on touch 
     } 
     return true; // else won't work 
    } 
}); 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return mGD.onTouchEvent(event); 
} 

В то время как OnGestureListener.onScroll() звонки непосредственно View.scrollBy(), для onFling() метода вы будете нуждаться в скроллер.

Scroller - простой объект, который, как указывает ссылка, инкапсулирует прокрутку. Он может использоваться для непрерывной прокрутки или для реагирования на выбросы. Scroller.fling() начать «моделирование» в Fling прокрутки внутри себя, и смотреть его вы можете скопировать его гладкость с непрерывной перерисовки анимации:

@Override 
protected void onDraw(Canvas canvas) { 
    // ....your drawings.... 

    // scrollTo invalidates, so until animation won't finish it will be called 
    // (used after a Scroller.fling()) 
    if(mScroller.computeScrollOffset()) { 
     scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); 
    } 
} 

то есть, пока анимация не работает, вычислить точку мы достигли и прокручивать там ,

В качестве последнего примечания: не забудьте вернуть true в OnGestureListener.onDown(), даже если вы не хотите ничего делать, или он не будет работать.

И будьте осторожны, потому что Scroller в Android 2.2 имеет ошибку, для которой анимация сбрасывания фактически не заканчивается, даже если она достигает пределов, которые вы передавали в качестве аргументов (однако вычисленное смещение уважает их, поэтому оно фактически не будет перемещаться) ,

+0

Привет, Майк, спасибо за ответ. Эта концепция отлично работает, когда только холст - это рисовать bt, когда им рисовать изображение + холст (растровое изображение), он не работает должным образом bcoz его тяжелый. –

+1

Украденный здесь http://stackoverflow.com/a/4951681/1228 – Will

Смежные вопросы