自定義倒計時View的效能優化

2021-08-01 17:39:09 字數 3112 閱讀 2513

在文章之前先放一張效果圖, 動畫很簡單,每倒數一秒,乙個指標變亮,中間重新整理時間。

在之前ui還沒有和我討論這個效果的時候,就給了我60張圖,讓我一秒重新整理乙個bitmap。

第一種方法:直接draw bitmap。

當然,不用想我就是拒絕的。60張圖,一張影象素是320*230。60張圖總共占用記憶體是320*320*4*60/1024 = 23mb 記憶體。為了乙個動畫占用24mb記憶體肯定是得不償失的。雖然**比較簡單,但是我們肯定不會這樣來寫。

所以這種動畫需要canvas來畫了。

第二種方法:canvas draw line。

這種方法就是先畫一條線,再將canvas旋轉乙個角度(6度),重複畫60次就完成了乙個圓。關鍵**如下:

@override

protected void ondraw(canvas canvas) else

canvas.drawline(startx, starty, endx, endy, paint);

canvas.rotate(degree, roundxy, roundxy);

}canvas.restore();

}

功能是完成了。下一步就是檢查效能了。於是用gpu呈現模式檢視時間,發現耗時太長。在小公尺2,2g記憶體上 整個迴圈修改為6000次,需要400毫秒左右的時間,60次就是4毫秒,雖然節省了記憶體,但是耗時增加了,效能也不是很好。於是我就想到了第三種方法。

第三種方法:draw bitmap + line

這種方法就是初始化60次畫線生成一張背景圖,將背景圖作為乙個我們自己的canvas,然後倒計時一秒畫線在bitmap上,系統canvas只畫bitmap和時間。相當於一次倒計時只畫3次:bitmap,line,text 比第二種方式60 * line + text 要少太多。bitmap占用的記憶體是320*320*4 = 400k,記憶體可以接受。具體**如下:

package sunday.customview;

import android.content.context;

import android.content.res.typedarray;

import android.graphics.bitmap;

import android.graphics.canvas;

import android.graphics.paint;

import android.graphics.region;

import android.os.countdowntimer;

import android.support.annotation.nullable;

import android.util.attributeset;

import android.view.view;

/** * created by sunday on 2017/5/26.

*/public class countdownview extends view

public countdownview(context context, @nullable attributeset attrs)

public void setonticklistener(onticklistener onticklistener)

public void setcolornormal(int color)

public void setcolorhighlight(int color)

public void setlinewidth(int width)

public void setlinelenght(int length)

/*** @param millisinfuture the number of millis in the future from the call

* to until the countdown is done

* is called.

* @param countdowninterval the interval along the way to receive

*/public void setcounttime(int millisinfuture, int countdowninterval)

private void init()

@override

protected void onsizechanged(int w, int h, int oldw, int oldh)

private void initbitmapcanvas(int width, int height)

}private void initdraw()

bitmapcanvas.restore();

}public void drawhighlightline()

@override

protected void ondraw(canvas canvas)

private void redraw(long millisuntilfinished)

public void start()

}@override

public void onfinish() }};

}stop();

mcountdowntimer.start();

}public void stop()

}@override

protected void ondetachedfromwindow()

public inte***ce onticklistener

}

此方法 ondraw的時間一次不超過1ms,完全滿足要求,記憶體占用也接受。不過裡面有乙個問題存在,

drawhighlightline 中,我為了減少畫 bitmapcanvas 的時間,增加了 cliprect 切割,在我的想象中應該會節省時間。

但是實際上我測試將draw**迴圈10000次,發現反而慢了一半。與我想象不符合,這個問題需要研究一下

Android自定義控制項 倒計時

github傳送門 初始化一些資料 public class countdownview extends view public countdownview context context,attributeset attrs public countdownview context context...

C 自定義倒計時MessageBox

首先需要設計乙個簡單的介面,乙個label和button,如圖所示。ui核心 如下 x name lb content content label horizontalalignment left margin 76,68,0,0 verticalalignment top height 126 w...

android自定義倒計時控制項示例

這篇文章主要介紹了android秒殺倒計時自定義textview示例,大家參考使用吧 自定義textview控制項timetextview 複製 如下 import android.content.context import android.content.res.typedarray impor...