Android 4.4.2仅在完整Java代码动画期间在视图对象边界外创建黑色蒙版

真的需要一些帮助……

请使用完整的Java代码查看ImageView的这个简单的FadeIn动画。 使用API​​的21,18,17,16重新创建它。完美无缺。 现在尝试使用API​​ 19(android 4.4.2),创建有趣的蒙版(请参阅下面的解释):

public class _ExampleAnimationNotWorking extends Activity { Common common; // my own class to read assets FrameLayout fl; ImageView iv; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.common = new Common(this,this); this.fl = new FrameLayout(this); this.iv = new ImageView(this); FrameLayout.LayoutParams flparam = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT); LayoutParams lparam = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); iv.setImageBitmap(common.newImage("iv_image.png", ImageFormat.RGB565).getBitmap()); iv.setX(50); iv.setY(0); fl.addView(iv, lparam); this.setContentView(fl, flparam); AlphaAnimation animation = new AlphaAnimation(0,1); animation.setDuration(3000); iv.setAnimation(animation); // may skip frames if not used in API19 (thats another problem) iv.startAnimation(animation); } .... 

在动画期间,Android 4.4.2(API19)在ImageView大小边界之外创建一个黑色蒙版,从x / y坐标(0 + imageWidth / 0 + imageHeight)开始,所以如果你最初将图像放在那个坐标之外,你就不要看不到任何动画,只看到动画结尾处的原始图像。为了重新创建问题,我将图像放在x = 50中。 在Android 4.4.2动画期间,您会看到图像的右半边是黑色的。 您可以使用您喜欢的任何大小的屏幕设置来重新创建模拟器。

将“lparam”从WRAP_CONTENT更改为MATCH_PARENT或其他宽度/高度不是解决方案。 它应该与其他版本相同(注意我也在4.4.3和4.4.4中尝试它并且工作完美)。 这可能是4.4.2 java代码动画的一个错误,因为如果你使用XML方法,它在API19上工作得很好。 我需要一个解决方案或解决这个问题,因为我的整个项目都基于纯Java代码,并且不能将KitKat 4.4.2排除在项目的目标之外。

谢谢。

PD:>有些人在这里做什么? 可以纠正我的post,但为此我带了-2分? 不是我的问题的解决方案,如果我需要一些点来附加与此问题相关的图像,则更多。 谢谢CBredlow!

编辑:我需要上传解释此问题的图片,但由于它对新用户不太友好,只需点击此链接即可查看图片:

http://forum.xda-developers.com/showpost.php?p=56553476&postcount=2

解决了 !

出于某种原因,API19编程上纯的java动画在绝对设置中不能很好地发挥作用,比如setX()或setY()。 专家们可以看看这个。 API19可以在布局参数方面使用边距。

以下程序适用于android 4.4.2。 对于cource来说,它适用于其他版本,但你必须改变你的思维方式。 您必须使用布局参数以编程方式放置图像,因此请更改:

 iv.setX(50); iv.setY(0); 

 lparam.setMargins(50, 0, 0, 0); iv.setLayoutParams(lparam); iv.requestLayout(); 

你也可以使用(对于API> = 17)

 lparam.setMarginStart(50); // for x pos lparam.setMarginEnd(0); // for y pos 

您必须调用“requestLayout()”以确保在将视图添加到父级(fl)时提交布局上的新更改。

最后,我错误地使用“LayoutParams”而不是“FrameLayout.LayoutParams”。 这与问题没有任何关系,并没有影响它,但是正确的方法来定义它,所以改变:

 LayoutParams lparam = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

 FrameLayout.LayoutParams lparam = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); 

任何API的完整工作代码是:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Common common = new Common(this, this); FrameLayout fl = new FrameLayout(this); ImageView iv = new ImageView(this); FrameLayout.LayoutParams flparam = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); FrameLayout.LayoutParams lparam = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); iv.setImageBitmap(common.newImage("100x100.png", ImageFormat.RGB565).getBitmap()); lparam.setMarginStart(50); lparam.setMarginEnd(0); iv.setLayoutParams(lparam); iv.requestLayout(); fl.addView(iv); this.setContentView(fl, flparam); AlphaAnimation animation = new AlphaAnimation(0, 1); animation.setDuration(3000); iv.setAnimation(animation); iv.startAnimation(animation); }