Sanftes Scrollen in Android

Es gibt eine App auf dem Markt namens Floating Bilder. Diese App hat eine der sanftesten Scroll-Logik. Im Grunde hat die App eine leere canvas, die den gesamten Bildschirm abdeckt, und dann werden einige Bilder auf der leeren canvas angezeigt. Der Benutzer kann wischen und die App bewegt das Bild in die Wischrichtung. Plus es kinetisches Scrollen auch. Außerdem gibt es keine Bildlaufleisten, daher scheint es, als ob der Entwickler eine benutzerdefinierte Ansicht erstellt hat, die die gesamte fließende Bildlauflogik implementiert.

es wäre toll, wenn ich die Quelle davon kriegen könnte … aber jeder hat irgendeinen Pseudo-Code oder Logik, wie man diese Art von function implementiert. Alle Leads, Site-Links wären hilfreich.

Solutions Collecting From Web of "Sanftes Scrollen in Android"

Ich habe keine Erfahrung mit OpenGL noch Beschleunigungsmesser, aber Swipe (genannt Fling in Android-API) ist nicht schwer zu erreichen. Das erste, was Sie beim GestureDetector einer solchen benutzerdefinierten View benötigen, ist die Implementierung eines GestureDetector und das Aufrufen von onTouchEvent() in der onTouchEvent() Ihrer Ansicht.

 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); } 

Während OnGestureListener.onScroll() direkt View.scrollBy() onFling() benötigen Sie für die onFling() -Methode einen Scroller .

Scroller ist ein einfaches Objekt, das, wie die Referenz sagt, Scrolling kapselt. Es kann zum kontinuierlichen Scrollen oder zum Reagieren auf Flings verwendet werden. Scroller.fling () beginne eine “Simulation” von fling scroll in sich selbst, und indem du sie ansiehst, kannst du ihre Glätte mit einer fortlaufenden Neuzeichnen-Animation kopieren:

 @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()); } } 

Bis die Animation läuft, berechnen Sie den Punkt, den wir erreicht haben, und scrollen Sie dort.

Als letzte Anmerkung: OnGestureListener.onDown() Sie daran, in Ihrem OnGestureListener.onDown() den OnGestureListener.onDown() true OnGestureListener.onDown() , auch wenn Sie bei einem Down- OnGestureListener.onDown() nichts tun wollen oder es nicht funktioniert.

Seien Sie vorsichtig, denn Scroller in Android 2.2 hat einen Bug, bei dem die Fling-Animation nicht endet, selbst wenn sie die Grenzen erreicht, die Sie als Argumente übergeben haben (der berechnete Offset respektiert sie jedoch, sodass sie sich nicht bewegt).

Die Floating Images-App ist ein Open-Source-Projekt. http://code.google.com/p/floatingimage/