2016-05-11 8 views
-1

Wie würden Sie unendlich glatte horizontale Scroll von links nach rechts (und umgekehrt) implementieren?Unendliche glatte scrollX für HorizontalScrollView

HorizontalScrollView enthält nur ein TextView Element mit ziemlich langen Text innerhalb daher möchte ich diesen Text anstelle des Benutzers scrollen.

Ich fand ObjectAnimator, nur eins zu sein, um glattes Scrollen zu erreichen. Jetzt ist das Problem, es richtig zu loopen. Ich fand zwei enge Lösungen, obwohl sie nicht funktionieren wie erwartet:

  1. Verwendung CycleInterpolator(). Kann nicht glatt Verhalten erreichen:

    ObjectAnimator animRight = ObjectAnimator.ofInt(hScrollVIew, "scrollX", hScrollVIew.getRight()); animRight.setRepeatCount(ValueAnimator.INFINITE); animRight.setInterpolator(new CycleInterpolator(1f)); animRight.setDuration(4000); animRight.setStartDelay(0); animRight.start();

  2. erstellen 2 Animationen (links und rechts), die einer nach dem anderen nennen würde. Diese Lösung hat einen merkwürdigen Verzögerungseffekt nach der ersten Animation.

    final ObjectAnimator animRight = ObjectAnimator.ofInt(hScrollVIew, "scrollX", holder.hsvTitleHolder.getRight()); 
    animRight.setDuration(SCROLL_DURATION); 
    
    final ObjectAnimator animLeft = ObjectAnimator.ofInt(hScrollVIew, "scrollX", 0); 
    animLeft.setDuration(SCROLL_DURATION); 
    
    animRight.addListener(new Animator.AnimatorListener() { 
        Override 
        public void onAnimationStart(Animator animation) {} 
    
        @Override 
        public void onAnimationEnd(Animator animation) { 
         hScrollVIew.clearAnimation(); 
         animLeft.start(); 
        } 
    
        @Override 
        public void onAnimationCancel(Animator animation) {} 
    
        @Override 
        public void onAnimationRepeat(Animator animation) {} 
    }); 
    
    animLeft.addListener(new Animator.AnimatorListener() { 
        @Override 
        public void onAnimationStart(Animator animation) {} 
    
        @Override 
        public void onAnimationEnd(Animator animation) { 
         hScrollVIew.clearAnimation(); 
         animRight.start(); 
        } 
    
        @Override 
        public void onAnimationCancel(Animator animation) {} 
    
        @Override 
        public void onAnimationRepeat(Animator animation) {} 
    }); 
    
    animRight.start(); 
    

Wenn jemand ähnliches Problem konfrontiert bitte Ihre Erfahrungen teilen.

+1

siehe [diese] (http://pastebin.com/4xXMPTnq) – pskink

+0

@pskink woah! Das funktioniert wie ein Zauber! Ich danke dir sehr. Ich kämpfe seit Tagen damit. Vielleicht möchten Sie diesen Code als Antwort posten, damit ich sie als Antwort akzeptieren kann. – AnZ

Antwort

1

den Code wie folgt verwenden:

final HorizontalScrollView hsv = new HorizontalScrollView(this); 
    final TextView tv = new TextView(this); 
    tv.setTextSize(48); 
    tv.setText("Our evil heaven for living is to yearn others agreeable."); 
    hsv.addView(tv); 
    setContentView(hsv); 

    View.OnClickListener ocl = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ObjectAnimator animRight = ObjectAnimator.ofInt(hsv, "scrollX", 0, tv.getWidth() - hsv.getWidth()); 
      animRight.setRepeatCount(3); 
      // you could use CycleInterpolator(0.5f) but the 
      // effect with CycleInterpolator is not so smooth 
      // so use that custom Interpolator 
      animRight.setInterpolator(new Interpolator() { 
       @Override 
       public float getInterpolation(float input) { 
        return (float) Math.pow(Math.sin(Math.PI * input), 2); 
// you could also use similar interpolation: 
//     return (float) (1 - Math.cos(2 * Math.PI * input))/2; 
       } 
      }); 
      animRight.setDuration(4000); 
      animRight.start(); 
     } 
    }; 
    tv.setOnClickListener(ocl);