亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現文字上下滾動效果

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

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

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

首先介紹第一種方法: 

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

創建一個AutoTextVieW使之繼承TextView,然后在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方法,在動畫沒結束一次更新文字,并且繼續執行動畫效果

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

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

因為采用Timer執行定時任務時只創建一個線程,所以這里建議采用ScheduledExecutorService;

/** * 獲取數據并設置滾動播放 * @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或者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方法實現文字滾動 * * @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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
清纯唯美日韩制服另类| 18一19gay欧美视频网站| 2020久久国产精品| 7m精品福利视频导航| 国产丝袜精品第一页| 久久夜色精品国产欧美乱| 日韩精品视频在线观看网址| 91精品国产亚洲| 九九热99久久久国产盗摄| 国产精品白嫩初高中害羞小美女| 精品久久中文字幕| 91精品在线影院| 欧美人与物videos| 国产免费一区二区三区香蕉精| 91美女片黄在线观| 永久555www成人免费| 久久成人人人人精品欧| 全亚洲最色的网站在线观看| 97在线视频国产| 91国内揄拍国内精品对白| 国产亚洲综合久久| 秋霞成人午夜鲁丝一区二区三区| 97超级碰在线看视频免费在线看| 久久6精品影院| 97视频在线观看成人| 伊人男人综合视频网| 97超视频免费观看| 亚洲欧美激情视频| 亚洲成人av在线播放| 黑人巨大精品欧美一区二区免费| 在线电影中文日韩| 国产激情视频一区| 亚洲字幕一区二区| 中文字幕在线看视频国产欧美| 国产精自产拍久久久久久| 中文字幕亚洲字幕| 成人黄色在线观看| 久久久成人av| 亚洲精品视频中文字幕| 国产精品高潮呻吟久久av野狼| 色悠悠久久88| 精品国产依人香蕉在线精品| 一区二区三区亚洲| 成人有码视频在线播放| 欧美日韩国产一区二区| 国产精品久久色| 欧美精品电影免费在线观看| 成人性生交大片免费看小说| 欧美一级免费看| 精品亚洲国产成av人片传媒| 欧美激情视频播放| 日韩欧美a级成人黄色| 日本久久中文字幕| 日韩av影视在线| 最新的欧美黄色| 国产精品久久久久7777婷婷| 亚洲爱爱爱爱爱| 久久6免费高清热精品| 91国产美女在线观看| 国产亚洲精品美女久久久久| 欧美中文字幕第一页| 色综合久久天天综线观看| 国产精品96久久久久久| 成人在线免费观看视视频| 亚洲伊人成综合成人网| 精品偷拍各种wc美女嘘嘘| 亚洲午夜女主播在线直播| 亚洲乱亚洲乱妇无码| 日韩在线免费高清视频| 欧美第一淫aaasss性| 精品福利在线看| 欧美激情在线狂野欧美精品| 日本中文字幕久久看| 91色视频在线导航| 黑人巨大精品欧美一区二区三区| 狠狠干狠狠久久| 另类天堂视频在线观看| 亚洲女同精品视频| 欧美日韩免费网站| 亚洲自拍偷拍一区| 亚洲福利视频免费观看| 91香蕉嫩草影院入口| 91在线观看免费| 亚洲成色777777女色窝| 欧美黑人巨大xxx极品| 永久免费看mv网站入口亚洲| 日本欧美一二三区| 成人国产在线视频| 夜夜躁日日躁狠狠久久88av| 亚洲视频在线视频| 2020国产精品视频| 色婷婷综合久久久久| www.日韩.com| 欧美日韩国产一中文字不卡| 亚洲老司机av| 国产精品美女无圣光视频| 欧美精品在线播放| 国产丝袜精品第一页| 激情成人中文字幕| 亚洲精品福利在线观看| 日本电影亚洲天堂| 亚洲成人av片在线观看| 夜夜躁日日躁狠狠久久88av| 久久激情五月丁香伊人| 国产在线视频2019最新视频| 亚洲成人久久电影| 中文字幕日韩在线播放| 欧美黑人一区二区三区| 黑丝美女久久久| 国模精品一区二区三区色天香| 亚洲自拍中文字幕| 欧美精品久久久久久久久久| 在线观看亚洲区| 亚洲精品在线看| 久久久噜噜噜久噜久久| 久久久久久国产精品三级玉女聊斋| 国产视频在线观看一区二区| 久久久精品在线| 欧美有码在线观看| 欧美一区第一页| 国产精品一区二区久久久久| 中文字幕在线看视频国产欧美| 国产精品日韩av| 欧美日韩国产精品一区二区不卡中文| 欧美在线视频a| 欧洲亚洲在线视频| 国产aⅴ夜夜欢一区二区三区| 亚洲大胆人体视频| 国产欧美一区二区白浆黑人| 麻豆乱码国产一区二区三区| 亚洲大胆美女视频| 午夜精品在线视频| 精品亚洲国产成av人片传媒| 另类图片亚洲另类| 亚洲无线码在线一区观看| 亚洲精品一区中文| 亚洲综合色激情五月| 欧美丝袜一区二区| 深夜福利一区二区| 欧美黑人又粗大| 国产亚洲欧洲在线| 欧美人成在线视频| 亚洲第一福利视频| 亚洲国产中文字幕在线观看| 亚洲天堂成人在线| 国产欧美日韩最新| 九九精品视频在线观看| 中文字幕不卡在线视频极品| 91久久夜色精品国产网站| 69**夜色精品国产69乱| 91在线高清视频| 亚洲免费成人av电影| 91po在线观看91精品国产性色| 久久伊人91精品综合网站| 亚洲国产精品成人va在线观看| 久久国产精彩视频| 91天堂在线视频| 91夜夜未满十八勿入爽爽影院| 国产成人精品久久二区二区91| 77777少妇光屁股久久一区| 久久影视电视剧免费网站| 久久久久久九九九| 中文字幕一区电影| 91免费高清视频|