主题 : 解决 动画在部分型号的安卓手机上播放会不正常的问题
级别: 侠客
可可豆: 326 CB
威望: 322 点
在线时间: 136(时)
发自: Web Page
解决 动画在部分型号的安卓手机上播放会不正常的问题&&&
本帖被 eddy.zhang 执行提前操作()
关于 动画在部分型号的安卓手机上播放会不正常的问题现在有两个暂时的解决方案1:在 CCSpriteFrameCacheHelper里面 的 找到CCTextureAtlas *CCSpriteFrameCacheHelper::getTexureAtlasWithTexture(CCTexture2D *texture) 函数修改 atlas = CCTextureAtlas::createWithTexture(texture, 4);为 atlas = CCTextureAtlas::createWithTexture(texture, 32); 或者 更高的数2:这个是 cocos2d-x 提供的 暂时的方法,用的是一个不太高效但是比较安全的办法解决问题的在 CCTextureAtlas 里面找到bool CCTextureAtlas::resizeCapacity(unsigned int newCapacity) 函数修改 mapBuffers();为#if CC_TEXTURE_ATLAS_USE_VAO glDeleteVertexArrays(1,&m_uVAOname);#endif glDeleteBuffers(2, m_pBuffersVBO); #if CC_TEXTURE_ATLAS_USE_VAO setupVBOandVAO();#else setupVBO();#endif //mapBuffers();[ 此帖被hanrea在 11:52重新编辑 ]
级别: 骑士
UID: 219300
可可豆: 1311 CB
威望: 1049 点
在线时间: 159(时)
发自: Web Page
第二个方法 结果:模拟器正常 在出现动画不完全显示的手机上测试,动画依然不完全显示多了个现象,运行一会儿嗡嗡的震动,过会儿死机了
走的更高,看的更远
级别: 骑士
UID: 219300
可可豆: 1311 CB
威望: 1049 点
在线时间: 159(时)
发自: Web Page
回 楼主(jjyinkailejj) 的帖子
两种方法都试了,没解决动画不完全显示问题,不过还是非常感谢楼主的帮助
走的更高,看的更远
级别: 骑士
UID: 219300
可可豆: 1311 CB
威望: 1049 点
在线时间: 159(时)
发自: Web Page
解决了 第一个方法 有效 感激不尽 多谢多谢
走的更高,看的更远
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
发自: Web Page
回 4楼(仅此而已) 的帖子
第一个方法的文件,我的版本是2.2.1的,没有那个函数啊
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
发自: Web Page
Re:解决&&动画在部分型号的安卓手机上播放会不正常的问题
FUCK,那个函数已经不在那个文件中了,在这里CCTextureAtlas *CCArmature::getTexureAtlasWithTexture(CCTexture2D *texture),这个函数里边有一个地方的调用&&&&if (atlas == NULL)&&&&{&&&&&&&&atlas = CCTextureAtlas::createWithTexture(texture, 32/*4*/);&&&&&&&&m_pTextureAtlasDic-&setObject(atlas, key);&&&&}
级别: 新手上路
UID: 312063
可可豆: 30 CB
威望: 29 点
在线时间: 32(时)
发自: iPad
第一个方法试了,比之前好一些,但是还是有缺一个胳膊或者缺个脸的情况
级别: 新手上路
可可豆: 61 CB
威望: 61 点
在线时间: 31(时)
发自: Web Page
您好,试了两种方法,貌似都没生效,我的问题是部分机型(目前小米1s)骨骼动画出现错乱,闪动的现象,求解!
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版Android 动画播放时退出或隐藏界面时报错 - CSDN博客
Android 动画播放时退出或隐藏界面时报错
在动画正在播放的时候(如果你的动画跟界面的坐标点有关),界面失去隐藏,或者失去了焦点,如果没有处理,就会报这个空指针异常。
复现场景:
自定义了一个父控件,然后里面有一些子控件在执行动画,动画是根据屏幕的宽高移动,这时候,拉下Android的状态栏,或者按home键,甚至退出程序,都会报一个空指针异常,异常如下图。
java.lang.NullPointerException
at android.animation.KeyframeSet.getValue(KeyframeSet.java:183)
at android.animation.PropertyValuesHolder.calculateValue(PropertyValuesHolder.java:660)
at android.animation.ValueAnimator.animateValue(ValueAnimator.java:1174)
at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1115)
at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1144)
at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:623)
at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:646)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:531)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
来看这个跟PropertyValuesHolder有关,但最终原因不确定。我是这么想的,View Animation 底层的动画执行过程依然跟Animator有关,所以在失去焦点后他便找不到坐标点了,所以他的过渡点便成了null。只是这么想,不知道对不对……
所以我在自定义控件的onVisibilityChanged()中,判断了是否是显示状态,如果是显示状态,就让他继续播放动画,否则我就执行动画的cancel(),方法使之先取消。
cancel方法:取消动画
【功能说明】该方法用于取消一个动画的执行。该方法是取得一个正在执行中的动画的主要方法。cancel方法和startNow方法结合可以实现对动画执行过程的控制。需要注意的是,通过cancel方法取消的动画,必须使用reset方法或者setAnimation方法重新设置,才可以再次执行动画。
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (visibility != VISIBLE){
View childAt = getChildAt(XXX);
Animation animation = childAt.getAnimation();
animation.cancel();
View childAt = getChildAt(XXX);
childAt.getAnimation().reset();
childAt.getAnimation().start();
本文已收录于以下专栏:
相关文章推荐
Android - 页面切换,动画播放,程序锁,Activity启动模式,利用内容观察者同步数据库变化
大家平时见到的最多的可能就是Frame动画了,Android中当然也少不了它。它的使用更加简单,只需要创建一个
AnimationDrawabledF对象来表示Frame动画,然后通过addFr...
开机画面是由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,如下所示:
service bootanim /sy...
Android开发之对Frame动画播放的补充
* Android开发之对Frame动画播放的补充
* 北京Android俱乐部群:
* Created...
Android图片动画播放(AnimationDrawable)
收藏该经验
Unity android客户端实现双击跳过动画播放首先说一下我们要实现的效果。在unity中播放动画时,当第一次点击屏幕会弹出一个“再次点击跳过视频播放”的提示。再次点击则跳过播放。
也是最近项目上...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)安卓动画开始,暂停和停止 - CSDN博客
安卓动画开始,暂停和停止
android 在3.0之前经常使用的tween animation在网上已经有人实现了动画的暂停效果,但是对于property animation的暂停尚未实现,由于项目需要,我将属性动画的暂停、停止、播放的三个操作整理如下
对于视图和属性动画的实例化和事件,请直接看代码
暂停animator首先要达到时间停止,把动画停留在某个时间点,继续播放的时候要从这个时间点继续执行。很幸运的是animator给U我们提供了setCurrentPlayTime的方法,但是这个方法只能让动画回到一个指定的时间点,然后继续执行,所以我们需要寻找一个机制,在动画到达下一个时间点之前,将动画的时间点重新设置到暂停的时间点。ValueAnimator提供了addUpdateListener的方法,我们定义一个AnimatorUpdateListener,在onAnimationUpdate中,调用setCurrentPlayTime回置到暂停的时间点即可。这个时候需要注意,直接调用setCurrentPlayTime会触发onAnimationUpdate会造成死循环,在这里需要使用CountDownTimer来调用setCurrentPlayTime来规避。
要暂停视图的状态就比较容易,同样我们在AnimatorUpdateListener中的onAnimationUpdate,做一些手脚。暂停的时候我们通过ValueAnimator.getAnimatedFraction(); 获取动画当前的状态值临时保存起来。并且在暂停的时候设置 停止状态的TimeInterpolator,在这个TimeInterpolator里面的getInterpolation方法我们直接返回之前临时保存的fraction,这样就能达到状态的暂停。
& && & 重新播放怎么办?
重新播放的时候我们要判断当前如果是暂停的状态,我们就需要将onAnimationUpdate中不再设置setCurrentPlayTime,同时去掉我们设置的暂停TimeInterpolator。
& && & 语言组织比较乱,还是直接上代码吧。
[mw_shl_code=java,true]& & & & TextV
& & & & Button btnP
& & & & Button btnS
& & & & Button btnP
& & & & ObjectA
& & & & static final int ID_BTN_PLAY=1001,ID_BTN_PAUSE=1002,ID_BTN_STOP=1003;
& & & & MyAnimatorUpdateListener updateListener = new MyAnimatorUpdateListener();
& & & & @Override
& & & & protected void onCreate(Bundle savedInstanceState) {
& & & & & & & & super.onCreate(savedInstanceState);
& & & & & & & & //初始化页面视图,以及增加事件***
& & & & & & & & LinearLayout container = new LinearLayout(this);
& & & & & & & & container.setOrientation(LinearLayout.VERTICAL);
& & & & & & & & container.setBackgroundColor(Color.rgb(192, 192, 192));
& & & & & & & &&
& & & & & & & & setContentView(container);
& & & & & & & &&
& & & & & & & & btnPlay = new Button(this);
& & & & & & & & btnPlay.setText(&播放&);
& & & & & & & & btnPlay.setId(ID_BTN_PLAY);
& & & & & & & & btnPlay.setOnClickListener(this);
& & & & & & & & container.addView(btnPlay);
& & & & & & & &&
& & & & & & & & btnPause = new Button(this);
& & & & & & & & btnPause.setText(&暂停&);
& & & & & & & & btnPause.setId(ID_BTN_PAUSE);
& & & & & & & & btnPause.setOnClickListener(this);
& & & & & & & & container.addView(btnPause);
& & & & & & & &&
& & & & & & & & btnStop = new Button(this);
& & & & & & & & btnStop.setText(&停止&);
& & & & & & & & btnStop.setId(ID_BTN_STOP);
& & & & & & & & btnStop.setOnClickListener(this);
& & & & & & & & container.addView(btnStop);
& & & & & & & &&
& & & & & & & & text = new TextView(this);
& & & & & & & & text.setText(&我是文本&);
& & & & & & & & container.addView(text);
& & & & & & & &&
& & & & & & & & animator = ObjectAnimator.ofFloat(text, &x&, 0f,200f);
& & & & & & & & animator.setRepeatCount(ValueAnimator.INFINITE);
& & & & & & & & animator.setDuration(2000l);
& & & & & & & & //为了增加
& & & & & & & & animator.addUpdateListener(updateListener);
& & & & @Override
& & & & public void onClick(View v) {
& & & & & & & & int id = v.getId();
& & & & & & & & switch(id){
& & & & & & & & case ID_BTN_PLAY:
& & & & & & & & & & & & //如果已经暂停,是继续播放
& & & & & & & & & & & & if(updateListener.isPause)updateListener.play();
& & & & & & & & & & & & //否则就是从头开始播放
& & & & & & & & & & & & else animator.start();
& & & & & & & & & & & &
& & & & & & & & case ID_BTN_STOP:
& & & & & & & & & & & & //如果点击停止,那么我们还需要将暂停的动画重新设置一下
& & & & & & & & & & & & updateListener.play();
& & & & & & & & & & & & animator.end();
& & & & & & & & & & & &
& & & & & & & & case ID_BTN_PAUSE:
& & & & & & & & & & & & updateListener.pause();
& & & & & & & & & & & &
& & & & & & & & }
& & & & class MyAnimatorUpdateListener implements AnimatorUpdateListener{
& & & & & & & & /**
& & & & & & & &&&* 暂停状态
& & & & & & & &&&*/
& & & & & & & & private boolean isPause =
& & & & & & & & /**
& & & & & & & &&&* 是否已经暂停,如果一已经暂停,那么就不需要再次设置停止的一些事件和***器了
& & & & & & & &&&*/
& & & & & & & & private boolean isPaused =
& & & & & & & & /**
& & & & & & & &&&* 当前的动画的播放位置
& & & & & & & &&&*/
& & & & & & & & private float fraction = 0.0f;
& & & & & & & & /**
& & & & & & & &&&* 当前动画的播放运行时间
& & & & & & & &&&*/
& & & & & & & & private long mCurrentPlayTime = 0l;
& & & & & & & &&
& & & & & & & & /**
& & & & & & & &&&* 是否是暂停状态
& & & & & & & &&&* @return
& & & & & & & &&&*/
& & & & & & & & public boolean isPause(){
& & & & & & & & & & & & return isP
& & & & & & & & }
& & & & & & & &&
& & & & & & & & /**
& & & & & & & &&&* 停止方法,只是设置标志位,剩余的工作会根据状态位置在onAnimationUpdate进行操作
& & & & & & & &&&*/
& & & & & & & & public void pause(){
& & & & & & & & & & & & isPause =
& & & & & & & & }
& & & & & & & & public void play(){
& & & & & & & & & & & & isPause =
& & & & & & & & & & & & isPaused =
& & & & & & & & }
& & & & & & & & @Override
& & & & & & & & public void onAnimationUpdate(ValueAnimator animation) {
& & & & & & & & & & & & /**
& & & & & & & & & & & &&&* 如果是暂停则将状态保持下来,并每个刷新动画的时间了;来设置当前时间,让动画
& & & & & & & & & & & &&&* 在时间上处于暂停状态,同时要设置一个静止的时间加速器,来保证动画不会抖动
& & & & & & & & & & & &&&*/
& & & & & & & & & & & & if(isPause){
& & & & & & & & & & & & & & & & if(!isPaused){
& & & & & & & & & & & & & & & & & & & & mCurrentPlayTime = animation.getCurrentPlayTime();
& & & & & & & & & & & & & & & & & & & & fraction = animation.getAnimatedFraction();
& & & & & & & & & & & & & & & & & & & & animation.setInterpolator(new TimeInterpolator() {
& & & & & & & & & & & & & & & & & & & & & & & & @Override
& & & & & & & & & & & & & & & & & & & & & & & & public float getInterpolation(float input) {
& & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & });
& & & & & & & & & & & & & & & & & & & & isPaused =&&
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & //每隔动画播放的时间,我们都会将播放时间往回调整,以便重新播放的时候接着使用这个时间,同时也为了让整个动画不结束
& & & & & & & & & & & & & & & & new CountDownTimer(ValueAnimator.getFrameDelay(), ValueAnimator.getFrameDelay()){
& & & & & & & & & & & & & & & & & & & & @Override
& & & & & & & & & & & & & & & & & & & & public void onTick(long millisUntilFinished) {
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & @Override
& & & & & & & & & & & & & & & & & & & & public void onFinish() {
& & & & & & & & & & & & & & & & & & & & & & & & animator.setCurrentPlayTime(mCurrentPlayTime);
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }.start();
& & & & & & & & & & & & }else{
& & & & & & & & & & & & & & & & //将时间拦截器恢复成线性的,如果您有自己的,也可以在这里进行恢复
& & & & & & & & & & & & & & & & animation.setInterpolator(null);
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & &&
本文已收录于以下专栏:
相关文章推荐
在一个界面有一连串动画,当某个动画开始时,其他所有动画都要消失,可是不管stop、cancel还是clearAnimation,甚至直接设置view.setVisibility(View.INVISI...
最近遇到一个需求,通过在GridView上改变焦点,并且GridView上每个item有一个隐藏的层,获取焦点之后,通过AlphaAnimation显示出来。
发现当duration大于...
项目中遇到的问题:
做一个
Android 实现可以暂停旋转的ObjectAnmition动画
本文主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果...
旋转180度后停止
rotate =new RotateAnimation(0f,180f,Animation.RELATIVE_TO_S...
调用clearAnimation()方法
前言:在我从C++转到Android时,就被Android里炫彩斑斓的自定义控件深深折服,想知道如果想利用C++实现这些功能,那是相当困难的。从那时候起,我就想,等我学会了自定义控件,一定要写一篇系列...
想要实现的功能是:单击动画控件时,能暂停/播放
功能非常简单,但实现起来却没想像中的那么简单,如果不用android的动画,而是自己用线程开始动画,这种方式可以实现,但不推荐
我这里采用的是O...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)