3

我有一个像 Merquee 一样从右到左的TranslateX动画的ImageButton ,所以它从右到左动画。现在,当我单击它时,什么也没发生。实际上单击不是执行,单击仅在imagebutton的实际位置上执行。

做什么建议?非常感谢...谢谢

4

3 回答 3

1

截至目前,改变 View 矩阵的 Animations只改变绘制视图的坐标,而不是 View 在 Layout 中的实际位置onDraw()因此,当调用该视图时,它只是一个画布变换。

因此,您可以setTranslationX(100)将视图向右绘制一个 100 像素。但是,点击区域 ( getHitRect()) 仍然在布局过程中分配给视图的同一位置。

或者,您实际上可以将视图放置在动画之后的位置,然后反向运行动画。

如果您想实际更改布局,则必须更改该视图LayoutParams并更改其宽度/高度/边距。然后你将不得不requestLayout()在每一帧动画上。

示例:这将为 FrameLayout 内视图的左边距设置动画:

  //---assuming animated view is a child of Framelayout---
   FrameLayout parent;
   View animatedChild;

    ValueAnimator animator = new ValueAnimator();
    animator.setFloatValues(0,parent.getWidth()); //--slide out to right--
    animator.setDuration(1000);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            FrameLayout.LayoutParams params = animatedChild.getLayoutParams();
            Float margin = (Float) valueAnimator.getAnimatedValue();
            params.leftMargin = margin.intValue();
            animatedChild.requestLayout();
        }
    });

    animator.start();
于 2014-01-18T06:44:29.547 回答
1

使用 ObjectAnimator(对于以后的版本,然后是 Honeycomb)对您的对象进行动画处理,您可以使用以下代码作为参考:

RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativeLayout1);
    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    ObjectAnimator mover = ObjectAnimator.ofFloat(layout, "translationX",
            width, -width);
    mover.setDuration(10000);
    mover.setRepeatMode(Animation.INFINITE);
    mover.setRepeatCount(Animation.INFINITE);
    mover.start();

如果您使用 Api 较低,那么 HoneyComb(如 Gingerbread)则使用此库: http: //nineoldandroids.com/

它将在我的设备中正常工作。

于 2014-01-18T08:23:23.760 回答
0

在开发我的android应用程序之前,我遇到了类似的问题。而且我发现动画在运行的时候,其实是在让图像层四处流动。所以你需要点击按钮的原始位置,这意味着如果按钮已经开始移动,你可能需要点击一个黑色的空间。

于 2014-01-18T05:37:16.017 回答