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产品:>有些人来这里做什么?可以更正我的帖子,但是为此给我-2分?不能解决我的问题,如果需要附加一些与此问题相关的图像,还可以提供更多解决方案.谢谢CBredlow!

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

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

解决方法:

解决了 !

由于某些原因,API19以编程方式编写的纯Java动画在使用setX()或setY()这样的绝对设置时不能很好地播放.专家可以对此进行研究. API19倾向于在布局参数侧使用边距.

以下过程适用于android 4.4.2.当然,它可以上下使用其他版本,但是您必须改变思维方式.您必须使用布局参数以编程方式放置图像,因此请更改:

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);
}

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...