Android 텍스트 상하 스크롤 효과 구현

안 드 로 이 드 가 문자 상하 스크롤 을 실현 하 는 것 에 대해 저 는 현재 두 가지 방법 이 있 습 니 다.
하 나 는 TextView 에 뒤 집 힌 애니메이션 효 과 를 추가 하고 순환 스크롤 을 설정 합 니 다.하 나 는 ViewPager 의 스크롤 방향 을 바 꾸 어 아래 에서 위로 스크롤 하고 순환 스크롤 을 설정 하 는 것 입 니 다.
먼저 첫 번 째 방법 을 소개 합 니 다.
사고 실현:TextView 를 사용자 정의 하고 TextView 에 아래 에서 위로 스크롤 하 는 애니메이션 효 과 를 추가 한 다음 에 순환 재생 을 설정 합 니 다.
TextView 를 계승 할 수 있 도록 AutoTextView 를 만 든 다음 onDraw 방법 에서 getHeight()방법 으로 textview 의 현재 높이 를 가 져 옵 니 다.
다음 애니메이션 반전 효과 에서 이 높이 에 따라 TextView 의 상하 스크롤 거 리 를 설정 합 니 다.다음은 애니메이션 실현 방법 입 니 다.

/**
 *            
 */
private void animationStart() {
  ObjectAnimator translate = ObjectAnimator.ofFloat(this, "translationY", 0, -height);
  ObjectAnimator alpha = ObjectAnimator.ofFloat(this, "alpha", 1f, 0f);
  mAnimStart = new AnimatorSet();
  mAnimStart.play(translate).with(alpha);
  mAnimStart.setDuration(DURATION);
  mAnimStart.addListener(this);

}

/**
 *             
 */
public void animationOver() {
  ObjectAnimator translate = ObjectAnimator.ofFloat(this, "translationY", height, 0);
  ObjectAnimator alpha = ObjectAnimator.ofFloat(this, "alpha", 0f, 1f);
  mAnimOver = new AnimatorSet();
  mAnimOver.play(translate).with(alpha);
  mAnimOver.setDuration(DURATION);

}
다음은 ObjectAnimator 의 감청 이 벤트 를 실현 합 니 다.onAnimationEnd 에서 setText 방법 을 호출 하여 애니메이션 에서 텍스트 업 데 이 트 를 한 번 도 끝내 지 않 고 애니메이션 효 과 를 계속 수행 합 니 다.

@Override
public void onAnimationEnd(Animator animator) {
  super.setText(mText);
  if (mAnimOver == null) {
    animationOver();

  }

  mAnimOver.start();
}
그 다음 에 순환 스크롤 을 설정 할 수 있 는 클래스 를 호출 합 니 다.여 기 는 Scheduled ExecutorService 를 사용 할 수도 있 고 Timer 몇 가지 설정 으로 시간 스크롤 을 사용 할 수도 있 습 니 다.UI 를 업데이트 할 때 Handler 방법 으로 업데이트 할 수도 있 습 니 다.
타이머 로 정시 작업 을 수행 할 때 하나의 스 레 드 만 만 들 기 때문에 Scheduled Executor Service 를 사용 하 는 것 을 권장 합 니 다.

/**
 *            
 * @param textView
 * @param list
 * @param autoPlayTime
 */
public void getTextData(final IdeaAutoTextview textView, List<String> list, int autoPlayTime) {
  this.textView = textView;
  this.textList = list;

  if (autoPlayTime != 0) {

    scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    scheduledExecutorService.scheduleWithFixedDelay(new WeakTimerTask(this), autoPlayTime, autoPlayTime, TimeUnit.SECONDS);
  }
}


private TimeTaskHandler mHandler = new TimeTaskHandler(this);

private static class WeakTimerTask extends TimerTask {
  private WeakReference<IdeaAutoTextview> autoTextReference;

  public WeakTimerTask(IdeaAutoTextview mautoText) {
    this.autoTextReference = new WeakReference<>(mautoText);
  }

  @Override
  public void run() {
    IdeaAutoTextview autoText = autoTextReference.get();
    if (autoText != null) {
      if (autoText.isShown()) {
        autoText.mHandler.sendEmptyMessage(0);
      }
    } else {
      cancel();
    }
  }
}
정시 갱신 빈도 가 비교적 높 아 메모리 누 출 이 발생 하기 쉬 우 므 로 약 한 인용 으로 이 상황 이 발생 하지 않도록 한다.

private final class TimeTaskHandler extends Handler {
  private WeakReference<IdeaAutoTextview> autoTextReference;

  public TimeTaskHandler(IdeaAutoTextview autoText) {
    this.autoTextReference = new WeakReference<>(autoText);
  }

  @Override
  public void handleMessage(Message msg) {
    IdeaAutoTextview autoText = autoTextReference.get();

    if (autoText!=null)
    {
      /**
       *       
       */
      String text = textList.get(index);
      index++;
      if (index > textList.size() - 1) {
        index = 0;
      }
      textView.setAutoText(text);
    }


  }
}
여기 서 첫 번 째 방법 을 소개 하 겠 습 니 다.
두 번 째 방법 으로 실현 되 는 원 리 는 윤 방도 의 원리 와 유사 하 다.윤 방도 는 보통 좌우 로 가로로 굴 러 가 는데 여 기 는 ViewPager 를 상하 미끄럼 으로 바 꾸 어야 한다.상하 미끄럼 에 관 한 viewpager 는 github 에서 찾 을 수 있다.
그 다음 에 윤 방 도 에서 재생 하 는 것 은 그림 이 고 그림 을 문자 로 바 꾸 면 된다.
그 다음 에 Timer 나 Scheduled Executor Service 를 호출 하여 ViewPager 를 자동 으로 스크롤 합 니 다.
다음은 코드:

package com.idea.idea.viewutils;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

import java.lang.ref.WeakReference;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * todo:  ViewPager        
 *
 * @author: Create by qjj
 * @email: [email protected]
 */
public class AutoViewpager extends RelativeLayout{

  private VerticalViewPager mVerticalViewPager;
  private PagerAdapter mAdapter;
  private int autoPlayTime;
  private ScheduledExecutorService scheduledExecutorService;

  public AutoViewpager(Context context){
    this(context,null);
  }

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

  }

  public AutoViewpager(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initView();
  }


  /**
   *    view
   */
  private void initView(){
    if(mVerticalViewPager!=null){
      removeView(mVerticalViewPager);
    }
    mVerticalViewPager = new VerticalViewPager(getContext());
    mVerticalViewPager.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    addView(mVerticalViewPager);

  }

  private final static class TimeTaskHandler extends Handler {
    private WeakReference<AutoViewpager> mRollPagerViewWeakReference;

    public TimeTaskHandler(AutoViewpager autoViewpager) {
      this.mRollPagerViewWeakReference = new WeakReference<>(autoViewpager);
    }

    @Override
    public void handleMessage(Message msg) {
      AutoViewpager autoViewpager = mRollPagerViewWeakReference.get();
      int cur = autoViewpager.getViewPager().getCurrentItem()+1;
      if(cur>= autoViewpager.mAdapter.getCount()){
        cur=0;
      }
      autoViewpager.getViewPager().setCurrentItem(cur);

    }
  }
  private TimeTaskHandler mHandler = new TimeTaskHandler(this);

  private static class WeakTimerTask extends TimerTask {
    private WeakReference<AutoViewpager> mRollPagerViewWeakReference;

    public WeakTimerTask(AutoViewpager mAutoViewpager) {
      this.mRollPagerViewWeakReference = new WeakReference<>(mAutoViewpager);
    }

    @Override
    public void run() {
      AutoViewpager autoViewpager = mRollPagerViewWeakReference.get();
      if (autoViewpager !=null){
        if(autoViewpager.isShown()){
          autoViewpager.mHandler.sendEmptyMessage(0);
        }
      }else{
        cancel();
      }
    }
  }

  /**
   *     
   */
  private void autoPlay(){
    if(autoPlayTime<=0||mAdapter == null||mAdapter.getCount()<=1){
      return;
    }

    scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    scheduledExecutorService.scheduleWithFixedDelay(new WeakTimerTask(this), autoPlayTime, autoPlayTime, TimeUnit.SECONDS);
  }

  public void setAutoTime(int autoPlayTime){
    this.autoPlayTime = autoPlayTime;
    autoPlay();
  }


  /**
   * viewpager
   * @return
   */
  public ViewPager getViewPager() {
    return mVerticalViewPager;
  }

  /**
   *   Adapter
   * @param adapter
   */
  public void setAdapter(PagerAdapter adapter){
    mVerticalViewPager.setAdapter(adapter);
    mAdapter = adapter;
    dataChanged();
  }
  private void dataChanged(){
    autoPlay();
  }

}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기