Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android异步任务帧动画_Android_Android Asynctask_Android Animation - Fatal编程技术网

Android异步任务帧动画

Android异步任务帧动画,android,android-asynctask,android-animation,Android,Android Asynctask,Android Animation,首先,我尝试了很多方法在Android中制作平滑的动画,可能我最好的选择是使用AnimationDrawable。在旧设备内存不足之前,一切都很完美。原因很明显是帧数,在我的例子中是75。这就是我使用AsyncTask和Thread.sleep()来设置帧动画的原因。为了避免动画延迟,我使用了一个堆栈,其中我预加载了前10帧,然后只弹出使用过的帧并推送一个新帧,直到没有更多的帧。一切都比我预期的好,但唯一的问题是,在动画结束时,最后一帧消失了,我整天都在打我的头,以了解为什么会发生这种情况,但显

首先,我尝试了很多方法在Android中制作平滑的动画,可能我最好的选择是使用AnimationDrawable。在旧设备内存不足之前,一切都很完美。原因很明显是帧数,在我的例子中是75。这就是我使用AsyncTaskThread.sleep()来设置帧动画的原因。为了避免动画延迟,我使用了一个堆栈,其中我预加载了前10帧,然后只弹出使用过的帧并推送一个新帧,直到没有更多的帧。一切都比我预期的好,但唯一的问题是,在动画结束时,最后一帧消失了,我整天都在打我的头,以了解为什么会发生这种情况,但显然没有成功。下面是活动中的代码,我在其中调用了动画以及动画代码所在的文件

SplashActivity.java

private void startAnimation() {
        gifImageView = (LogoAnimImageView) findViewById(R.id.gifImageView);
        gifImageView.setSplashActivityContext(this);
        gifImageView.setBackgroundResource(R.drawable.logo_frame_0);
        gifImageView.setAnimImageViewListener(new LogoAnimImageView.LogoAnimImageViewInterface() {
            @Override
            public void animationEnd() {
                mAnimationFinished = true;
                LoadNextActivity();

            }
        });
        gifImageView.startLogoAnimation();

    }
public class LogoAnimImageView extends ImageView {

    public interface LogoAnimImageViewInterface {
        void animationEnd();
    }

    final Handler mHandler = new Handler();

    private Stack<Drawable> mImageStack;

    private SplashActivity mSplashActivity;

    private LogoAnimImageViewInterface mListener;

    private int mFrameIndex;

    private int[] mResources = {R.drawable.logo_frame_0,R.drawable.logo_frame_1,R.drawable.logo_frame_2,R.drawable.logo_frame_3,
            R.drawable.logo_frame_4,R.drawable.logo_frame_5,R.drawable.logo_frame_6,
            R.drawable.logo_frame_7,R.drawable.logo_frame_8,R.drawable.logo_frame_9,R.drawable.logo_frame_10,
            R.drawable.logo_frame_11,R.drawable.logo_frame_12,R.drawable.logo_frame_13,R.drawable.logo_frame_14,
            R.drawable.logo_frame_15,R.drawable.logo_frame_16,R.drawable.logo_frame_17,R.drawable.logo_frame_18,
            R.drawable.logo_frame_19,R.drawable.logo_frame_20,R.drawable.logo_frame_21,R.drawable.logo_frame_22,
            R.drawable.logo_frame_23,R.drawable.logo_frame_24,R.drawable.logo_frame_25,R.drawable.logo_frame_26,
            R.drawable.logo_frame_27,R.drawable.logo_frame_28,R.drawable.logo_frame_29,R.drawable.logo_frame_30,
            R.drawable.logo_frame_31,R.drawable.logo_frame_32,R.drawable.logo_frame_33,R.drawable.logo_frame_34,
            R.drawable.logo_frame_35,R.drawable.logo_frame_36,R.drawable.logo_frame_37,R.drawable.logo_frame_38,
            R.drawable.logo_frame_39,R.drawable.logo_frame_40,R.drawable.logo_frame_41,R.drawable.logo_frame_42,
            R.drawable.logo_frame_43,R.drawable.logo_frame_44,R.drawable.logo_frame_45,R.drawable.logo_frame_46,
            R.drawable.logo_frame_47,R.drawable.logo_frame_48,R.drawable.logo_frame_49,R.drawable.logo_frame_50,
            R.drawable.logo_frame_51,R.drawable.logo_frame_52,R.drawable.logo_frame_53,R.drawable.logo_frame_54,
            R.drawable.logo_frame_55,R.drawable.logo_frame_56,R.drawable.logo_frame_57,R.drawable.logo_frame_58,
            R.drawable.logo_frame_59,R.drawable.logo_frame_60,R.drawable.logo_frame_61,R.drawable.logo_frame_62,
            R.drawable.logo_frame_63,R.drawable.logo_frame_64,R.drawable.logo_frame_65,R.drawable.logo_frame_66,
            R.drawable.logo_frame_67,R.drawable.logo_frame_68,R.drawable.logo_frame_69,R.drawable.logo_frame_70,
            R.drawable.logo_frame_71,R.drawable.logo_frame_72,R.drawable.logo_frame_73,R.drawable.logo_frame_74

    };

    public LogoAnimImageView(Context context) {
        super(context);
    }

    public LogoAnimImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LogoAnimImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void startLogoAnimation() {

        mFrameIndex = 10;
        mImageStack = new Stack<Drawable>();
        for (int i=1;i<=mFrameIndex;i++) {
            Drawable drawable = getDrawable(mResources[i]);
            mImageStack.push(drawable);
        }
        mFrameIndex++;
        mSplashActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                new LogoAnimOperation().execute((Object)null);
            }
        });



    }

    public void setSplashActivityContext(SplashActivity splashActivity) {
        this.mSplashActivity = splashActivity;
    }

    public void setAnimImageViewListener(LogoAnimImageViewInterface listener) {
        this.mListener = listener;
    }

    private Drawable getDrawable(int id) {
        Drawable drawable;
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
            drawable = mSplashActivity.getDrawable(id);
        } else {
            drawable = mSplashActivity.getResources().getDrawable(id);
        }
        return drawable;
    }

    private class LogoAnimOperation extends AsyncTask<Object,Void,String> {

        @Override
        protected String doInBackground(Object... params) {
            int number=1;
            while (mImageStack.size() > 1) {
                try {
                    Thread.sleep(40);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                final Drawable drawable = mImageStack.pop();
                mSplashActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            LogoAnimImageView.this.setBackground(drawable);
                        }
                        else {
                            LogoAnimImageView.this.setBackgroundDrawable(drawable);
                        }
                        if (mFrameIndex < mResources.length) {
                            Drawable newDrawable = getDrawable(mResources[mFrameIndex]);
                            mImageStack.push(newDrawable);
                            mFrameIndex++;
                        }

                    }
                });

            }

            return "";
        }

        @Override
        protected void onPostExecute(String s) {
            mSplashActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Drawable drawable = getDrawable(R.drawable.logo_frame_74);
                    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        LogoAnimImageView.this.setBackground(drawable);
                    }
                    else {
                        LogoAnimImageView.this.setBackgroundDrawable(drawable);
                    }
                }
            });
            mListener.animationEnd();
            super.onPostExecute(s);
        }
    }

}
logoanimageview.java

private void startAnimation() {
        gifImageView = (LogoAnimImageView) findViewById(R.id.gifImageView);
        gifImageView.setSplashActivityContext(this);
        gifImageView.setBackgroundResource(R.drawable.logo_frame_0);
        gifImageView.setAnimImageViewListener(new LogoAnimImageView.LogoAnimImageViewInterface() {
            @Override
            public void animationEnd() {
                mAnimationFinished = true;
                LoadNextActivity();

            }
        });
        gifImageView.startLogoAnimation();

    }
public class LogoAnimImageView extends ImageView {

    public interface LogoAnimImageViewInterface {
        void animationEnd();
    }

    final Handler mHandler = new Handler();

    private Stack<Drawable> mImageStack;

    private SplashActivity mSplashActivity;

    private LogoAnimImageViewInterface mListener;

    private int mFrameIndex;

    private int[] mResources = {R.drawable.logo_frame_0,R.drawable.logo_frame_1,R.drawable.logo_frame_2,R.drawable.logo_frame_3,
            R.drawable.logo_frame_4,R.drawable.logo_frame_5,R.drawable.logo_frame_6,
            R.drawable.logo_frame_7,R.drawable.logo_frame_8,R.drawable.logo_frame_9,R.drawable.logo_frame_10,
            R.drawable.logo_frame_11,R.drawable.logo_frame_12,R.drawable.logo_frame_13,R.drawable.logo_frame_14,
            R.drawable.logo_frame_15,R.drawable.logo_frame_16,R.drawable.logo_frame_17,R.drawable.logo_frame_18,
            R.drawable.logo_frame_19,R.drawable.logo_frame_20,R.drawable.logo_frame_21,R.drawable.logo_frame_22,
            R.drawable.logo_frame_23,R.drawable.logo_frame_24,R.drawable.logo_frame_25,R.drawable.logo_frame_26,
            R.drawable.logo_frame_27,R.drawable.logo_frame_28,R.drawable.logo_frame_29,R.drawable.logo_frame_30,
            R.drawable.logo_frame_31,R.drawable.logo_frame_32,R.drawable.logo_frame_33,R.drawable.logo_frame_34,
            R.drawable.logo_frame_35,R.drawable.logo_frame_36,R.drawable.logo_frame_37,R.drawable.logo_frame_38,
            R.drawable.logo_frame_39,R.drawable.logo_frame_40,R.drawable.logo_frame_41,R.drawable.logo_frame_42,
            R.drawable.logo_frame_43,R.drawable.logo_frame_44,R.drawable.logo_frame_45,R.drawable.logo_frame_46,
            R.drawable.logo_frame_47,R.drawable.logo_frame_48,R.drawable.logo_frame_49,R.drawable.logo_frame_50,
            R.drawable.logo_frame_51,R.drawable.logo_frame_52,R.drawable.logo_frame_53,R.drawable.logo_frame_54,
            R.drawable.logo_frame_55,R.drawable.logo_frame_56,R.drawable.logo_frame_57,R.drawable.logo_frame_58,
            R.drawable.logo_frame_59,R.drawable.logo_frame_60,R.drawable.logo_frame_61,R.drawable.logo_frame_62,
            R.drawable.logo_frame_63,R.drawable.logo_frame_64,R.drawable.logo_frame_65,R.drawable.logo_frame_66,
            R.drawable.logo_frame_67,R.drawable.logo_frame_68,R.drawable.logo_frame_69,R.drawable.logo_frame_70,
            R.drawable.logo_frame_71,R.drawable.logo_frame_72,R.drawable.logo_frame_73,R.drawable.logo_frame_74

    };

    public LogoAnimImageView(Context context) {
        super(context);
    }

    public LogoAnimImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LogoAnimImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void startLogoAnimation() {

        mFrameIndex = 10;
        mImageStack = new Stack<Drawable>();
        for (int i=1;i<=mFrameIndex;i++) {
            Drawable drawable = getDrawable(mResources[i]);
            mImageStack.push(drawable);
        }
        mFrameIndex++;
        mSplashActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                new LogoAnimOperation().execute((Object)null);
            }
        });



    }

    public void setSplashActivityContext(SplashActivity splashActivity) {
        this.mSplashActivity = splashActivity;
    }

    public void setAnimImageViewListener(LogoAnimImageViewInterface listener) {
        this.mListener = listener;
    }

    private Drawable getDrawable(int id) {
        Drawable drawable;
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
            drawable = mSplashActivity.getDrawable(id);
        } else {
            drawable = mSplashActivity.getResources().getDrawable(id);
        }
        return drawable;
    }

    private class LogoAnimOperation extends AsyncTask<Object,Void,String> {

        @Override
        protected String doInBackground(Object... params) {
            int number=1;
            while (mImageStack.size() > 1) {
                try {
                    Thread.sleep(40);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                final Drawable drawable = mImageStack.pop();
                mSplashActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            LogoAnimImageView.this.setBackground(drawable);
                        }
                        else {
                            LogoAnimImageView.this.setBackgroundDrawable(drawable);
                        }
                        if (mFrameIndex < mResources.length) {
                            Drawable newDrawable = getDrawable(mResources[mFrameIndex]);
                            mImageStack.push(newDrawable);
                            mFrameIndex++;
                        }

                    }
                });

            }

            return "";
        }

        @Override
        protected void onPostExecute(String s) {
            mSplashActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Drawable drawable = getDrawable(R.drawable.logo_frame_74);
                    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        LogoAnimImageView.this.setBackground(drawable);
                    }
                    else {
                        LogoAnimImageView.this.setBackgroundDrawable(drawable);
                    }
                }
            });
            mListener.animationEnd();
            super.onPostExecute(s);
        }
    }

}
public类logoanimmageview扩展了ImageView{
公共接口LogoAnimageViewInterface{
void animationEnd();
}
最终处理程序mHandler=新处理程序();
私有堆栈;
私人喷溅活动;
私有loganimageviewinterface mListener;
私有整数索引;
private int[]mResources={R.drawable.logo_frame_0,R.drawable.logo_frame_1,R.drawable.logo_frame_2,R.drawable.logo_frame_3,
R.drawable.logo_frame_4,R.drawable.logo_frame_5,R.drawable.logo_frame_6,
R.drawable.logo_frame_7,R.drawable.logo_frame_8,R.drawable.logo_frame_9,R.drawable.logo_frame_10,
R.drawable.logo_frame_11,R.drawable.logo_frame_12,R.drawable.logo_frame_13,R.drawable.logo_frame_14,
R.drawable.logo_frame_15,R.drawable.logo_frame_16,R.drawable.logo_frame_17,R.drawable.logo_frame_18,
R.drawable.logo_frame_19,R.drawable.logo_frame_20,R.drawable.logo_frame_21,R.drawable.logo_frame_22,
R.drawable.logo_frame_23,R.drawable.logo_frame_24,R.drawable.logo_frame_25,R.drawable.logo_frame_26,
R.drawable.logo_frame_27,R.drawable.logo_frame_28,R.drawable.logo_frame_29,R.drawable.logo_frame_30,
R.drawable.logo_frame_31,R.drawable.logo_frame_32,R.drawable.logo_frame_33,R.drawable.logo_frame_34,
R.drawable.logo_frame_35,R.drawable.logo_frame_36,R.drawable.logo_frame_37,R.drawable.logo_frame_38,
R.drawable.logo_frame_39,R.drawable.logo_frame_40,R.drawable.logo_frame_41,R.drawable.logo_frame_42,
R.drawable.logo_frame_43,R.drawable.logo_frame_44,R.drawable.logo_frame_45,R.drawable.logo_frame_46,
R.drawable.logo_frame_47,R.drawable.logo_frame_48,R.drawable.logo_frame_49,R.drawable.logo_frame_50,
R.drawable.logo_frame_51,R.drawable.logo_frame_52,R.drawable.logo_frame_53,R.drawable.logo_frame_54,
R.drawable.logo_frame_55,R.drawable.logo_frame_56,R.drawable.logo_frame_57,R.drawable.logo_frame_58,
R.drawable.logo_frame_59,R.drawable.logo_frame_60,R.drawable.logo_frame_61,R.drawable.logo_frame_62,
R.drawable.logo_frame_63,R.drawable.logo_frame_64,R.drawable.logo_frame_65,R.drawable.logo_frame_66,
R.drawable.logo_frame_67,R.drawable.logo_frame_68,R.drawable.logo_frame_69,R.drawable.logo_frame_70,
R.drawable.logo_frame_71,R.drawable.logo_frame_72,R.drawable.logo_frame_73,R.drawable.logo_frame_74
};
公共LogoAnimageView(上下文){
超级(上下文);
}
公共LogoAnimageView(上下文、属性集属性){
超级(上下文,attrs);
}
公共LogoAnimageView(上下文上下文、属性集属性、int-defStyleAttr){
super(上下文、attrs、defStyleAttr);
}
公共动画(){
mFrameIndex=10;
mImageStack=新堆栈();
for(inti=1;i=android.os.Build.VERSION\u code.LOLLIPOP){
drawable=mSplashActivity.getDrawable(id);
}否则{
drawable=mSplashActivity.getResources().getDrawable(id);
}
回拉;
}
私有类操作扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(对象…参数){
整数=1;
而(mImageStack.size()>1){
试一试{
睡眠(40);
}捕捉(中断异常e){
e、 printStackTrace();
}
final Drawable Drawable=mImageStack.pop();
mSplashActivity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
if(android.os.Build.VERSION.SDK\u INT>=Build.VERSION\u code.JELLY\u BEAN){
LogoAnimageView.this.setBackground(可绘制);
}
否则{
LogoAnimageView.this.setBackgroundDrawable(可绘制);
}
if(mFrameIndex=Build.VERSION\u code.JELLY\u BEAN){
LogoAnimageView.this.setBackground(可绘制);
}
否则{
L