幀動畫載入大量圖片OOM的解決辦法
這是在別人程式碼基礎上更改的。
程式碼如下:
public class SceneAnimation {
/**
* target imageView
*/
private ImageView mImageView;
/**
* frame resources
*/
private int[] mFrameRes = null;
/**
* different duration in frame
*/
private int[] mDurations = null;
/**
* specific duration
*/
private long mDuration;
private int mCurrentFrame;
private boolean mStop;
private boolean mRepeat;
private boolean mSpecificDuration;
private Runnable mAction = null;
private OnFramePlayListener mListener;
public interface OnFramePlayListener{
void onFrame(int frame);
void onEnd();
}
public SceneAnimation(ImageView pImageView, int[] pFrameRes, int pDuration) {
initialize(pImageView, pFrameRes);
mDuration = pDuration;
mSpecificDuration = true;
}
public SceneAnimation(ImageView pImageView, int[] pFrameRes, int [] pDurations) {
initialize(pImageView, pFrameRes);
mDurations = pDurations;
mSpecificDuration = false;
}
private void initialize(ImageView pImageView, int[] pFrameRes) {
mImageView = pImageView;
mFrameRes = pFrameRes;
mCurrentFrame = 0;
mStop = false;
mRepeat = false;
}
/**
* @return the total time of animation
*/
public long getTotalTime(){
if(mFrameRes != null) {
if (mSpecificDuration) {
return mDuration * (mFrameRes.length - 1);
} else if(mDurations != null){
long totalTime = 0;
for (int i = 0; i < mDurations.length; i++) {
totalTime += mDurations[i];
}
return totalTime;
}else{
return 0;
}
}
return 0;
}
public void setRepeat(boolean mRepeat) {
this.mRepeat = mRepeat;
}
public void setOnFramePlayListener(OnFramePlayListener mListener) {
this.mListener = mListener;
}
@SuppressWarnings("deprecation")
private void setBackground(View view, Drawable drawable)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
{
view.setBackgroundDrawable(drawable);
} else {
view.setBackground(drawable);
}
}
private void doPlay(){
if(null == mImageView)
return;
mImageView.postDelayed(mAction = new Runnable()
{
public void run() {
if(mCurrentFrame < mFrameRes.length && !mStop) {
setBackground(mImageView,
ContextCompat.getDrawable(mImageView.getContext(), mFrameRes[mCurrentFrame]));
if(mListener != null){
mListener.onFrame(mCurrentFrame);
if(mCurrentFrame == mFrameRes.length - 1){
mListener.onEnd();
}
}
mCurrentFrame++;
doPlay();
}else if(mRepeat && !mStop){
startPlay();
}
}
}, getDelayTime());
}
/**
* 由於都是大圖片所以動畫播放過程中會頻繁gc
* 所以動畫時間間隔需要縮短,暫時沒想到更好的辦法,只是
* 把時間間隔縮短為原來的65%比較接近我們期望的動畫時長
* @return
*/
private long getDelayTime() {
if(mSpecificDuration)
return (long)(mDuration * 0.65d);
else{
if(mCurrentFrame - 1 < mDurations.length){
return (long)(mDurations[mCurrentFrame - 1] * 0.65d);
}else{
return 0;
}
}
}
public void startPlay(){
if(mFrameRes != null) {
mCurrentFrame = 0;
setBackground(mImageView,
ContextCompat.getDrawable(mImageView.getContext(), mFrameRes[mCurrentFrame]));
mCurrentFrame++;
doPlay();
}
}
/**
* 停止動畫,釋放資源
*/
public void stopImmediately() {
if(mImageView != null){
mStop = true;
if(mAction != null) {
mImageView.removeCallbacks(mAction);
mAction = null;
}
}
}
}
相關推薦
幀動畫載入大量圖片OOM的解決辦法
這是在別人程式碼基礎上更改的。 程式碼如下: public class SceneAnimation { /** * target imageView */ private ImageView mImageView;
Glide 3.7.0 載入https 圖片的解決辦法
需要的依賴如下 compile 'com.squareup.okhttp3:okhttp:3.3.1' compile 'com.github.bumptech.glide:glide:3.7.0' 需要以下三個類 OkHttpStr
Android逐幀動畫,逐幀動畫載入圖片過多時OOM異常的解決和替代方法
1.首先新增逐幀動畫 播放逐幀動畫,在工程中res目錄下建立一個anim資料夾,新增動畫anim_welcome.xml檔案如下: <?xml version="1.0" encoding="utf-8"?> <animation-li
android載入大量圖片記憶體溢位的三種解決辦法
方法一: 在從網路或本地載入圖片的時候,只加載縮圖。 /** * 按照路徑載入圖片 * @param path 圖片資源的存放路徑 * @param scalSize 縮小的倍數 * @return */ public s
Android DrawableAnimation逐幀動畫載入多圖(OOM的解決)
想做一個逐幀動畫,用了一百來張圖片,結果記憶體溢位了,找了半天最後算是解決了。 本來是在drawable裡面寫一個animation-list,設定ImageView的backgroud, 然後在Activity裡面animationDrawable = (Animatio
apache 下 圖片顯示不完整 JS檔案載入不完全的解決辦法
最近用apache除錯程式的時候總莫名其妙的出現JS錯誤, firebug檢視JS顯示JS根本就沒載入完,還有圖片顯示不完整的問題如下圖: 後在在網上找到了解決的辦法: apache的一個bug造成的。到apache的主配置檔案httpd.conf裡將下面一條指令前的#去掉即可。 Enabl
Android GridView載入大量圖片時出現OOM情況
最近寫的一個應用涉及到使用GridView顯示圖片,當使用BaseAdapter傳統的的實現時,在真機上快速滾動時會出現OOM情況。 一個臨時性的解決方案就是改動圖片尺寸,減小記憶體。這種方法簡單卻不
Android相簿解決載入大量圖片卡頓問題
Android開發中載入相簿是很常用的功能,但相簿圖片過多正常載入會產生卡頓,即便使用執行緒非同步載入圖片卡頓問題依然得不到改善。 正常程式碼: public class AlbumAdapter extends ?{ @Override
android很多圖片做成幀動畫造成記憶體溢位的解決方法。
package com.familydoctor.widget; import android.os.Handler; import android.util.Log; import android.widget.ImageView; import com.familydo
Android SketchImageView 載入Gif圖片,解決介面不流暢卡頓問題
遇到的問題 列表載入gif圖片,用Fresco,Glide,android-gif-drawable等都能實現簡單的單個Gif圖片的載入,如果在列表上載入圖片,不做記憶體優化處理,那麼OOM就會黏著你,對於專案比較緊急,時間有限的童鞋來說,優化無疑是雪上加霜,SO,那麼給大家推薦一個簡單載入Gi
Win10視窗載入不完整的解決辦法
方法摘錄如下 step1:開啟登錄檔 WIN+R,或者執行裡面輸入regedit step2:路徑[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]將原來的: "Microsoft YaH
vue-cli 腳手架、vue元件引入圖片出錯解決辦法
問題:vue-cli腳手架中 元件相互巢狀,圖片路徑報錯。 解決辦法:首先把圖片引入進來,然後再付給data(); <template> <img :src="picUrl"/> </template> <style> <
Win10 環境 Vs 2010未能正確載入 WorkFlowPackage包,解決辦法
在安裝K2 BalckPeral4.6時,安裝完成後,開啟VS2010 ,總是報未能正確載入WorkFlowPackage包,網上搜索了一遍,也沒找到相關的解決方案,在經過網上所說的各種嘗試後,最終也未能解決。後來,一個巧合,先解除安裝K2,重灌,然後解除安裝Vs2010,重灌。安裝完成後,有把K2
【總結】 Nginx大量TIME_WAIT的解決辦法
在阿里雲預設的系統TCP引數情況下,會導致大量的TIME_WAIT出現 檢視 優化方法 修改核心引數 # vi /etc/sysctl.conf net.ipv4.tcp_syncookies = 1
CPU劇烈週期波動---services.exe的CPU佔用 來回波動,佔用大量CPU 的解決辦法
系統:windows 7 現象:偶爾出現: 開機後,還未開啟很多軟體,但CPU佔用率 波動很大,從10%---90% 來回波動,導致 正常操作 困難,顯得電腦異常緩慢。 通過工作管理員 進行觀察,發現主要是 services.exe 的cpu佔用率 波動很大,週期性的迴圈波
Android滑動列表載入大量圖片時候的優化
1 正在滾動的時候停止載入圖片2 滾動到頂部和底部的時候,載入圖片3 滑動速度降低到一定速率的時候,載入圖片4 到底部時候載入更多/** * Created by android on 2018/1/9. * * 快速滑動時候,停止載入圖片, 載入更多 */ publi
os X下mds_stores佔用大量cpu的解決辦法
有時候發現, MacOS中, 有個叫做mds_stores的程序佔了好多CPU, 於是要阻止這個行為, 據說這是MacOS在建索引然後只要把這個索引的關掉就好了 sh-3.2# mdutil -a -i off /:Indexing disabled.sh-3.2# ▊
VS2010打不開VS2012 .NET MVC 工程,及開啟後部分模組載入不正確的解決辦法
首先,如果sln開啟不正確,用(notepad++)開啟sln 比如 VS2010的前兩行為: Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 VS2008的前
win10開機卡在載入介面問題的解決辦法
【問題描述】 自用的thinkpad渣系列本子,有很大的概率,在開機後顯示藍色windows標誌,或者轉圈載入的時候,會卡住。 出現此類情況的時候,需要按下關機鍵(短按關機鍵即可完成關機,不需要長按),然後重新開機,可以進入系統。 【解決方案】 本來出現的也不頻繁,最近不
DEDECMS上傳圖片出錯解決辦法
在使用DEDECMS織夢內容管理系統上傳圖片時,會出現upload filetype not allow的提示,圖片無法上傳。 出現這種情況的原因完全是系統程式碼不完善、存在小紕漏造成的。 首先:開