當前位置:首頁 » 安卓系統 » android動畫內存溢出

android動畫內存溢出

發布時間: 2022-11-15 00:31:10

① 如何解決Android幀動畫出現的內存溢出

1.anin_searh.xml

[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android=""
android:oneshot="true">
<item android:drawable="@drawable/a1" android:ration="100"></item>
<item android:drawable="@drawable/a2" android:ration="100"></item>
<item android:drawable="@drawable/a4" android:ration="100"></item>
<item android:drawable="@drawable/a5" android:ration="100"></item>
<item android:drawable="@drawable/a6" android:ration="100"></item>
<item android:drawable="@drawable/a7" android:ration="100"></item>
<item android:drawable="@drawable/a8" android:ration="100"></item>
<item android:drawable="@drawable/a9" android:ration="100"></item>
<item android:drawable="@drawable/a10" android:ration="100"></item>
<item android:drawable="@drawable/a11" android:ration="100"></item>
</animation-list>

2.使用幀動畫
[java] view plain
search_scale_iv.setBackgroundResource(R.drawable.anim_search);
AnimationDrawable drawable = (AnimationDrawable) search_scale_iv.getBackground();
drawable.start();
結果setBackgroundResource出現內存溢出,這個方法其實獲取drawable時候,會消耗很多內存,很容易內存溢出,崩潰。

3.解決方法:在網上找了個類,處理,結果我使用11張560k大小圖片,沒有內存溢出;

[java] view plain
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.graphics.BitmapFactory;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.widget.ImageView;

import org.apache.commons.io.IOUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/****
* 此工具類源於stack over flow
* 原文鏈接:
* 主要使用了BitmapFactory.decodeByteArray方法通過底層C來繪制圖片,有效防止OOM
* 使用了第三方類庫:org.apache.commons.io.IOUtils,將Inputstream轉為byte位元組數組
* *******/
public class MyAnimationDrawable {

public static class MyFrame {
byte[] bytes;
int ration;
Drawable drawable;
boolean isReady = false;
}

public interface OnDrawableLoadedListener {
public void onDrawableLoaded(List<MyFrame> myFrames);
}

// 1
/***
* 性能更優
* 在animation-list中設置時間
* **/
public static void animateRawManuallyFromXML(int resourceId,
final ImageView imageView, final Runnable onStart,
final Runnable onComplete) {
loadRaw(resourceId, imageView.getContext(),
new OnDrawableLoadedListener() {
@Override
public void onDrawableLoaded(List<MyFrame> myFrames) {
if (onStart != null) {
onStart.run();
}
animateRawManually(myFrames, imageView, onComplete);
}
});
}

// 2
private static void loadRaw(final int resourceId, final Context context,
final OnDrawableLoadedListener onDrawableLoadedListener) {
loadFromXml(resourceId, context, onDrawableLoadedListener);
}

// 3
private static void loadFromXml(final int resourceId,
final Context context,
final OnDrawableLoadedListener onDrawableLoadedListener) {
new Thread(new Runnable() {
@Override
public void run() {
final ArrayList<MyFrame> myFrames = new ArrayList<MyFrame>();

XmlResourceParser parser = context.getResources().getXml(
resourceId);

try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {

} else if (eventType == XmlPullParser.START_TAG) {

if (parser.getName().equals("item")) {
byte[] bytes = null;
int ration = 1000;

for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeName(i).equals(
"drawable")) {
int resId = Integer.parseInt(parser
.getAttributeValue(i)
.substring(1));
bytes = IOUtils.toByteArray(context
.getResources()
.openRawResource(resId));
} else if (parser.getAttributeName(i)
.equals("ration")) {
ration = parser.getAttributeIntValue(
i, 1000);
}
}

MyFrame myFrame = new MyFrame();
myFrame.bytes = bytes;
myFrame.ration = ration;
myFrames.add(myFrame);
}

} else if (eventType == XmlPullParser.END_TAG) {

} else if (eventType == XmlPullParser.TEXT) {

}

eventType = parser.next();
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e2) {
// TODO: handle exception
e2.printStackTrace();
}

// Run on UI Thread
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (onDrawableLoadedListener != null) {
onDrawableLoadedListener.onDrawableLoaded(myFrames);
}
}
});
}
}).run();
}

// 4
private static void animateRawManually(List<MyFrame> myFrames,
ImageView imageView, Runnable onComplete) {
animateRawManually(myFrames, imageView, onComplete, 0);
}

// 5
private static void animateRawManually(final List<MyFrame> myFrames,
final ImageView imageView, final Runnable onComplete,
final int frameNumber) {
final MyFrame thisFrame = myFrames.get(frameNumber);

if (frameNumber == 0) {
thisFrame.drawable = new BitmapDrawable(imageView.getContext()
.getResources(), BitmapFactory.decodeByteArray(
thisFrame.bytes, 0, thisFrame.bytes.length));
} else {
MyFrame previousFrame = myFrames.get(frameNumber - 1);
((BitmapDrawable) previousFrame.drawable).getBitmap().recycle();
previousFrame.drawable = null;
previousFrame.isReady = false;
}

imageView.setImageDrawable(thisFrame.drawable);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Make sure ImageView hasn't been changed to a different Image
// in this time
if (imageView.getDrawable() == thisFrame.drawable) {
if (frameNumber + 1 < myFrames.size()) {
MyFrame nextFrame = myFrames.get(frameNumber + 1);

if (nextFrame.isReady) {
// Animate next frame
animateRawManually(myFrames, imageView, onComplete,
frameNumber + 1);
} else {
nextFrame.isReady = true;
}
} else {
if (onComplete != null) {
onComplete.run();
}
}
}
}
}, thisFrame.ration);

// Load next frame
if (frameNumber + 1 < myFrames.size()) {
new Thread(new Runnable() {
@Override
public void run() {
MyFrame nextFrame = myFrames.get(frameNumber + 1);
nextFrame.drawable = new BitmapDrawable(imageView
.getContext().getResources(),
BitmapFactory.decodeByteArray(nextFrame.bytes, 0,
nextFrame.bytes.length));
if (nextFrame.isReady) {
// Animate next frame
animateRawManually(myFrames, imageView, onComplete,
frameNumber + 1);
} else {
nextFrame.isReady = true;
}

}
}).run();
}
}

② 如何定位和解決android的內存溢出問題

進公司的第一個項目就遇到了一個比較難纏的客戶,不過總算對付過去了。在第一個項目中由於app載入的圖片、報表比較多,所以經常報出內存溢出的錯誤,很是頭疼。不過在project leader的帶領下,基本算是解決了。在此感謝一下my leader,Samuel.Cai辛苦了。哈哈......
以下是一些總結,ps:從我leader那邊搞過來的,和大家分享一下,哈哈
1. 當項目中包含大量圖片,或者圖片過大,可能會oom

方法1 : 等比例縮小圖片

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

方法2 : 對圖片採用軟引用,及時地進行recyle()操作

SoftReference<Bitmap> bitmap;
bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}

方法3 : 對復雜的listview進行合理設計與編碼:
1. 注意重用Adapter裡面的 convertView 以及holder機制的運用 ----- 參考資料: api demo list 14. Efficient Adapter

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];
for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}
v.setTag(holder);
} else {



2. 上述方法嘗試還未成功,可用 lazy loading data ----- 參考資料:api demo list 13

方法4 : 單個頁面,橫豎屏切換N次後 OOM
1. 看看頁面布局當中有沒有大的圖片,比如背景圖之類的。去除xml中相關設置,改在程序中設置背景圖(放在onCreate()方法中):
Drawable bg = getResources().getDrawable(R.drawable.bg);
XXX.setBackgroundDrawable(rlAdDetailone_bg);
在Activity destory時注意,bg.setCallback(null); 防止Activity得不到及時的釋放

2. 跟上面方法相似,直接把xml配置文件載入成view 再放到一個容器里,然後直接調用 this.setContentView(View view);方法

避免xml的重復載入

方法5 : 在頁面切換時盡可能少地重復使用一些代碼,比如:重復調用資料庫,反復使用某些對象等等......

方法6 :Android堆內存也可自己定義大小 和 優化Dalvik虛擬機的堆內存分配
注意若使用這種方法:project build target 只能選擇 <= 2.2 版本,否則編譯將通不過。 所以不建議用這種方式

private final static int CWJ_HEAP_SIZE= 6*1024*1024;
private final static float TARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

③ 如何定位和解決android的內存溢出問題

內存溢出的錯誤,沒辦法根據錯誤日誌定位到哪一行,但是只需要了解內存溢出可能出現的原因定位錯誤還是不難的。
1、代碼編碼不合理,錯誤的引用,比如Handler中持有Activity對象,但是Handler又在執行長時間的任務,就會造成Activity內存泄漏。
2、Bitmap的錯誤使用,大量使用bitmap卻又沒有釋放,很容易造成內存泄漏。
3、訪問資料庫Cursor或者數據流忘記關閉也會造成數據泄漏
4、Adapter錯誤的寫法,沒有對Item進行復用,也會內存泄漏
5、死循環,無限遞歸也會造成泄漏
如果實在找不到,可以藉助內存分析的工具,AndroidStdio,和Eclipse中都有,或者第三方都可以。

④ android內存溢出怎麼解決方案

一、Android中內存溢出泄露監測

1、內存監測工具DDMS --> Heap


2、使用方法比較簡單:

·選擇DDMS視圖,並打開Devices視圖和Heap視圖

·點擊選擇要監控的進程,比如:上圖中我選擇的是system_process

·選中Devices視圖界面上的"update heap"圖標

·點擊Heap視圖中的"Cause GC"按鈕(相當於向虛擬機發送了一次GC請求的操作)

3、在Heap視圖中選擇想要監控的Type,一般我們會觀察dataobject的total size的變化,正常情況下total size的值會穩定在一個有限的范圍內,也就說程序中的代碼良好,沒有造成程序中的對象不被回收的情況。如果代碼中存在沒有釋放對象引用的情況,那麼data object的total size在每次GC之後都不會有明顯的回落,隨著操作次數的增加而total size也在不斷的增加。(說明:選擇好data object後,不斷的操作應用,這樣才可以看出total size的變化)。如果totalsize確實是在不斷增加而沒有回落,說明程序中有沒有被釋放的資源引用。

二、Android中內存溢出解決:

通過DDMS工具可以判斷應用程序中是否存在內存泄漏的問題,那又如何定位到具體出現問題的代碼片段,最終找到問題所在呢?內存分析工具MAT Memory Analyzer Tool解決了這一難題。MAT工具是一個Eclipse 插件,同時也有單獨的RCP 客戶端,MAT工具的解析文件是.hprof,這個文件存放了某進程的內存快照。MAT工具定位內存泄漏具體位置的方法如下:

① 生成.hprof文件。Eclipse中生成.hprof文件的方法有很多,不同Android版本中生成.hprof的方式也稍有差別,但它們整體思路是一樣的。我們在DDMS界面選中想要分析的應用進程,在Devices視圖界面上方的一行圖標按鈕中,同時選中「Update Heap」和「Dump HPROF file」兩個按鈕,這時DDMS將會自動生成當前選中進程的.hprof文件。

② 將.hprof 文件導入到MAT工具中,MAT工具會自動解析並生成報告,點擊「Dominator Tree」按鈕,並按包分組,選擇已定義的包類點右鍵,在彈出的菜單中選擇List objects﹥With incoming references,這時會列出所有可疑的類。右鍵點擊某一項,並選擇Path to GC Roots﹥excludeweak/soft references,MAT工具會進一步篩選出跟程序相關的所有內存泄漏的類。這樣就可以追蹤到某一個產生內存溢出泄漏的類的具體代碼中。

⑤ android scrollview內存溢出怎麼解決

android scrollview內存溢出通常是由內存泄露導致。
1、內存泄露導致
由於我們程序的失誤,長期保持某些資源(如Context)的引用,垃圾回收器就無法回收它,當然該對象佔用的內存就無法被使用,這就造成內存泄露。
Android 中常見就是Activity被引用在調用finish之後卻沒有釋放,第二次打開activity又重新創建,這樣的內存泄露不斷的發生,則會導致內存的溢出。
Android的每個應用程序都會使用一個專有的Dalvik虛擬機實例來運行,它是由Zygote服務進程孵化出來的,也就是說每個應用程序都是在屬於自己的進程中運行的。Android為不同類型的進程分配了不同的內存使用上限,如果程序在運行過程中出現了內存泄漏的而造成應用進程使用的內存超過了這個上限,則會被系統視為內存泄漏,從而被kill掉,這使得僅僅自己的進程被kill掉,而不會影響其他進程.
2、佔用內存較多的對象
保存了多個耗用內存過大的對象(如Bitmap)或載入單個超大的圖片,造成內存超出限制。
使用方法比較簡單:
· 選擇DDMS視圖,並打開Devices視圖和Heap視圖
· 點擊選擇要監控的進程,比如:上圖中我選擇的是system_process
· 選中Devices視圖界面上的"update heap" 圖標
· 點擊Heap視圖中的"Cause GC" 按鈕(相當於向虛擬機發送了一次GC請求的操作)
在Heap視圖中選擇想要監控的Type,一般我們會觀察dataobject的 total size的變化,正常情況下total size的值會穩定在一個有限的范圍內,也就說程序中的代碼良好,沒有造成程序中的對象不被回收的情況。如果代碼中存在沒有釋放對象引用的情況,那麼data object的total size在每次GC之後都不會有明顯的回落,隨著操作次數的增加而total size也在不斷的增加。(說明:選擇好data object後,不斷的操作應用,這樣才可以看出total size的變化)。如果totalsize確實是在不斷增加而沒有回落,說明程序中有沒有被釋放的資源引用。那麼我們應該怎麼來定位呢?
Android中內存泄露定位
通過DDMS工具可以判斷應用程序中是否存在內存泄漏的問題,那又如何定位到具體出現問題的代碼片段,最終找到問題所在呢?內存分析工具MAT Memory Analyzer Tool解決了這一難題。MAT工具是一個Eclipse 插件,同時也有單獨的RCP 客戶端,MAT工具的解析文件是.hprof,這個文件存放了某進程的內存快照。MAT工具定位內存泄漏具體位置的方法如下:
① 生成.hprof文件。Eclipse中生成.hprof文件的方法有很多,不同Android版本中生成.hprof的方式也稍有差別,但它們整體思路是一樣的。我們在DDMS界面選中想要分析的應用進程,在Devices視圖界面上方的一行圖標按鈕中,同時選中「Update Heap」和「Dump HPROF file」兩個按鈕,這時DDMS將會自動生成當前選中進程的.hprof文件。
② 將.hprof 文件導入到MAT工具中,MAT工具會自動解析並生成報告,點擊「Dominator Tree」按鈕,並按包分組,選擇已定義的包類點右鍵,在彈出的菜單中選擇List objects﹥With incoming references,這時會列出所有可疑的類。右鍵點擊某一項,並選擇Path to GC Roots﹥excludeweak/soft references,MAT工具會進一步篩選出跟程序相關的所有內存泄漏的類。這樣就可以追蹤到某一個產生內存泄漏的類的具體代碼中。
使用MAT內存分析工具查找內存泄漏的根本思路是找到哪個類的對象的引用沒有被釋放,然後分析沒有被釋放的原因,最終定位到代碼中哪些片段存在著內存泄漏。

⑥ 如何解決Android內存溢出

模擬器RAM比較小,只有8M內存,當我放入的大量的圖片(每個100多K左右),就出現上面的原因。由於每張圖片先前是壓縮的情況。放入到Bitmap的時候,大小會變大,導致超出RAM內存,具體解決辦法如下://解決載入圖片內存溢出的問題
//Options只保存圖片尺寸大小,不保存圖片到內存
BitmapFactory.Optionsopts=newBitmapFactory.Options();
/*縮放的比例,縮放是很難按准備的比例進行縮放的,其值表明縮放的倍數,SDK中建議其值是2的指數值,值越大會導致圖片不清晰*/
opts.inSampleSize=4;
//回收bmp.recycle();還可以用到優化Dalvik虛擬機的堆內存分配對於Android平台來說,其託管層使用的DalvikJavaVM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型游戲或耗資源的應用中可能考慮手動干涉GC處理,使用dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程序堆內存的處理效率。當然具體原理我們可以參考開源工程,這里我們僅說下使用方法:privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;在程序onCreate時就可以調用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);Android堆內存也可自己定義大小對於一些Android項目,影響性能瓶頸的主要是Android自己內存管理機制問題,除了優化Dalvik虛擬機的堆內存分配外,我們還可以強制定義自己軟體的對內存大小,我們使用Dalvik提供的dalvik.system.VMRuntime類來設置最小堆內存為例:privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//設置最小heap內存為6MB大小。當然對於內存吃緊來說還可以通過手動干涉GC去處理

⑦ 怎麼解決android內存溢出問題的

一、內存溢出
現在的智能手機內存已經足夠大,但是對於一個應用程序來說智能手機當中稀缺的內存,仍然是應用程序的一大限制。在Android應用程序開發當中,最常見的內存溢出問題(OOM)是在載入圖片時出現的,尤其是在不知道圖片大小的情況下。
潛在的內存溢出操作主要包括以下幾點:
1、從網路當中載入用戶特定的圖片。因為直到我們在下載圖片的時候我們才知道圖片的大小。
2、向Gallery載入圖片。因為現在智能手機的攝像頭有很高的解析度,在載入圖片的時候需要最圖片進行處理,然後才能正常的使用。
請注意一點,Android系統是從系統全局的觀念來分配內存以載入圖片的,這就意味著,即使你的應用有足夠大的內存可用,內存溢出問題(out of memroy,OOM)仍然可能出現,因為所有的應用共享一個載入圖片的內存池(我們使用BitmapFactory進行解析)。
二、解決內存溢出問題
原文(Downsampling為了好理解,解釋為,程序A)。程序A通過調整像素,同時使其均衡化來降低圖片的解析度。因為不管問題圖片是因為太大而不能再手機上正常顯現,這個圖片都會縮短其寬度以在ImageView當中顯示,當圖片在ImageView當中顯示時,我們會因為載入一些沒有必要的原始圖片而浪費掉內存。
因此,更加有效的載入圖片的時機是在其初始化處理的時候。
以下是處理代碼:
1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){2:3: BitmapFactory.Options options = new BitmapFactory.Options();
14: options.inSampleSize = ssize;15:16: Bitmap bm = null;17: try{18: bm = decode(path, data, options);
19: }catch(OutOfMemoryError e){
39: result = result * 2;40:41: }42:43: return result;44: }三、AQuery當在Android應用程序開發當中使用AQuery組件時,處理這個問題會變的更加的簡單。

⑧ android內存溢出怎麼解決

Android雖然會自動管理內存,JAVA也有garbage collection (GC )內存回收機制。 但是如果程序在一次操作中打開幾個M的文件,那麼通常會出現下面的錯誤信息。 02-04 21:46:08.703: ERROR/dalvikvm-heap(2429): 1920000-byte external allocation

⑨ android開發製作簡單逐偵動畫時,因載入圖片過大從而導致內存溢出怎麼解決

換成這種載入方式可以減小內存消耗

	/**
*極大的減少圖片對內存的消耗
*/
publicstaticBitmapreadBitmap(Contextcontext,intid,Bitmap.Configconfig){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=config;//Bitmap.Config.RGB_565;//表示16位點陣圖565代表對應三原色占的位數圖片有損,默認為RGB_8888
opt.inInputShareable=true;
opt.inPurgeable=true;//設置圖片可以被回收
InputStreamis=context.getResources().openRawResource(id);
returnBitmapFactory.decodeStream(is,null,opt);
}

⑩ 安卓開發 animationdrawable 幀動畫內存溢出怎麼解決

第一種:在事件監聽中start AnimationDrawable 下面一個例子舉例 當一個視圖樹將要繪制時產生事件

[java] view
plainprint?

AnimationDrawable ad;

ImageView iv = (ImageView) findViewById(R.id.animation_view);

iv.setBackgroundResource(R.drawable.animation);

ad = (AnimationDrawable) iv.getBackground();

iv.getViewTreeObserver().addOnPreDrawListener(opdl);

OnPreDrawListener opdl=new OnPreDrawListener(){

@Override

public boolean onPreDraw() {

ad.start();

return true; //注意此行返回的值

}

};
AnimationDrawable ad;
ImageView iv = (ImageView) findViewById(R.id.animation_view);
iv.setBackgroundResource(R.drawable.animation);
ad = (AnimationDrawable) iv.getBackground();
iv.getViewTreeObserver().addOnPreDrawListener(opdl);

OnPreDrawListener opdl=new OnPreDrawListener(){
@Override
public boolean onPreDraw() {
ad.start();
return true; //注意此行返回的值
}

};

第二種方式啟動動畫:(在Activity啟動時會自動運行動畫)

[java] view
plainprint?

ImageView image = (ImageView) findViewById(R.id.animation_view);

image.setBackgroundResource(R.anim.oldsheep_wait);

animationDrawable = (AnimationDrawable) image.getBackground();

RunAnim runAnim=new RunAnim();

runAnim.execute("");

class RunAnim extends AsyncTask<String, String, String>

{

@Override

protected String doInBackground(String params)

{

if (!animationDrawable.isRunning())

{

animationDrawable.stop();

animationDrawable.start();

}

return "";

}

}
ImageView image = (ImageView) findViewById(R.id.animation_view);
image.setBackgroundResource(R.anim.oldsheep_wait);
animationDrawable = (AnimationDrawable) image.getBackground();
RunAnim runAnim=new RunAnim();
runAnim.execute("");

class RunAnim extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String params)
{
if (!animationDrawable.isRunning())
{
animationDrawable.stop();
animationDrawable.start();
}
return "";
}
}

第三種方式啟動動畫:(在Activity啟動時會自動運行動畫)

[java] view
plainprint?

ImageView image = (ImageView) findViewById(R.id.animation_view);

image.setBackgroundResource(R.anim.oldsheep_wait);

animationDrawable = (AnimationDrawable) image.getBackground();

image.post(new Runnable()

{

@Override

public void run()

{

animationDrawable.start();

}

});
ImageView image = (ImageView) findViewById(R.id.animation_view);
image.setBackgroundResource(R.anim.oldsheep_wait);
animationDrawable = (AnimationDrawable) image.getBackground();
image.post(new Runnable()
{
@Override
public void run()
{
animationDrawable.start();
}
});

第四種方式啟動動畫:(在Activity啟動時會自動運行動畫)

[java] view
plainprint?

ImageView image = (ImageView) findViewById(R.id.animation_view);

image.setBackgroundResource(R.anim.oldsheep_wait);

animationDrawable = (AnimationDrawable) image.getBackground();

@Override

public void onWindowFocusChanged(boolean hasFocus)

{

animationDrawable.start();

super.onWindowFocusChanged(hasFocus);

}
ImageView image = (ImageView) findViewById(R.id.animation_view);
image.setBackgroundResource(R.anim.oldsheep_wait);
animationDrawable = (AnimationDrawable) image.getBackground();

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
animationDrawable.start();
super.onWindowFocusChanged(hasFocus);
}

熱點內容
linuxrootssh 發布:2025-03-04 03:44:59 瀏覽:839
如何獲取保險配置 發布:2025-03-04 03:42:56 瀏覽:651
海蝦號存放處密碼門密碼是多少 發布:2025-03-04 03:30:29 瀏覽:131
ss搭建腳本 發布:2025-03-04 03:22:35 瀏覽:480
阿里雲伺服器系統升級 發布:2025-03-04 02:53:39 瀏覽:743
大學生資料庫 發布:2025-03-04 02:41:19 瀏覽:810
賣面膜腳本 發布:2025-03-04 02:39:02 瀏覽:572
安卓手機如何下載只狼 發布:2025-03-04 02:31:50 瀏覽:498
三菱編程works2 發布:2025-03-04 02:12:23 瀏覽:394
ftp伺服器架設工具 發布:2025-03-04 02:02:39 瀏覽:907