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

android幀動畫

發布時間: 2022-01-10 08:02:55

A. Android 幀動畫何時停止播放

可以通過一些其他方式來做到。
方式一,當動畫開始start之後,我們可以通過檢測是否到達幀動畫的最後一幀,來確定動畫是否播完。這種方式可以保證動畫播完。
方式二,重寫AnimationDrawable,獲得totalDuration,然後動畫start之後的totalDuration,調用結束的介面回調onAnimationFinshed()。為什麼必須重寫呢?因為,AnimationDrawable僅提供了每一幀的ration,而不能直接獲得動畫總的ration。
當然還有一些變種的方法,但是其大體思路都應該差不多。至於動畫是否流暢播放,這要取決於你播放動畫的時候,系統的繁忙程度。

B. 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);

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

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

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

D. 安卓幀動畫幀數太多時怎麼優化效率

方法一:用Bitmap.createBitmap(bitmap, currentFrame*w, (currentFrame/4)*h, w, h)函數把一個一個動作小圖剪切後賦值給bitmap數組然後再一幀一幀繪制出來產生動畫。
方法二:把以上大圖用圖像處理軟體先手動16張小圖,再讀到bitmap數組中,然後再一幀一幀繪制出來產生動畫(這種不用createBitmap應該比方法一效率高省內存)。
方法三:用canvas.clipRect(x,y,x+w,y+h)指定單幀大小繪制區域,然後用canvas.drawBitmap(bitmap,x-currentFrame*w,y-(currentFrame/4)*h,paint)方法繪制出來產生動畫。

E. android怎樣在代碼中設置幀動畫

F. android做幀動畫有沒有方法可以達到屏幕刷新率60hz

不是這樣的,眼睛的另一個重要特性是視覺惰性,即光象一旦在視網膜上形成,視覺將會對這個光象的感覺維持一個有限的時間,這種生理現象叫做視覺暫留性。對於中等亮度的光刺激,視覺暫留時間約為0.05至0.2秒。幀多圖像清晰度高,比如高清倍頻彩電為100-120HZ,閃爍感小,更加清晰。過高了,人眼也感覺不了。高速攝像機超高速拍攝幀速率可在30幀/秒至百萬幀/秒之間變化。 影片由一張張連續拍攝的圖片組成,每幅圖片就是一幀。新型攝像設備的拍攝速度可達每秒600萬幀,是普通攝像機的約1000倍,因此能拍攝快速移動的目標,其靈敏度和清晰度都達到極高水平。

G. 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圖片
圖片資源是在網路上搜索幀動畫找的,然後用了一個很笨的辦法,一小張一小張截下來的,總之能用就行了,不要求太完美了@-@

H. 如何解決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();
}
}

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

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

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 幀動畫

J. android開發怎麼在fragment中使用幀動畫

FragmentTransaction ft = getFragmentManager().beginTransaction();
//設置進入退出動畫
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

熱點內容
單片機android 發布:2024-09-20 09:07:24 瀏覽:765
如何提高三星a7安卓版本 發布:2024-09-20 08:42:35 瀏覽:664
如何更換伺服器網站 發布:2024-09-20 08:42:34 瀏覽:311
子彈演算法 發布:2024-09-20 08:41:55 瀏覽:289
手機版網易我的世界伺服器推薦 發布:2024-09-20 08:41:52 瀏覽:817
安卓x7怎麼邊打游戲邊看視頻 發布:2024-09-20 08:41:52 瀏覽:162
sql資料庫安全 發布:2024-09-20 08:31:32 瀏覽:94
蘋果連接id伺服器出錯是怎麼回事 發布:2024-09-20 08:01:07 瀏覽:507
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:658
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:481