當前位置:首頁 » 安卓系統 » android圖片幀動畫

android圖片幀動畫

發布時間: 2022-05-22 23:48:13

1. android 幀動畫 如何在代碼中設置時長

嗯,如果你的圖片也是採用代碼載入的話,可以如下這么寫

java">mFrameAnimation=newAnimationDrawable();
mFrameAnimation.addFrame(getResources().getDrawable(R.drawable.icon1),200);
mFrameAnimation.addFrame(getResources().getDrawable(R.drawable.icon2),200);

後面那個 200 就是時長了

如果你想從res/drawable 讀取動畫,然後再修改時長的話,只能循環遍歷再修改了,抱歉,因為電腦問題,沒法給你完整的演示代碼,關於 Android 幀動畫,你可以訪問Android Frame Animation 幀動畫

2. android中的動畫有哪幾類,它們的特點和區別是什麼

android動畫有兩類:
一種是tweened animation(漸變動畫)
一種是frame by frame(逐幀動畫)
特點:
漸變動畫是通過改變view的大小、旋轉的角度、透明度、位置來產生動畫,可以控制動畫的播放快慢以及加速度。
逐幀動畫是用一組圖片輪流繪制,產生動畫的感覺。類似於gif圖片。
區別:
漸變動畫的所有操作是通過矩陣變換對同一個物體(繪制的一個view或者圖片)進行操作產生動畫。
而逐幀動畫是多個物體(多張圖片)進行繪制,可以說這多張圖片是不相關的(從播放的角度來看只能說是內容相關)。

3. android 幀動畫和補間動畫可以同時使用嗎

幀動畫——FrameAnimation
將一系列圖片有序播放,形成動畫的效果。其本質是一個Drawable,是一系列圖片的集合,本身可以當做一個圖片一樣使用
在Drawable文件夾下,創建animation-list為根節點的資源文件
<animation-list android:oneshot="false">
<item android:drawable="@drawable/img1" android:ration="100"/>
<item android:drawable="@drawable/img2" android:ration="100"/>
<item android:drawable="@drawable/img3" android:ration="100"/>
<item android:drawable="@drawable/img4" android:ration="100"/>
</animation-list>

oneshot:是否只播放一次
drawable:一幀引用的圖片
ration:一幀播放的時間
播放動畫
將動畫作為控制項的背景
((AnimationDrawable)view.getBackground()).start();

Animation常用屬性
ration:動畫時間
repeatCount:重復次數 infinite無限次
fillAfter:是否停止在最後一幀
repeatMode:重復模式 值:restart重新開始,reserve反復
startOffset:開始延遲時間

補間動畫 Tween Animation
只能應用於View對象,只支持部分屬性,View animation值改變了View繪制的位置,並沒有改變對象本身的真實位置
可以使用XML定義也可以使用代碼定義 XML定義的動畫放在/res/anim/文件夾內

開始動畫 通過view的startAnimation(Animation a) 參數定義的動畫

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

1.anin_searh.xml

[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/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
* 原文鏈接:http://stackoverflow.com/questions/8692328/causing-outofmemoryerror-in-frame-by-frame-animation-in-android
* 主要使用了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();
}
}

5. android 怎麼添加幀動畫效果

Android的SDK提供了三種類型的動畫,分別是補間動畫、逐幀動畫和插值屬性動畫。下面先介紹第一種動畫效果-補間動畫。 補間動畫可以應用於View,讓開發者可以定義一些關於大小、位置、旋轉和透明度的改變效果,達到讓View的內容動起來的效果。 補間動畫是使用Animation類創建的,它有4個直接子類,分別實現不同的動畫效果,分別為: AlphaAnimation 漸變透明度動畫效果,即淡入淡出效果 ScaleAnimation 漸變尺寸伸縮動畫效果,即縮放效果 TranslateAnimation 畫面轉換位置移動動畫效果,移動效果 RotateAnimation 畫面轉移旋轉動畫效果,即旋轉效果 要使用補間動畫的效果,有兩種方法,第一種是在XML文件中設置動畫效果;第二種是在Java代碼中設置。下面分別介紹這兩種方法: 1.在XML文件中設置方式: 在Android項目的res目錄下新建anim文件夾,然後在anim文件夾下新建firstanim.xml,添加動畫效果的配置代碼,示例代碼如下: [html] android:fromAlpha="0.1" android:toAlpha="1.0" android:ration="3000" /> android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.4" android:fromYScale="0.0" android:toYScale="1.4" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:ration="700" /> android:fromXDelta="30" android:toXDelta="-80" android:fromYDelta="30" android:toYDelta="300" android:ration="2000" /> android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" android:toDegrees="+350" android:pivotX="50%" android:pivotY="50%" android:ration="3000" /> android:fromAlpha="0.1" android:toAlpha="1.0" android:ration="3000" /> android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.4" android:fromYScale="0.0" android:toYScale="1.4" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:ration="700" /> android:fromXDelta="30" android:toXDelta="-80" android:fromYDelta="30" android:toYDelta="300" android:ration="2000" /> android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" android:toDegrees="+350" android:pivotX="50%" android:pivotY="50%" android:ration="3000" /> 在Activity中的onCreate()方法中,獲取在XML中配置的動畫效果,代碼如下: [java] Animation animation= AnimationUtils.loadAnimation(this,R.anim.firstanim); Animation animation= AnimationUtils.loadAnimation(this,R.anim.firstanim); 如果這個動畫效果使用在一個ImageView上,可以參考如下代碼: [java] imageView.startAnimation(animation); imageView.startAnimation(animation);2.在Java代碼中設置方式: 以AlphaAnimation為例, [java] //首先聲明Animation的一個對象 private Animation alpha; //在Activity的onCreate()方法中實例化這個對象 alpha=new AlphaAnimation(0.1f, 1.0f); //設置動畫持續時間為3秒 alpha.setDuration(3000); //首先聲明Animation的一個對象 private Animation alpha; //在Activity的onCreate()方法中實例化這個對象 alpha=new AlphaAnimation(0.1f, 1.0f); //設置動畫持續時間為3秒 alpha.setDuration(3000); 如果這個動畫效果使用在一個ImageView上,可以參考如下代碼: [java] imageView.startAnimation(alpha); imageView.startAnimation(alpha);

6. Android 中的動畫有哪幾類,它們的特點和區別是什麼

Android包含三種動畫:

ViewAnimation、 Drawable Animation、Property Animation。

ViewAnimation(Tween Animation補間動畫):


動畫的對象除了傳統的View對象,還可以是Object對象,動畫之後,Object對象的屬性值被實實在在的改變了。Property animation能夠通過改變View對象的實際屬性來實現View動畫。任何時候View屬性的改變,View能自動調用invalidate()來刷新。

7. android如何設置Drawable Animation逐幀動畫每一幀的持續時間

一.原理: 對幾張圖片按照順序一張一張進行播放,視覺上感覺是連續播放的動畫效果。 二.步驟: 1.在res/drawable放入幾張圖片 2.在res/drawable下新建一個drawable resource file,比如命名為gril_animation.xml,根節點選擇animation-list,點擊ok3.編輯gril_animation.xml文件,以animation-list作為根節點,item作為子節點,每個item就是一幀,即一個drawable圖片
圖片資源是在網路上搜索幀動畫找的,然後用了一個很笨的辦法,一小張一小張截下來的,總之能用就行了,不要求太完美了@-@

8. Android studio的動幀動畫程序,想讓那六張圖片每隔一秒播放,怎麼設置,謝謝。

在資源文件夾的drawable 創建一個xml文件 把根節點selector 換成animation-list
然後在節點內設置圖片和時間如下設置
<item android:drawable="" android:ration=""/>
android:drawable="" 設置圖片
android:ration="" 設置圖片時間 毫秒算

在animation-list節點設置下面代碼為是否播放一次 true為一次 false為循環播放
android:oneshot=""

9. android 快速切換圖片 逐幀動畫

android上有太多東西可以實現了

  1. 直接使用ImageView +AnimationDrawable

  2. ImageSwitcher

  3. PowerImageView

  4. viewflipper

    基本都能實現樓主的需求,也可以自己繼承imageview,用定時器來實現

10. android逐幀動畫如何讓動畫停在最後一張

在工程res文件目錄下新建一個anim文件夾,在裡面新建一個start_animation.xml格式文件,此文件用來定義動畫播放圖片的順序及每一張圖片顯示停留時間。
在這里增加android:oneshot="true"屬性, 會停留在最後一幀

熱點內容
編程掙錢嗎 發布:2025-08-22 06:31:21 瀏覽:1000
敬請存儲 發布:2025-08-22 06:25:42 瀏覽:609
linuxphp7配置 發布:2025-08-22 06:17:01 瀏覽:414
shellftp腳本 發布:2025-08-22 06:11:57 瀏覽:796
sql資料庫打開 發布:2025-08-22 05:58:36 瀏覽:888
伺服器IP怎麼找回 發布:2025-08-22 05:41:28 瀏覽:606
手機百度怎樣上傳視頻 發布:2025-08-22 05:28:08 瀏覽:832
亂碼源碼 發布:2025-08-22 05:26:41 瀏覽:204
c語言中基本的數據類型 發布:2025-08-22 05:24:25 瀏覽:809
Android資料庫開源 發布:2025-08-22 05:18:02 瀏覽:631