最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View實(shí)現(xiàn)縱向跑馬燈效果詳解

 更新時(shí)間:2016年11月06日 14:13:28   作者:偽文藝大叔  
對于跑馬燈效果在我們?nèi)粘J褂玫腶pp中還是很常見的,比如外賣app的商家公告就使用了此效果,但是它是橫向滾動的,橫向滾動多適用于單條信息;但凡涉及到多條信息的滾動展示,用縱向滾動效果會有更好的用戶體驗(yàn),今天我們通過自定義View來看看如何實(shí)現(xiàn)縱向跑馬燈效果。

首先看看效果圖(錄制的gif有點(diǎn)卡,真實(shí)的效果還是很流暢的)

實(shí)現(xiàn)思路

通過上面的gif圖可以得出結(jié)論,其實(shí)它就是同時(shí)繪制兩條文本信息,然后通過動畫不斷的改變兩條文本信息距離頂部的高度,以此來實(shí)現(xiàn)滾動的效果。

具體實(shí)現(xiàn)

首先定義一些要用到的屬性

<declare-styleable name="MarqueeViewStyle">  
<attr name="textSize" format="dimension" />  
<attr name="textColor" format="color" />  
<attr name="paddingLeft" format="dimension" />  
<attr name="paddingTop" format="dimension" />  
<attr name="paddingBottom" format="dimension" />  
<attr name="paddingTopBottom" format="dimension"/>  
<attr name="startDelayTime" format="integer"/> 動畫開始延遲時(shí)間
<attr name="reRepeatDelayTime" format="integer"/> 動畫重復(fù)延遲時(shí)間 
<attr name="itemAnimationTime" format="integer"/> 單個(gè)動畫的執(zhí)行時(shí)間
</declare-styleable>

接下來解析屬性值

private void init(Context context, AttributeSet attrs) {  
 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MarqueeViewStyle);  
 mTextColor = typedArray.getColor(R.styleable.MarqueeViewStyle_textColor, Color.BLACK);  
 mTextSize = typedArray.getDimensionPixelSize(R.styleable.MarqueeViewStyle_textSize, 45);  

 mPaddingLeft = typedArray.getDimensionPixelSize(R.styleable.MarqueeViewStyle_paddingLeft, 15);  
 mPaddingTop = mPaddingBottom = typedArray.getDimensionPixelSize(R.styleable.MarqueeViewStyle_paddingTopBottom, 25);  
 mPaddingTop = typedArray.getDimensionPixelSize(R.styleable.MarqueeViewStyle_paddingTop, mPaddingTop);  
 mPaddingBottom = typedArray.getDimensionPixelSize(R.styleable.MarqueeViewStyle_paddingBottom, mPaddingBottom);  

 itemAnimationTime = typedArray.getInteger(R.styleable.MarqueeViewStyle_itemAnimationTime, 1000);  
 reRepeatDelayTime = typedArray.getInteger(R.styleable.MarqueeViewStyle_reRepeatDelayTime, 1000);  
 startDelayTime = typedArray.getInteger(R.styleable.MarqueeViewStyle_startDelayTime, 500);  
 typedArray.recycle();  

  mPaint = new Paint();  
  mPaint.setAntiAlias(true);  
  mPaint.setTextSize(mTextSize);  
  mPaint.setColor(mTextColor);  
  mPaint.setTextAlign(Paint.Align.LEFT);}

重寫onMeasure方法

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  if(mTextArray == null || mTextArray.length == 0) {   
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  } else {    
    int width = MeasureSpec.getSize(widthMeasureSpec);  
    int height = MeasureSpec.getSize(heightMeasureSpec);   
    ViewGroup.LayoutParams lp = getLayoutParams();    
    setMeasuredDimension(getViewWidth(lp, width), getViewHeight(lp, height));  
  }
}

數(shù)據(jù)為空時(shí)調(diào)用父類的方法,設(shè)置數(shù)據(jù)以后根據(jù)不同的布局計(jì)算寬高。

設(shè)置數(shù)據(jù)

public void setTextArray(String[] textArray) {  
  if(textArray == null || textArray.length <= 1) return;  
  mTextArray = textArray;  
  initTextRect();  
  setTextCurrentOrNextStatus(0, 1, true);  
  startAnimation();}

initTextRect()方法是計(jì)算出單個(gè)文本的高度和數(shù)組中最大文本的寬度,文本的高度用來計(jì)算繪制文本時(shí)的位置,文本的最大寬度在onMeasure()方法的時(shí)候會用到。

setTextCurrentOrNextStatus()方法設(shè)置當(dāng)前的position,文本以及下一個(gè)position,文本。還有文本距離頂部的初始化高度。

startAnimation() 方法 開始執(zhí)行動畫。

動畫實(shí)現(xiàn)

private void startAnimation() {  
 va = ValueAnimator.ofFloat(0, 1);  
 va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    
 @Override    
 public void onAnimationUpdate(ValueAnimator animation) {  
   mProgress = (float) animation.getAnimatedValue();      
.   int moveOffset = (int) (mTextMoveOffset * mProgress); 
   mCurrentTextMoveMarginTop = mCurrentTextInitMarginTop - moveOffset;      
   mNextTextMoveMarginTop = mNextTextInitMarginTop - moveOffset;      
   postInvalidate();    
 }  
 });  

 va.addListener(new AnimatorListenerAdapter() {    
   @Override    
   public void onAnimationRepeat(Animator animation) {   
    va.pause();        
    setTextCurrentOrNextStatus(mNextTextPosition, mNextTextPosition + 1, false);      
    handler.postDelayed(new Runnable() {        
     @Override        
     public void run() {          
      va.resume();        
     } 
    }, reRepeatDelayTime);    
   }  
 });  
 va.setRepeatCount(-1);  
 va.setDuration(itemAnimationTime);  
 va.setStartDelay(startDelayTime);  
 va.start();
}

va.setRepeatCount(-1); 設(shè)置動畫無限重復(fù)

onAnimationUpdate() 方法得到動畫執(zhí)行的進(jìn)度,計(jì)算出text距離頂部的距離,調(diào)用postInvalidate()方法刷新界面。

onAnimationRepeat() 方法,通過handler延遲reRepeatDelayTime時(shí)間,再重新執(zhí)行動畫。

繪制

protected void onDraw(Canvas canvas) {  
 if(mTextArray == null || mTextArray.length == 0) {   
  super.onDraw(canvas);  
 } else {    
  canvas.drawText(mCurrentText, mPaddingLeft, mCurrentTextMoveMarginTop, mPaint);  
  canvas.drawText(mNextText, mPaddingLeft, mNextTextMoveMarginTop, mPaint);  
 }
}

總結(jié)

到這里所有的代碼已經(jīng)分析完畢,其實(shí)實(shí)現(xiàn)這個(gè)效果還有很多種方法,通過繼承ViewGroup等等都可以實(shí)現(xiàn),大家有興趣可以自己嘗試。希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能有所幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • Android RadioButton單選框的使用方法

    Android RadioButton單選框的使用方法

    本篇文章小編為大家介紹,Android RadioButton單選框的使用方法。需要的朋友參考下
    2013-04-04
  • Android?Admob接入原理及完整教程示例

    Android?Admob接入原理及完整教程示例

    這篇文章主要為大家介紹了Android?Admob接入原理及完整教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android PicSelector圖片選擇器小功能

    Android PicSelector圖片選擇器小功能

    這篇文章主要為大家詳細(xì)介紹了Android PicSelector圖片選擇器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android控件View打造完美的自定義側(cè)滑菜單

    Android控件View打造完美的自定義側(cè)滑菜單

    這篇文章主要介紹了Android控件View打造完美的自定義側(cè)滑菜單的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 自定義toast外形,多次點(diǎn)擊不會總是彈出toast的實(shí)現(xiàn)方法

    自定義toast外形,多次點(diǎn)擊不會總是彈出toast的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄远xtoast外形,多次點(diǎn)擊不會總是彈出toast的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android Studio 新手入門教程(一)基本設(shè)置圖解

    Android Studio 新手入門教程(一)基本設(shè)置圖解

    這篇文章主要介紹了Android Studio 新手入門教程(一)基本設(shè)置圖解,需要的朋友可以參考下
    2017-12-12
  • Android開發(fā)中WebView的簡單使用小結(jié)

    Android開發(fā)中WebView的簡單使用小結(jié)

    WebView(網(wǎng)絡(luò)視圖)能加載顯示網(wǎng)頁,可以將其視為一個(gè)瀏覽器。它使用了WebKit渲染引擎加載顯示網(wǎng)頁。下面這篇文章給大家總結(jié)了Android中WebView的簡單使用,有需要的可以參考借鑒。
    2016-09-09
  • Android Studio3.0.1填坑筆記

    Android Studio3.0.1填坑筆記

    IntelliJ IDEA 功能強(qiáng)大,是Jet Brains 公司開發(fā)商業(yè)IDE(集成開發(fā)環(huán)境),同時(shí)支持Java, Scala 和Groovy。下面小編給大家?guī)砹薃ndroid Studio3.0.1填坑筆記,需要的朋友一起看看吧
    2018-01-01
  • Android使用addView動態(tài)添加組件的方法

    Android使用addView動態(tài)添加組件的方法

    這篇文章主要為大家詳細(xì)介紹了Android使用addView動態(tài)添加組件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android實(shí)現(xiàn)懸浮可拖拽的Button

    Android實(shí)現(xiàn)懸浮可拖拽的Button

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)懸浮可拖拽的Button,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

嘉兴市| 全椒县| 靖远县| 叙永县| 姚安县| 常宁市| 朝阳市| 林芝县| 邳州市| 剑河县| 兰州市| 襄城县| 宁夏| 张北县| 石棉县| 东明县| 华阴市| 宁城县| 虎林市| 鄢陵县| 枣庄市| 长阳| 建平县| 札达县| 渝中区| 平山县| 徐州市| 铁力市| 泾源县| 五原县| 璧山县| 罗甸县| 正定县| 兴国县| 班玛县| 北海市| 固阳县| 浮梁县| 子长县| 海原县| 台湾省|