【问题标题】:Android 4.4.2 creates a black mask outside view object boundary, only during full Java code animationsAndroid 4.4.2 仅在完整的 Java 代码动画期间在视图对象边界外创建黑色蒙版
【发布时间】:2014-12-28 01:49:53
【问题描述】:

在这方面真的需要一些帮助...

请看一下这个简单的 ImageView 淡入淡出动画,使用完整的 java 代码。使用 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

【问题讨论】:

  • 由于问题指向实际主题的不同标题,我将创建这个新主题。原始主题位于:stackoverflow.com/questions/26679801/…。现在这是完美的,我希望获得一些积分来放置说明这个问题的图像,而我只是得到 -2..

标签: java android animation android-4.4-kitkat


【解决方案1】:

!解决了!

出于某种原因,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);
}

【讨论】:

  • 感谢您的提示。我想这是布局失效的问题,只有原始矩形(在 XML 中声明的位置)被重新绘制。我在使用 setTranslationX() 和 setTranslationY() 时遇到了同样的问题。使用边距也适用于我!
  • 真的很有帮助.. 谢谢
猜你喜欢
  • 2019-12-16
  • 2014-05-31
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
相关资源
最近更新 更多