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