a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統(tǒng) > Android > 正文

Android實現(xiàn)文字上下滾動效果

2019-10-21 21:33:12
字體:
來源:轉載
供稿:網友

關于Android實現(xiàn)文字上下滾動這個功能,我目前有兩種方法實現(xiàn): 

一個是在TextView 中加上翻轉的動畫效果,然后設置循環(huán)滾動;一種是改寫ViewPager 的滾動方向,使它從下到上進行滾動,并設置循環(huán)滾動;

首先介紹第一種方法: 

實現(xiàn)思路:自定義TextView,在TextView中加上從下到上滾動的動畫效果,然后設置循環(huán)播放;

創(chuàng)建一個AutoTextVieW使之繼承TextView,然后在onDraw方法中調用getHeight()方法獲取textview當前的高度。 
在接下來的動畫翻轉效果中,根據(jù)這個高度設置TextView上下滾動的距離。下面是動畫實現(xiàn)的方法:

/** * 向上脫離屏幕的動畫效果 */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);}

接下來實現(xiàn)ObjectAnimator的監(jiān)聽事件,在onAnimationEnd 調用setText方法,在動畫沒結束一次更新文字,并且繼續(xù)執(zhí)行動畫效果

@Overridepublic void onAnimationEnd(Animator animator) {  super.setText(mText);  if (mAnimOver == null) {    animationOver();  }  mAnimOver.start();}

然后調用一個可以設置循環(huán)滾動的類,這里可以使用ScheduledExecutorService,也可以使用 Timer幾設置計時滾動,在更新UI的時候,調用Handler方法更新; 

因為采用Timer執(zhí)行定時任務時只創(chuàng)建一個線程,所以這里建議采用ScheduledExecutorService;

/** * 獲取數(shù)據(jù)并設置滾動播放 * @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();    }  }}

定時刷新頻率較高,容易產生內存泄漏,這里采用弱引用避免這個情況發(fā)生

 

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

到此第一種方法介紹完畢。

第二種方法實現(xiàn)的原理和輪播圖的原理類似,輪播圖一般是左右橫向滾動,這里需要把ViewPager改成上下滑動,關于上下滑動的viewpager,可以在給github上找到; 
其次輪播圖中播放的是圖片,把圖片換成文字即可; 
然后同樣調用Timer或者ScheduledExecutorService使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方法實現(xiàn)文字滾動 * * @author: Create by qjj * @email: gxuqjj@163.com */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();  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久国产一区 | 欧美黄色激情 | 欧洲成人午夜免费大片 | 国产精品无码永久免费888 | 欧美午夜精品一区二区三区电影 | 黑人精品xxx一区一二区 | 欧美日本不卡 | 免费的日本网站 | 午夜视频免费网站 | 福利视频一区 | 日韩精品专区 | 亚洲高清免费视频 | 日韩综合在线 | 亚洲精品电影在线观看 | 99精品99 | 亚洲日韩视频免费观看 | 国产专区在线视频 | 在线一区 | 欧美99| 精品国产乱码久久久久久丨区2区 | 欧美极品视频 | 在线免费观看的www视频 | 成人在线视频网址 | 欧美一区永久视频免费观看 | 欧美日韩国产成人 | 黄色网址在线免费 | 毛片一区 | 亚洲六月丁香色婷婷综合久久 | 国产成人综合网 | 国产精品久久久久久久久久久久久久 | 久久亚洲婷婷 | 日本天堂一区二区 | 亚州成人| 特级理论片 | 91亚洲国产 | 亚洲欧美一区二区三区国产精品 | 一区二区精品 | 国产精品777一区二区 | 国产不卡一区二区三区在线观看 | 91精品国产色综合久久不卡98 | 91精品久久久久久综合五月天 |